文章目录
- 光斑分布
- 峰值和均值
- 三维分布
光斑处理:python处理高斯光束的图像
光斑处理系统:程序框架🌟打开图像🌟参数对话框/伪彩映射🌟裁切ROI
光斑分布
光斑作为图像而言,其表现能力是有限的,因为相比于其形状,我们有时更关心其强度。而为了表现其强度,则有许多种不同的方案
- ‘cross’ 对每行或者每列挑选出峰值位置和行列的均值,作为其代表性的数据
- ‘3d’ 直接把强度作为第三个维度,绘制三维的光斑数据
- ‘deg’ 用过质心的线段对光斑进行等分,并得到每条线段上光斑的强度分布
- ‘click’ 点击两点连线,并显示这条线上的强度分布
其中,click模式与之前图像切割时需要用到相同的交互,故放在一起实现;而deg模式涉及到比较复杂的插值过程,所以下面先实现前两种模式。
峰值和均值
根据上述几种模式,可设置下面三个参数,表示分布模式、起始角度和角度分割数。
def init_param(self):
# 前面省略
# 光斑分布
self.distriPara = {
"mode":"cross",
"stDeg":0,
"numDeg":4
}
而光斑分布的整体框架如下
def img_distri(self):
flag, distriPara = inputValue(self.distriPara)
if not flag:
return
for key in distriPara:
if key != None:
self.distriPara[key] = distriPara[key]
if distriPara['mode'] == 'cross':
self.drawCross()
elif distriPara['mode'] == "3d":
self.drawPlot3D()
elif distriPara['mode'] == "deg":
self.drawPlotDeg()
对于cross模式而言,起始并不需要参数,只需求得水平方向和竖直方向的最大值和均值即可,相应地绘图函数如下
def drawCross(self):
datas = {
"xMax": np.max(self.img, 0),
"yMax": np.max(self.img, 1),
"xMean": np.mean(self.img, 0),
"yMean": np.mean(self.img, 1)
}
self.fig.clf()
for i,key in enumerate(datas,1):
ax = self.fig.add_subplot(2,2,i)
ys = datas[key]
ax.plot(np.arange(len(ys)), ys, label=key)
ax.legend()
self.canvas.draw()
结果如下
三维分布
画出一个光斑的三维分布,要远比想象中更简单,只需一个函数就可以轻松做到
def drawPlot3D(self):
m,n = self.img.shape
xAxis,yAxis = np.indices([n,m])
self.fig.clf()
ax = self.fig.add_subplot(111, projection='3d')
ax.plot_surface(xAxis,yAxis,self.img)
self.canvas.draw()
其中 m , n m,n m,n是图像尺寸,xAxis, yAxis是坐标轴网格,在清楚现有图像后,新建一个三维坐标轴,并将图像灰度以三维形式展示出来,效果如下。