2

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

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

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

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

所以,我想知道:

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

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

4

4 回答 4

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

x_shift 由register_translation.

如果你然后移动imageAx_shift_total它应该与 对齐imageB,假设x_shift给定的register_translation是正确的。

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

于 2019-11-07T15:14:30.250 回答
1

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

如果它有效,它将对 scikit-image 添加一个“轴”关键字参数到register_translation. 您可以阅读如何贡献指南并提出相应的更改!

于 2019-10-15T23:30:14.350 回答
1

另一种更快、更简单的方法是计算两个图像中相同位置的水平轮廓。这将为您提供每个图像水平的一维轮廓。简单的峰值查找将为您提供线条的位置,峰值索引之间的差异将告诉您仅在 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]
于 2019-11-15T21:29:57.607 回答
0

方法一

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

方法二

  1. 另一方面,您可以从每个图像中获取水平切片并找到峰值的位置(假设黑色条带为 1,白色区域为 0)。
  2. 计算每个图像中这些峰值的质心。找到这些质心位置之间的差异,这就是您正在寻找的转变。
  3. 为了鲁棒性,您可以将其应用于图像对的各个行,并且所有此类差异的平均值对于测量水平偏移而言将是更具统计可行性的结果。
于 2019-10-15T06:41:24.217 回答