【发布时间】:2012-06-01 15:15:10
【问题描述】:
操作员用于检查光谱,知道每个峰的位置和宽度,并判断光谱所属的片段。在新的方式中,图像由相机捕捉到屏幕上。并且必须以编程方式计算每个波段的宽度。
旧系统:分光镜 -> 人眼 新系统:分光镜 -> 相机 -> 程序
根据 X 轴的大致位置,计算每个波段的宽度的好方法是什么?鉴于这项任务过去可以通过眼睛完美执行,现在必须由程序执行?
对不起,如果我缺少细节,但它们很少。
生成上一个图表的程序列表;我希望它是相关的:
import Image
from scipy import *
from scipy.optimize import leastsq
# Load the picture with PIL, process if needed
pic = asarray(Image.open("spectrum.jpg"))
# Average the pixel values along vertical axis
pic_avg = pic.mean(axis=2)
projection = pic_avg.sum(axis=0)
# Set the min value to zero for a nice fit
projection /= projection.mean()
projection -= projection.min()
#print projection
# Fit function, two gaussians, adjust as needed
def fitfunc(p,x):
return p[0]*exp(-(x-p[1])**2/(2.0*p[2]**2)) + \
p[3]*exp(-(x-p[4])**2/(2.0*p[5]**2))
errfunc = lambda p, x, y: fitfunc(p,x)-y
# Use scipy to fit, p0 is inital guess
p0 = array([0,20,1,0,75,10])
X = xrange(len(projection))
p1, success = leastsq(errfunc, p0, args=(X,projection))
Y = fitfunc(p1,X)
# Output the result
print "Mean values at: ", p1[1], p1[4]
# Plot the result
from pylab import *
#subplot(211)
#imshow(pic)
#subplot(223)
#plot(projection)
#subplot(224)
#plot(X,Y,'r',lw=5)
#show()
subplot(311)
imshow(pic)
subplot(312)
plot(projection)
subplot(313)
plot(X,Y,'r',lw=5)
show()
【问题讨论】:
-
找到人眼无法区分颜色和背景的阈值。它应该是相当恒定的。然后,只需对您的数据点设置阈值,使人眼“看到”高于该阈值的数据点,然后对这些数据点进行聚类并找到每个聚类的宽度。
-
也许对曲线求导很容易找到峰值和斜率?条带的宽度不是很恒定吗?据我了解,振幅和位置会有所不同。
-
@Blender,你能详细说明你的观点吗?
-
本底噪声是否相当平坦?您如何(通过肉眼)确定什么是高峰,什么是太低?例如,大约 660-670 处的那个光点是双峰,还是不会被计算在内? 740 的时候呢?
-
@detly,我并不完全了解,但峰的位置会事先知道。是的,如果两个已知的山峰彼此太近,我会担心。
标签: python image-processing signal-processing