对数极坐标相位相关 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解释

相关推荐
hui-梦苑3 分钟前
[GROMACS]模拟数据分析前轨迹文件生成-轨迹预处理
人工智能·算法·数据分析
龙文浩_4 分钟前
AI深度学习/PyTorch/神经网络相关
人工智能·pytorch·深度学习
飞翔的SA6 分钟前
MLX‑VLM :Mac本地跑通多模态大模型的开源项目!让图片、音频、视频理解一键上手
人工智能·python·macos·音视频
王忘杰9 分钟前
Claude Code 通过 CC Switch 使用OpenRoute免费模型和国产大模型 qwen/qwen3.6-plus:free
人工智能
Jp7gnUWcI11 分钟前
AI Compose Commit:用 AI 智能重构 Git 提交工作流
人工智能·git·重构
G皮T15 分钟前
【OpenClaw】思路转变:从 “传统UI测试” 到 “AI驱动的UI测试”
自动化测试·人工智能·ai·agent·测试·ui测试·openclaw
lijianhua_97129 小时前
国内某顶级大学内部用的ai自动生成论文的提示词
人工智能
EDPJ9 小时前
当图像与文本 “各说各话” —— CLIP 中的模态鸿沟与对象偏向
深度学习·计算机视觉
蔡俊锋9 小时前
用AI实现乐高式大型可插拔系统的技术方案
人工智能·ai工程·ai原子能力·ai乐高工程
自然语9 小时前
人工智能之数字生命 认知架构白皮书 第7章
人工智能·架构