我的软件应该判断频谱带,并根据频段的位置,找到频段的峰值点和宽度。
我学会了projection of the image和find width of each peak。
但我需要更好的方法来查找投影。
我使用的方法将1600像素宽的图像(例如1600X40)缩小为1600长的序列。理想情况下,我希望使用相同的图像将图像缩小为10000个长的序列。
我想要更长的序列,因为1600点也提供低分辨率。单个点会导致较大的差异(如果从18到19判断一个波段,则存在4%的差异)。
如何从同一张图片中获得更长投影?
我使用的代码:https://stackoverflow.com/a/9771560/604511
import Image
from scipy import *
from scipy.optimize import leastsq
# Load the picture with PIL, process if needed
pic = asarray(Image.open("band2.png"))
# 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()
答案 0 :(得分:7)
您要做的是interpolation。 Scipy有一个插值模块,针对不同的情况提供了大量不同的函数,看看here,或专门用于图像here。
Here是最近提出的问题,其中包含一些示例代码,以及显示所发生情况的图表。
但重要的是要认识到插值不会使您的数据更准确,因此在这种情况下它无法帮助您。
如果您想要更准确的结果,则需要更准确的数据。没有其他方法。您需要从更高分辨率的图像开始。 (如果您重新取样或插值,结果将非常 >准确!)
更新 - 问题已更改
@Hooked提出了一个很好的观点。考虑它的另一种方法是,不是立即平均(这会丢掉数据中的方差),而是可以从光谱图像中的每个水平行生成40个图形(如发布图像中的较低图形),所有这些图表将非常相似,但峰值位置,高度和宽度会有一些变化。您应该计算这40个图像中每个图像中每个峰值的位置,高度和宽度,然后合并这些数据(匹配40个图形中的峰值),并使用适当的方差作为误差估计(峰值位置,高度) ,和宽度),使用中心极限定理。这样您就可以充分利用数据。但是,我认为这假设谱图中的每一行之间存在某种独立性,这可能是也可能不是这样?
答案 1 :(得分:2)
我想为@ fraxel的答案提供一些更多的细节(以便发表评论)。他是对的,你不能得到任何更多的信息而不是你投入的信息,但我认为它需要一些细化......
1600x40 -> 1600
投射您的数据似乎,就像您扔掉一些数据一样。虽然技术上是正确的,但投影的整个要点是将更高维度的数据带到更低的维度。这才有意义...... 产生图像的代码如下,规格。数据来自原始帖子的屏幕截图:
import Image
from scipy import *
from scipy.optimize import leastsq
# Load the picture with PIL, process if needed
pic = asarray(Image.open("spec2.png"))
# Average the pixel values along vertical axis
pic_avg = pic.mean(axis=2)
projection = pic_avg.sum(axis=0)
# Compute the variance
variance = pic_avg.var(axis=0)
from pylab import *
scale = 1/40.
X_val = range(projection.shape[0])
errorbar(X_val,projection*scale,yerr=variance*scale)
imshow(pic,origin='lower',alpha=.8)
axis('tight')
show()