图像投影的采样率更高

时间:2012-06-13 06:33:16

标签: python image image-processing

我的软件应该判断频谱带,并根据频段的位置,找到频段的峰值点和宽度。

enter image description here

我学会了projection of the imagefind 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()

2 个答案:

答案 0 :(得分:7)

您要做的是interpolation。 Scipy有一个插值模块,针对不同的情况提供了大量不同的函数,看看here,或专门用于图像here

Here是最近提出的问题,其中包含一些示例代码,以及显示所发生情况的图表。

但重要的是要认识到插值不会使您的数据更准确,因此在这种情况下它无法帮助您。

如果您想要更准确的结果,则需要更准确的数据。没有其他方法。您需要从更高分辨率的图像开始。 (如果您重新取样或插值,结果将非常 >准确!)

更新 - 问题已更改

@Hooked提出了一个很好的观点。考虑它的另一种方法是,不是立即平均(这会丢掉数据中的方差),而是可以从光谱图像中的每个水平行生成40个图形(如发布图像中的较低图形),所有这些图表将非常相似,但峰值位置,高度和宽度会有一些变化。您应该计算这40个图像中每个图像中每个峰值的位置,高度和宽度,然后合并这些数据(匹配40个图形中的峰值),并使用适当的方差作为误差估计(峰值位置,高度) ,和宽度),使用中心极限定理。这样您就可以充分利用数据。但是,我认为这假设谱图中的每一行之间存在某种独立性,这可能是也可能不是这样?

答案 1 :(得分:2)

我想为@ fraxel的答案提供一些更多的细节(以便发表评论)。他是对的,你不能得到任何更多的信息而不是你投入的信息,但我认为它需要一些细化......

  1. 您正在从1600x40 -> 1600投射您的数据似乎,就像您扔掉一些数据一样。虽然技术上是正确的,但投影的整个要点是将更高维度的数据带到更低的维度。这才有意义......
  2. 您的数据可以在较低维度中充分表示。如果我错了,请纠正我,但看起来您的数据确实是一维的,垂直轴是x轴上特定点(波长?)的可变性的度量。
  3. 鉴于投影有意义,我们如何才能最好地总结每个特定波长点的数据? In my previous answer,您可以看到我为每个点取了平均值。在没有关于系统特定属性的其他信息的情况下,这是合理的一阶近似。
  4. 如果您愿意,可以保留更多信息。下面我绘制了沿y轴的方差。这告诉我,当信号较高时,您的测量值会有更多的变化,而当信号较低时,您的测量值会变化较小(这似乎很有用!): enter image description here
  5. 它们在物理上意味着什么,而你作为研究人员的工作就是以有意义的方式解释和投射数据!
  6. 产生图像的代码如下,规格。数据来自原始帖子的屏幕截图:

    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()
    
相关问题