"使用开放原始数据的旋转注册的阶段相关性"

2024-04-25 09:57:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用opencv注册两个图像,它们是彼此的旋转和翻译版本。一般来说,过程是(伪码):

a.如果1=FFT2(I1);IF2=FFT2(I2

b.R\u翻译=(IF1).*(IF2\u共轭

c.R\u翻译=R\u翻译/abs(R\u翻译

d.r\u翻译=IFFT2(r\u翻译

其中,r\u翻译的最大值对应于翻译。继续计算旋转,abs值删除平移部分

e.IF1=abs(IF1);IF2=abs(IF2

转换为线性极坐标

f.IF1_abs_pol=LINPOL(IF1_abs);IF2_abs_pol=LINPOL(IF2_abs

f.IFF1=FFT2(IF1-abs\u-pol);IFF2=FFT2(IF2-abs\u-pol

f.R\u rotIFF1).*(IFF2共轭

c.R\u rot=R\u rot/abs(R\u rot

d.r\u rot=IFFT2(r\u rot

其中r_rotationn的最大值对应于旋转。而仅对于平移,cv2.phaseCorrelate函数返回预期结果,对于旋转,它返回奇数结果。所以我尝试了以下方法。在

我拿了两个数字阵列-s 5x5,它们是彼此的旋转版本,如下所示:

a = numpy.array([[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]])
a = a.astype('float')/a.astype('float').max()
b = numpy.array([[5, 5, 5, 5, 5], [4, 4, 4, 4, 4], [3, 3, 3, 3, 3], [2, 2, 2, 2, 2], [1, 1, 1, 1, 1]])
b = b.astype('float') / b.astype('float').max()

首先我自己计算了相位相关性:

^{pr2}$

计算FFT,取绝对值(如果存在,将丢失平移差分数据),然后切换到线性极坐标并进行规格化:

a_polar = cv2.linearPolar(numpy.abs(numpy.fft.fft2(a)), (center_x, center_y), Mvalue, cv2.WARP_FILL_OUTLIERS)
b_polar = cv2.linearPolar(numpy.abs(numpy.fft.fft2(b)), (center_x, center_y), Mvalue, cv2.WARP_FILL_OUTLIERS)
a_polar = a_polar/a_polar.max()
b_polar = b_polar / b_polar.max()

另一个FFT步骤,逐点相乘,然后返回IFFT:

aff = numpy.fft.fft2(a_polar)
bff = numpy.fft.fft2(b_polar)

R = aff * numpy.ma.conjugate(bff)
R = R / numpy.absolute(R)
r = numpy.fft.ifft2(R).real
r = r/r.max()

收益率, Phase correlation for rotation, b with respect to a

根据cv2.linearPolar(),行、跨距角度(在本例中,步长为360/5=72度),列跨越半径(从0到Mvalue中给定的最大半径)。最大值出现在最后一行(相当于大约-90度的偏移)。到现在为止,一直都还不错。。在

第二种方法是直接使用cv2.phaseCorrelate()

r_direct = cv2.phaseCorrelate(a_polar, b_polar)

产生了

Phase correlation for rotation, b with respect to a direct method

第一个元组是X,Y相关系数(以像素为单位?)第三个数字是合适的分数。当它接近统一时,相关系数更好地代表数据(最大值周围的斑点更明显)。在

除了结果不够明显(为什么?),结果令人困惑。。。在

一般来说,这个5x5示例中的第一个FFT处理是不必要的。如果旋转是唯一的干扰,可以立即切换到线性极坐标并使用cv2.phaseCorrelate。在这种情况下,结果也令人困惑。在

如有任何帮助,我们将不胜感激:)

谢谢!在

大卫


Tags: fftnumpyabsfloatcv2maxpolarastype