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

相关推荐
冬奇Lab6 小时前
Workflow 系列(01):基础理论——三种执行模型与 Anthropic 5 种模式
人工智能·agent·工作流引擎
冬奇Lab6 小时前
每日一个开源项目(第143篇):page-agent - 纯 JS 的网页 GUI Agent,无需截图、无需插件、无需后端
前端·人工智能·agent
程序员cxuan8 小时前
虽迟但到!GPT-5.6 终于来了!
人工智能·后端·程序员
ZhengEnCi10 小时前
Q03-UI设计进阶技巧-让界面更高级的7个核心原则
人工智能
IT_陈寒11 小时前
React的这个渲染问题连官方文档都没说清楚
前端·人工智能·后端
不加辣椒12 小时前
第12章 工具调用与 Agent 提示工程
人工智能
用户16931761726612 小时前
前端给AI消息做日期分组与时间线
人工智能
i晟12 小时前
Claude Code Harness 深度拆解:从你敲回车到模型回复,中间发生了什么
人工智能
用户2527362781413 小时前
【踩坑复盘】我在本地跑 RAG 知识库时踩了 5 个大坑,吐血整理避坑指南
人工智能
大模型真好玩13 小时前
LangChain DeepAgents 速通指南(九)—— 生产级智能体框架 DeepAgents Code 源码导读
人工智能·langchain·agent