文章目录
- 打开图像
- 默认图像
光斑处理:python处理高斯光束的图像
光斑处理系统:程序框架
打开图像
光斑图像的本质是光强在空间中的分布,而有的时候,通过CCD拍到的图像往往存成虚假的RGB格式,所以在打开图像时,需要判断其维度,如果有多个通道,需要将其转换为单个通道的灰度图像。
在我们的框架中,img_open实现打开图像的功能,考虑到在打开图象时需要进行文件交互,所以引入文件对话框。下面代码就是对img_open的实现,需要注意,这是一个类的方法,复制到类中时需要注意缩进。
from tkinter.filedialog import askopenfilename# class AnaFacula():
# ...def img_open(self):name = askopenfilename(title="请打开图片")if name=="":returnimg = plt.imread(name).astype(float)if len(img.shape)==3:img = img[:,:,0]self.oriImg = imgself.img = img + 0self.imgShow()
其中,self.oriImg是原图,self.img是经过处理后的图像,之所以加上一个0,目的是实现深拷贝的效果,使之与self.oriImg指向不同的内存区域。
点击开始按钮,效果如下
默认图像
在打开软件的时候,图窗中有一张默认图片,目前这张图片并不是光斑,而是通过随机数生成的一个噪声。
为了让这个程序更加友好,初始化时最好显示一张可供处理的光斑图像,一种比较简单的方案,就是直接将图像的相对路径引入初始化函数,但这样做有个问题,即对程序打包之后,这张图片就需要作为程序包外面的单个文件,很容易遗失,使得程序中的相对路径失效,进而导致程序崩溃。
一种比较优雅的方式,是将图像的数据封装到一个.py文件中,然后通过import的方式导入。
为此,最简单的方法,就是打开一张图像后,将其所有数值打印出来,为其赋予一个变量之后,再存储为文件。
import matplotlib.pyplot as pltpath = 'test.bmp'def saveImgAsTxt(path):img = plt.imread(path).astype(int)if len(img.shape)==3:img = img[:,:,0]ds = []for row in img:data = ','.join([str(c) for c in row])ds.append(f"[{data}]")s = 'backImg = [' + ',\n'.join(ds) + ']'with open('backImg.py', 'w') as f:f.write(s)saveImgAsTxt(path)
其内容大致如下
打眼看去,基本每一行都是 3 , 3 , 3 , 3 , ⋯ 3,3,3,3,\cdots 3,3,3,3,⋯,或者偶尔有一些 4 4 4,这些都是图像的背底。
接下来修改self.oriImg的初始化方法
from backImg import backImgclass AnaFacula():def __init__(self):# 中间代码省略# 初始化图像self.oriImg = np.array(backImg, dtype=float)self.img_ori()
从而打开软件后,显示情况如下