图像配准里相位相关法,这幅图是怎么得到的
我最近在研究图像配准,想在Matlab环境中验证Fourier-Mellin算法,我参考的文章是:《一种基于学习的自动图像配准检验方法》,其中相位相关法得到的效果图如附件1所示:但是,我采用该算法却只得到峰值分布的平面图,如附件2所示:
如何将这个平面图转换为图1所示的三维效果呢??我用mesh、surf都试过了的,没有成功,请大家指点一二。
[ 本帖最后由 ChaChing 于 2010-8-2 00:13 编辑 ]
图像配准验证程序,一运行就死机
下面这个程序是验证图像配准算法Fourier-Mellin的,但是一运行Matlab就死机,没有什么致命错误,可以得到最终结果的,请高手指点一下啊。clear all
tic
F = imread('F:\256楼宇图像.bmp');
I= imread('F:\256楼宇待配准图像.bmp');
Fgray=rgb2gray(F);
Igray=rgb2gray(I);
Fgray=double(Fgray);
Igray=double(Igray);
FDFT0=fft2(Fgray);
IDFT0=fft2(Igray);
FDFT=fftshift(FDFT0);
IDFT=fftshift(IDFT0);
FDFT=log(1+abs(FDFT));
IDFT=log(1+abs(IDFT));
% Pow=abs(FDFT0);
%
% theta=(180/pi)*angle(FDFT0);
% %图像一,显示两幅图像及其DFT图
% figure
% subplot(2,2,1),imshow(F),title('楼宇基准图像');
% subplot(2,2,2),imshow(FDFT,[]),title('楼宇基准图像DFT');
% subplot(2,2,3),imshow(I),title('楼宇待配准图像');
% subplot(2,2,4),imshow(IDFT,[]),title('楼宇待配准图像DFT');
% %**************************************************************************
% =size(FDFT0);
% for j=1:1:M
% for k=1:1:N %Matlab数组下标是从1开始的,note!
% r=Pow(j,k);
% theta_yuansu=theta(j,k);
% DFT_Polar(j,k)=Pow(j,k)*exp(i*theta_yuansu);
% % DFT_LPM(j,k)=log(Pow(j,k))*exp(i*theta_yuansu);
% end
% end
% %图像二:显示FFT变换后频谱,转换为极坐标后,极坐标图示
% figure
% polar(DFT_Polar),title('图2:频谱图像转换为极坐标系下显示');
% %**************************************************************************
%loglog(I_lp)logpolar.m是自定义的对数极坐标函数,其原型详见
%F:\Program Files\MATLAB71\work\图像FFT变换\logpolar.m
= logpolar(abs(FDFT0),256);
%figure
%subplot(2,2,1),imshow(FDFT,[]),title('基准图像DFT');
%subplot(2,2,2),imshow(FI_lp),title('FLog_Polar');
%subplot(2,2,3),imshow(FI_nearest),title('FI_nearest');
%subplot(2,2,4),imshow(FI_nearest),title('FI_nearest');
= logpolar(abs(IDFT0),256);
%figure
%subplot(2,2,1),imshow(IDFT,[]),title('待配准图像DFT');
%subplot(2,2,2),imshow(II_lp),title('ILog_Polar');
%subplot(2,2,3),imshow(II_nearest),title('II_nearest');
%subplot(2,2,4),imshow(II_nearest),title('II_nearest');
%
%
%**************************************************************************
%*****************2009.7.18*********
%接下来是在对数极坐标实现Fourier位移变换理论,在对得到的傅里叶变换,计算其互功率谱,然后逆变换,得到脉冲函数。
Flog_DFT=fft2(double(FI_bilinear));
Ilog_DFT=fft2(double(II_bilinear));
% figure
% imshow(log(1+abs(Flog_DFT)),[]);
II_conj=conj(Ilog_DFT);
FI_fenzi=(Flog_DFT).*II_conj;
FI_fenmu=abs(FI_fenzi);
FI=FI_fenzi/FI_fenmu;
FI_ifft=real(ifft(FI));
mesh(FI_ifft);
colormap bone;
%**************************************************************************
figure
imshow(FI_ifft),title('脉冲函数');
toc %计算算法运行时间
[ 本帖最后由 那谁 于 2009-7-21 15:45 编辑 ] 这个图可以用mesh和surf画的呀,你的操作不对吧,看看help吧。 个人感觉pcolor或许亦适用! 的确用mesh或者surf就能画出来,由于我对Matlab不太熟悉,所以一开始没画对啊,谢谢大家帮忙。
polor函数,我也试了,但是画出来是一张彩色平面方格图,具体原因,我也不清楚。不过主要原因不是画图,应该是我的程序出的问题。
[ 本帖最后由 ChaChing 于 2010-8-2 00:23 编辑 ]
计算两幅图像的互功率谱的Fourier逆变换
Q_fenzi=FDFT0.*conj(IDFT0);Q_fenmu=abs(Q_fenzi);
Q=Q_fenzi./Q_fenmu;
q=real(ifft(Q));
我在Matlab环境中,用以上几行code计算图像F和图像I的互功率谱Q,采用的公式是参见附件1.
但是计算结果就是不符合预期结果,我都不知道那里出错啊??而且Q=Q_fenzi./Q_fenmu;其中到底该不该是点除./呢?还是直接就是/,请大家帮忙告诉我附件中的公式到底该用什么code实现。
我自己觉得应该是点除,因为Q_fenzi=FDFT0.*conj(IDFT0)得到的是一个复数矩阵,Q_fenmu=abs(Q_fenzi)得到的是该矩阵的幅值,矩阵里的每一个值对应的是原图像中的一个像素,所以应该是点除,进行矩阵对应元素运算,得到两幅图像中对应像素每点互功率谱。但是为什么这样还是得到预期结果,我实在是不知所以了。
PS.很不好意思,我最近发了好几个问题求助帖,主要是最近一直在做Matlab环境中图像配准算法的验证,但是起步阶段,难免问题多多,困难多多,望大家谅解帮助。
[ 本帖最后由 那谁 于 2009-7-23 17:25 编辑 ]
回复 地板 那谁 的帖子
不知道你现在做出来了没有,上面的那个图是用mesh做出来的,我也是做着一方面的,已经做出来了!可能你的程序有问题吧! {:{13}:} 图像拼接么?现在还没有接触这方面内容之前做的图像配准都是基于标志点的……{:{28}:} {:{39}:}要好好学习
页:
[1]