如何通过2个图像的相位相关性(使用fft)确定旋转角度?在http://en.wikipedia.org/wiki/Phase_correlation中给出的算法返回线性移位,而不是角度。它还提到图像必须转换为对数极坐标来计算旋转。这个转换是如何在python中实现的?和转换后做相同的步骤的算法举行?相位相关
Q
相位相关
5
A
回答
4
登录极性变换实际上是旋转和尺度不变..旋转对应于y轴的移位和缩放对应于x轴移位在数极坐标变换
所以简单的步骤是寻找在图像x如下图像Y:在图像Y
查找图像x(直角坐标系中使用阶段的相关性)
计算日志x和y的极性变换(这是一个整体的其他问题,请参考s),请确保以两张图像中的相同特征为中心。
x和y的查找FFT,说F(X)和F(Y)的F
查找相位相关(x)和F(y)时,调用它ř
查找R的IFFT(反FFT)。R的峰值对应于Y轴上的旋转偏差和X轴上与原始图像的缩放偏差。
参考文献:
2
我一直在努力了一段时间同样的问题。我在周末写这篇文章。这不是最干净的代码,但我只是一个物理学家,而不是程序员...
相位相关本身很简单:使用您最喜欢的卷积算法来卷积两幅图像。峰值位置为您提供旋转/缩放比例差异。它很好地解释了维基百科(在问题中提到的链接)。
我的问题是我找不到一个好的对数极坐标转换器,所以我写了一个。这不是傻瓜式的,但它完成了工作。任何人都愿意重写它,使其更清晰,请这样做!
import scipy as sp
from scipy import ndimage
from math import *
def logpolar(input,silent=False):
# This takes a numpy array and returns it in Log-Polar coordinates.
if not silent: print("Creating log-polar coordinates...")
# Create a cartesian array which will be used to compute log-polar coordinates.
coordinates = sp.mgrid[0:max(input.shape)*2,0:360]
# Compute a normalized logarithmic gradient
log_r = 10**(coordinates[0,:]/(input.shape[0]*2.)*log10(input.shape[1]))
# Create a linear gradient going from 0 to 2*Pi
angle = 2.*pi*(coordinates[1,:]/360.)
# Using scipy's map_coordinates(), we map the input array on the log-polar
# coordinate. Do not forget to center the coordinates!
if not silent: print("Interpolation...")
lpinput = ndimage.interpolation.map_coordinates(input,
(log_r*sp.cos(angle)+input.shape[0]/2.,
log_r*sp.sin(angle)+input.shape[1]/2.),
order=3,mode='constant')
# Returning log-normal...
return lpinput
警告:此代码是为灰度图像设计的。通过在每个单独的颜色框上循环使用map_coordinates()
,它可以很容易地适应于处理彩色图像。
编辑:现在,执行关联的代码很简单。在将脚本导入这两个图像作为image
和target
,请执行下列操作:
# Conversion to log-polar coordinates
lpimage = logpolar(image)
lptarget = logpolar(target)
# Correlation through FFTs
Fcorr = np.fft.fft2(lpimage)*np.conj(np.fft.fft2(lptarget))
correlation = np.fft.ifft2(Fcorr)
数组correlation
应包含一个峰,坐标尺寸差和角度差。此外,而不是使用FFT的,你可以简单地使用numpy的的np.correlate()
功能:
# Conversion to log-polar coordinates
lpimage = logpolar(image)
lptarget = logpolar(target)
# Correlation
correlation = np.correlate(lpimage,lptarget)
1
下面是一个实现:http://www.lfd.uci.edu/~gohlke/code/imreg.py.html。我发现需要0.035秒才能找到两个128x128图像之间的相似度。
相关问题
- 1. Open Cv相位相关
- 2. 相位相关使用FFTW
- 3. C位操作相关位
- 4. 相关地图位置
- 5. em单位的相关性?
- 6. 有关位相关主题的测验
- 7. 相关
- 8. 相关
- 9. 相关
- 10. 相关
- 11. ,相关
- 12. 相关
- 13. 是否有可用于Python的图像相位相关库?
- 14. 浮动如何与绝对和相对div定位相关?
- 15. 自相关和移位向量
- 16. 与定位相关的问题
- 17. 如何测试数学相关单位?
- 18. 位置和相关映像文件
- 19. wordpress类似/相关的职位标题
- 20. jsprit VRP相关职位hard Contraint
- 21. 使用matlab的高相关位置
- 22. 工作单位相关知识库
- 23. 与位置相关的BSP树遍历?
- 24. 与self.view相关的游标位置
- 25. 位置固定相关的父容器
- 26. 如何关闭相对定位?
- 27. UIView的定位相关的问题(IOS)
- 28. Android - TranslateAnimation与图像位置相关
- 29. 按相关模型排序的位置
- 30. Drupal 6:使用视图相关“位置”
你可以发布完整的源代码(不仅是logpolar)吗? – mrgloom 2012-12-13 07:23:13
对不起,我迟到了一段时间......我正在编辑我的答案。 – PhilMacKay 2013-01-25 17:14:47
嘿菲尔,我试着运行你的函数,但我得到一个运行时错误。你介意帮我吗? http://stackoverflow.com/questions/16654083/ – 2013-05-20 16:40:02