对数极坐标变换的关键点就是将存在旋转和尺度关系的图像通过对数极坐标变换变为该坐标系下的平移关系。其中极坐标用来解决旋转问题,对数变换用来解决尺度关系问题。
设I1(x,y)和I2(x,y)为具有平移、旋转和尺度关系的两幅图像。
I1(x,y)?I2[s(xcos?0?ycos?0)??x,s(?sin?0?ycos?0)??y]
其中:s 为尺度因子;?0 为旋转角;?x,?y为平移量。
?(u,v)和I?(u,v)满足 其傅里叶变换I12?(u,v)?e?j2?(u?x?v?y)s?2{I?[s?1(ucos??vsin?),s?1(?usin??vcos?)]} I120000对上式两边取模得
?(u,v)|?s?2|I?[s?1(?ucos??vsin?),s?1(?usin??vcos?)]| |I120000?(u,v)|和|I?(u,v)|仅存在旋转角其中:s?2是一个比例因子,忽略它的影响;|I12?(u,v)|和|I?(u,v)|分别?0和尺度关系s?1的差别。为了进一步分离变量?0和s对|I12作极坐标变换(u,v)?(r,?)可得
M1(r,?)?s?2M2(r/s,???0)
令??logr,??logs,则有 M1(?,?)?s?2M2(???,???0)
利用相位相关法可以检测出图像的旋转和尺度关系。以I1(x,y)为参考,将
I2(x,y)根据检测出的旋转和尺度关系进行逆变换后得到I2(x,y)。I2(x,y)与I1(x,y)利用相位相关法检测出图像的平移关系。根据得到的平移、旋转和尺度关
系,建立两幅待拼接图像之间的变换模型,进而可以完成图像的拼接。
借助对数极坐标变换和相位相关法能有效解决平移、旋转和尺度缩放问题,但是要求待配准的图像间有较高的重合度。
11
第四章 对数极坐标变换图像配准旋转实例研究
4.1 实例设计[7]
在MATLAB7.0环境下,读入原图I1和待配准图像I2,其中图像均为灰度图像,I2是I1的一部分,因此I1与I2间有较高的重合度。取I1和I2的傅里叶变换矩阵,为了使得出的数据与频率对应,所以分别用ffshift转换。根据对数极坐标下的旋转不变性,再对上述结果变换到对数极坐标F1和F2;然后找到相关相位及其峰值,根据峰值相位,计算出旋转角度,旋转后的图像为R1和R2;接着根据R1_F2 和 F1 的相关相位和R2_F2 和 F1 的相关相位哪一个更接近原图像来决定用 +180 还是 -180 来翻转待配准图像。
在此过程中,函数:
function H = hipass_filter(ht,wd) 用来实现高通滤波器对频域信号做过滤;
function [r,g,b] = transformImage(A, Ar, Ac, Nrho, Ntheta, Method, Center, Shape)
用来实现对数极坐标变换。
以上是具体实现设想,程序实现如下:、
function RegnisterFourierMellin()
% 读入图像
I1 = imread('src.bmp');
I2 = imread('register.bmp');
% 取图像的傅里叶变换矩阵,并使所得数据与频率相对应 SizeX = size(I1, 1); SizeY = size(I1, 2);
FA = fftshift(fft2(I1));
FB = fftshift(fft2(I2));
12
% 用高通滤波器对频域信号做处理
IA = hipass_filter(size(I1, 1),size(I1,2)).*abs(FA); IB = hipass_filter(size(I2, 1),size(I2,2)).*abs(FB);
% 高通滤波器处理过的信号变换到对数极坐标
L1 = transformImage(IA, SizeX, SizeY, SizeX, SizeY, 'nearest', size(IA) / 2, 'valid');
L2 = transformImage(IB, SizeX, SizeY, SizeX, SizeY, 'nearest', size(IB) / 2, 'valid');
% 对对数极坐标进行fft THETA_F1 = fft2(L1); THETA_F2 = fft2(L2);
% 计算相关相位
a1 = angle(THETA_F1); a2 = angle(THETA_F2);
THETA_CROSS = exp(i * (a1 - a2));
THETA_PHASE = real(ifft2(THETA_CROSS));
% 找到相关相位的峰值
THETA_SORTED = sort(THETA_PHASE(:));
SI = length(THETA_SORTED):-1:(length(THETA_SORTED)); [THETA_X, THETA_Y] = find(THETA_PHASE == THETA_SORTED(SI));
% 计算旋转角度
DPP = 360 / size(THETA_PHASE, 2); Theta = DPP * (THETA_Y - 1);
13
disp(Theta);
% 用theta 和 theta + 180旋转图像I2
R1 = imrotate(I2, -Theta, 'nearest', 'crop'); R2 = imrotate(I2,-(Theta + 180), 'nearest', 'crop');
imwrite(R1,'rotated_1.bmp');
imwrite(R2,'rotated_2.bmp');
% 取 R1 的 fft
R1_F2 = fftshift(fft2(R1));
% 计算 R1_F2 和 F1的相关相位 a1 = angle(FA); a2 = angle(R1_F2);
R1_F2_CROSS = exp(i * (a1 - a2));
R1_F2_PHASE = real(ifft2(R1_F2_CROSS));
% 取 R2 的 fft
R2_F2 = fftshift(fft2(R2));
% 计算 R2_F2 和 F1 的相关相位 a1 = angle(FA); a2 = angle(R2_F2);
R2_F2_CROSS = exp(i * (a1 - a2)); R2_F2_PHASE = real(ifft2(R2_F2_CROSS));
% 根据R1_F2 和 F1 的相关相位和R2_F2 和 F1 的相关相位哪一个更接近原图像来决定用 +180 还是 -180 来翻转待配准图像
14
相关推荐: