【发布时间】:2016-07-26 11:02:09
【问题描述】:
我有一张深色图像(原始格式),并绘制了图像和图像的分布。如您所见,16 点有一个高峰,请忽略它。我想通过这个直方图拟合高斯曲线。我用这种方法来适应: Un-normalized Gaussian curve on histogram。然而;我的高斯拟合永远不会接近它应该是的。将图像转换为正确的绘图格式是我做错了什么,还是有其他问题?
这是我用来生成这些数据的当前代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def fitGaussian(x,a,mean,sigma):
return (a*np.exp(-((x-mean)**2/(2*sigma))))
fname = 'filepath.raw'
im = np.fromfile(fname,np.int16)
im.resize([3056,4064])
plt.figure()
plt.set_cmap(viridis)
plt.imshow(im, interpolation='none', vmin=16, vmax=np.percentile(im.ravel(),99))
plt.colorbar()
print 'Saving: ' + fname[:-4] + '.pdf'
plt.savefig(fname[:-4]+'.pdf')
plt.figure()
data = plt.hist(im.ravel(), bins=4096, range=(0,4095))
x = [0.5 * (data[1][i] + data[1][i+1]) for i in xrange(len(data[1])-1)]
y = data[0]
popt, pcov = curve_fit(fitGaussian, x, y, [500000,80,10])
x_fit = py.linspace(x[0], x[-1], 1000)
y_fit = fitGaussian(x_fit, *popt)
plt.plot(x_fit, y_fit, lw=4, color="r")
plt.xlim(0,300)
plt.ylim(0,1e6)
plt.show()
编辑:(回复 Reblochon Masque)
【问题讨论】:
-
我不完全确定我理解你在做什么,但似乎你可能想要消除直方图上 20 左右的尖峰
-
@ReblochonMasque 即使我在 16 处消除了垃圾箱。我得到了类似的结果,它只是向右移动。查看我的编辑。
-
我猜你得到这条曲线是因为你将 Gaußian 拟合到所有的 bin 中,其中大部分是零。您可以仅将曲线拟合到非零 bin,但这很麻烦。
-
已经更好了...好建议 kazemakase;检查它的一种简单方法可能是减少垃圾箱的数量,以便所有都有值(尝试使用 5-8 可能吗?)
标签: python matplotlib curve-fitting data-fitting