|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
结果不对,望指教。
% 文件名: ImageMatch_2.m
% 功能: 基于FFT相关法的图像匹配
% 改进: 旋转
%%%%%%%%%%%%%%%基于FFT的图像匹配%%%%%%%%%%%%%
clc
clear all
% 设定参数
Size = 128;
% 读取原始图像和待匹配图像的数据并显示
SrcIm = imread('E:\Image\lena.bmp');
TmpIm = imread('E:\Image\tmp.bmp');
[SrcWidth SrcHeight] = size(SrcIm);
[TmpWidth TmpHeight] = size(TmpIm);
figure, imshow(SrcIm)
figure, imshow(TmpIm)
% 二维FFT
Width = 2 ^ ceil(log2(SrcWidth));
Height = 2 ^ ceil(log2(SrcHeight));
SrcIm = fft2(double(SrcIm), Width, Height);
TmpIm = fft2(double(TmpIm), Width, Height);
% 二维FFT中心化
SrcIm = fftshift(SrcIm);
TmpIm = fftshift(TmpIm);
% 提取幅谱
SrcIm = abs(SrcIm);
TmpIm = abs(TmpIm);
% 原始图像、待匹配图像转化对数极坐标图像
SrcPolar = imlogpolar(SrcIm, Size, Size, 'bilinear');
TmpPolar = imlogpolar(TmpIm, Size, Size, 'bilinear');
% 极坐标图像的二维FFT
SrcData = fft2(SrcPolar, Size, Size);
TmpData = fft2(TmpPolar, Size, Size);
% 计算矩阵相关系数
TmpData = conj(TmpData);
CC = SrcData .* TmpData;
for i = 1 : Size
for j = 1 : Size
CC(i, j) = CC(i, j) / abs(CC(i, j));
end
end
% 二维IFFT
Data = ifft2(CC);
Data = abs(Data);
figure, surf(Data)
% 计算CC的峰值
[fMax PosY] = max(Data);
[fMax PosX] = max(fMax);
PosY = PosY(PosX);
% 计算旋转角度
Theta = (PosX - 1) * 360 / Size;
if Theta > 180
Theta = Theta - 360;
end |
|