我尝试使用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 rot(IFF1).*(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。在这种情况下,结果也令人困惑。在
如有任何帮助,我们将不胜感激:)
谢谢!在
大卫
目前没有回答
相关问题 更多 >
编程相关推荐