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