对数极坐标相位相关 Log-Polar Phase Correlation

它解决的问题是:

普通 Phase Correlation 只能求

但在工业视觉里经常遇到:

平移 + 旋转 + 缩放

例如:

  • 晶圆对准

  • 图像拼接

  • 遥感配准

  • 机器人视觉定位

Log-Polar 方法可以求:

一、核心思想

关键技巧:

把旋转和缩放转换成平移问题

步骤:

原图

FFT

幅度谱

Log-Polar变换

Phase Correlation

得到旋转 + 缩放

然后再求:

平移

二、数学原理

假设两幅图像

三、傅里叶变换性质

有一个重要性质:

旋转

如果图像旋转:

缩放

如果

四、极坐标变换

五、Log-Polar变换

为了处理 缩放

六、完整算法流程

工业系统流程:

图像1 图像2

↓ ↓

FFT FFT

↓ ↓

取幅度谱

Log-Polar变换

Phase Correlation

得到

旋转θ

缩放s

逆旋转 + 逆缩放

再做一次 Phase Correlation

得到平移(dx,dy)

七、实现

HALCON实现思路

HALCON没有直接函数,但可以组合:

fft_image

complex_to_real

polar_trans_image

phase_correlation_fft

流程:

FFT(Image1)

FFT(Image2)

complex_to_real

polar_trans_image (log)

phase_correlation_fft

OpenCV工业实现

OpenCV已经提供:

warpPolar()

流程:


C++代码

复制代码
Mat img1,img2;

Mat f1,f2;
dft(img1,f1);
dft(img2,f2);

magnitude(f1,f1);
magnitude(f2,f2);

Mat lp1,lp2;

warpPolar(f1,lp1,Size(256,256),
center,maxRadius,
WARP_POLAR_LOG);

warpPolar(f2,lp2,Size(256,256),
center,maxRadius,
WARP_POLAR_LOG);

Point2d shift = phaseCorrelate(lp1,lp2);

得到:

rotation

scale

Matlab

cpp 复制代码
1 生成测试图像
clc
clear

img = im2double(imread('cameraman.tif'));

theta = 20;   % 旋转角
scale = 1.2;  % 缩放

img2 = imrotate(img,theta,'bilinear','crop');
img2 = imresize(img2,scale);
img2 = img2(1:256,1:256);
2 FFT
F1 = fftshift(fft2(img));
F2 = fftshift(fft2(img2));

M1 = abs(F1);
M2 = abs(F2);
3 Log-Polar变换
lp1 = logpolar(M1);
lp2 = logpolar(M2);
4 Phase Correlation
R = fft2(lp1).*conj(fft2(lp2));
R = R ./ abs(R);

r = ifft2(R);

[maxv,idx] = max(r(:));
[y,x] = ind2sub(size(r),idx);

disp([x y])

为什么 Phase Correlation 可以做到亚像素?

参数 精度
旋转 0.01°
缩放 0.001
平移 0.01 pixel

八、为什么 Phase Correlation 的峰值一定出现在真实位移位置?

Phase Correlation 为什么一定在真实位移处出现峰值 做一个完整数学推导 + 直观理解 + 离散FFT解释

这个推导在 图像配准 / 半导体视觉 / 算法岗位面试里非常经典。

问题定义

傅里叶平移定理

二维傅里叶变换:

互功率谱

定义 互功率谱

代入平移公式

归一化

反傅里叶变换

δ函数含义

δ函数:

只有一个位置是最大值

图像形式:

0 0 0 0 0

0 0 0 0 0

0 0 1 0 0 ← peak

0 0 0 0 0

0 0 0 0 0

峰值位置:

因此:

峰值位置 = 图像平移

这就是 Phase Correlation 的数学证明

几何直观理解

可以这样理解:

图像2只是图像1平移:

pattern → shift

频域:

F(u,v)

G(u,v)

两者相位差:

Δφ = 2π(uΔx + vΔy)

所有频率都会产生同样的 相位斜坡

当我们做:

IFFT

这些相位叠加:

constructive interference

在真实位移位置产生:

一个尖峰

离散FFT解释

相关推荐
Larcher14 分钟前
当 AI 学会写代码:一个自动生成 React 项目的 Agent 实战
人工智能·设计模式·程序员
m0_4665252917 分钟前
东软医疗光子 CT 实现国产高端影像从跟跑到领跑
人工智能
智能体与具身智能39 分钟前
TVA 本质内涵与核心特征(系列)
人工智能·python·智能体视觉
澹锦汐43 分钟前
AI 创意画板:生成按钮之前,先设计可撤销的创作过程
人工智能
邵宇然44 分钟前
计算图优化的编译器视角:AI 推理引擎的算子融合与内存布局重构
人工智能
中微极客1 小时前
KoMA:基于知识驱动的多智能体LLM自动驾驶框架深度解析
人工智能·机器学习·自动驾驶
Imagination官方博客1 小时前
边缘AI处理器的架构创新
人工智能·架构·gpu算力
我是谁??1 小时前
AI Movie Studio —— 一个面向电影、电视剧、动漫、短剧的 Agent 化影视理解与自动解说平台
人工智能
@蔓蔓喜欢你1 小时前
AI 辅助智能组件生成:从设计稿到可运行代码的工程化实践
人工智能·ai