【问题标题】:Measuring shift between two images along one direction only仅沿一个方向测量两个图像之间的偏移
【发布时间】:2019-10-15 06:23:55
【问题描述】:

我必须测量两个单色图像之间的偏移。

这些图像实际上是校准前的光谱,非常嘈杂,充满了不需要的特征,但它们基本上看起来像下面

知道在不同的图像之间,它们会沿 x 方向移动,但不会沿 y 方向移动。我想知道它们之间沿 x 方向的偏移量。

幸运的是,我在skimageregister_translation 中找到了一个函数,可以用于任意亚像素精度。但问题是,我只想知道沿 x 方向的偏移,并且我希望得到的 y 方向偏移为 0,但程序发现同时向 x 和 y 偏移,大概是沿着垂直于特征。 (图中标注为蓝色箭头)

所以,我想知道:

  1. python 中是否有任何函数或包可以仅测量两个图像之间沿一个方向的偏移,或者甚至有任何先验知识?

  2. 找到两个嘈杂图像之间的偏移的正确方法是什么?在 FFT 空间中找到最大的互相关值会起作用吗?

【问题讨论】:

  • 使用 OpenCV 的一个想法是使用 minAreaRect() 为每个图像获取线条的单个轮廓,找到矩形的中心。那么有了这两点,你就可以找到跨国转移。如果您可以确定偏移始终在 x 方向上,这将起作用。
  • 感激不尽!我一直在寻找像素偏移,我终于找到了register_translation,谢谢你!它甚至还有亚像素偏移,哇!

标签: python image-processing scikit-image image-registration


【解决方案1】:

在这种情况下,如果register_translation 为您提供 xy 位移,无论是矢量形式还是分量形式,都应该进行一些简单的数学运算。如果不存在 y 偏移,您可以计算所需的 x 移动,这正是您想要的。我正在旅行,所以很遗憾现在不能给你图表,建议把三角形画出来。

所需的额外 x 班次 (x_extra) 定义为:

x_extra = y * tan[arctan(y_shift/x_shift)]

简化为:

x_extra = y_shift^2 / x_shift

因此,x 的总位移为:

x_shift_total = x_shift + x_extra

register_translation 提供给您的 x_shift。

如果您随后将imageA 移动x_shift_total,它应该与imageB 对齐,假设register_translation 给出的x_shift 是正确的。

@jni 我很想在register_translation 中将其作为一个选项来实现!

【讨论】:

    【解决方案2】:

    我不肯定它会起作用,但是:开源的好处之一是您可以查看register_translationimplementation details,然后尝试根据您的情况调整它。在您的情况下,我会将fftn 替换为fftn(..., axis=1),以便您只计算沿列轴的fft。然后,将两个 FFT 信号相乘(这相当于每行的卷积,如 @CypherX 所建议的那样)。最后,您必须找到一种方法将沿每条线发现的变化“合并”为单个测量值。一个想法是采取每个班次(沿该线的最大值)并绘制直方图。人们希望你能在真正的 x 位移附近获得一个尖峰。

    如果可行,将“轴”关键字参数添加到register_translation 将是对 scikit-image 的一个相当大的贡献。您可以阅读how to contribute guide 并提出相应的更改!

    【讨论】:

    • 这是正确的方法,IMO。我会使用为每条线估计的班次的中位数。
    【解决方案3】:

    另一种更快、更简单的方法是计算两个图像中相同位置的水平轮廓。这将为您提供每个图像水平的一维轮廓。简单的峰值查找将为您提供线条的位置,峰值索引之间的差异将告诉您仅在 x 轴上的偏移。

    我经常使用这种方法来进行与您的问题类似的移位检测,它非常快速、非常简单且非常健壮。

    # pick a row to use
    row = 10
    x_profile1 = np.mean(image1[row, :], axis=0)
    x_profiel2 = np.mean(image2[row, :], axis=0)
    
    # 'get_peaks' is a function to return indices of found peaks - several
    # around
    peaks1 = get_peaks(x_profile1)
    peaks2 = get_peaks(x_profile2)
    
    x_shift = peaks1[0] - peaks2[0]
    

    【讨论】:

      【解决方案4】:

      方法一

      您可以在两个图像之间使用 convolution 来查找您在哪里获得maximum。您可以将其设想为将未移位的图像从左向右滑动到移位的图像上,并且当每个图像的相同部分彼此重叠时,卷积将产生对应于场景的最大值。查看scipy.ndimage.convolutionscipy.signal.convolve,看看哪个更适合您的需求。

      方法-2

      1. 另一方面,您可以从每个图像中获取水平切片并找到峰值的位置(假设黑色条带为 1,白色区域为 0)。
      2. 计算每个图像中这些峰的质心。找到这些质心位置之间的差异,这就是您正在寻找的转变。
      3. 为了稳健性,您可以将其应用于图像对的不同行,所有此类差异的平均值将是衡量水平偏移的统计上更可行的结果。

      【讨论】:

        猜你喜欢
        • 2023-03-15
        • 2022-08-17
        • 2019-10-22
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        • 1970-01-01
        • 2021-10-02
        • 2013-11-02
        相关资源
        最近更新 更多