演算子位置と各ピークの幅を知って、スペクトルを調べるために使用され、スペクトルが属するピースを判断します。新しい方法では、画像がカメラによってスクリーンにキャプチャされます。そして、各バンドの幅はプログラム的に計算されなければならない。
旧システム:分光器 - >人間の目 新システム:分光器 - >カメラ - >プログラム
に良い方法は各バンドの幅を計算している何が、彼らのおおよその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
山と坂を簡単に見つけるためにカーブの派生を取るかもしれませんか?バンドの幅はかなり一定ではありませんか?私がそれを理解するにつれて変化する振幅と位置です。 –
@Blender、あなたはあなたの要点を詳述できますか? – aitchnyu