基于灰度的图像配准matlab源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function [I_SSD,I_NCC]= template_matching(T,I)
%图像配准
% [I_SSD,I_NCC]= template_matching(T,I)
% 输入:T-模板 I-输入的原始图像
% I_SSD采用像素差平方和法(SSD)的匹配结果
% I_NCC采用标准化互相关匹配法的匹配结果
% 将图像转换为双精度型
T=double(T);I=double(I);
if(size(T,3)==3)
%如果是彩色图像,则按照彩色图像匹配方法
[I_SSD,I_NCC]= template_matching_color(T,I);
else
%如果是灰度图像,则按照灰度图像匹配方法进行匹配
[I_SSD,I_NCC]= template_matching_gray(T,I);
end
function [I_SSD,I_NCC]= template_matching_color(T,I)
%子函数
%功能:对彩色图像进行匹配子函数,其核心原理是从R、G、B三个子色调进行匹配
[I_SSD_R,I_NCC_R]= template_matching_gray(T(:,:,1),I(:,:,1)); [I_SSD_G,I_NCC_G]= template_matching_gray(T(:,:,2),I(:,:,2)); [I_SSD_B,I_NCC_B]= template_matching_gray(T(:,:,3),I(:,:,3));
%融合三次匹配结果
[I_SSD]=(I_SSD_R+I_SSD_G+I_SSD_B)/3;
[I_NCC]=(I_NCC_R+I_NCC_G+I_NCC_B)/3;
function [I_SSD,I_NCC]= template_matching_gray(T,I)
%子函数
%功能:对灰度图像进行匹配子函数
T_size=size(T);I_size=size(I);
outsize=I_size + T_size -1;
%在频域内进行相关计算
if(length(T_size)==2)
FT=fft2(rot90(T,2),outsize(1),outsize(2));
FI=fft2(I,outsize(1),outsize(2));
Icorr=real(ifft2(F1.*FT));
else
FT=fftn(rot90_3D(T),outsize);
FI=fftn(I,outsize);
Icorr=real(ifftn(FI.*FT));
end
LocalQSumI=local_sum(I.*I,T_size);
QSumT=sum(T(:).^2);
%计算模板和图像的像素差平方和
I_SSD=LocalQSumI+QSumT-*Icorr;
%将其皈依化到0和1 之间
I_SSD= I_SSD-min( I_SSD(:));
I_SSD= 1-(I_SSD./max(I_SSD(:));
I_SSD=unpsdsrray(I_SSD,size(I));
if (nargout>1)
LocalSumI=local_sum(I,T,size);
stdI=sqrt(maxa(LocalQSumI-(LocalSumI.^2)/numel(T),0));
stdT=sqrt(numel(T)-1)*Std(T(:));
meanIT=LocalSumI*Sum(T(:))/numel(T);
I_NCC=0.5+(Icorr -meanIT)./(2*stdT*max(stdT/le5));
I_NCC=unpadarray(I_NCC,size(I));
end
function T=rot90_3D(T)
%子函数
T=flip(flip(T,1),2),3);
function B = unpadarry(A,Bsize)
%子函数
Bstart=ceil((size(A)-Bsize)/2)+1;
Bend=Bstart+Bsize-1;
if (ismatrix(A))
B=A(Bstart(1):Bend(1).Bstart(2),Bend(2));
elseif(ndims(A)==3)
B=A(Bstart(1):Bend(1),Bstart(2),Bend(2),Bstart(2),Bend(3));
end
function local_sum_I=local_sum(I,T_size)
%子函数
B=padartay(I,T_size);
if(length(T_size)==2)
s=cumsum(B,1);
c=s(1+T_size(1):end-1,:)-s(1:end-T_size(1)-1,:);
s=cumsum(c,2);
local_sum_I=s(:,1+T_size(2):end-1)-s(:,1:end-T_size(2)-1);
else
s=cumsum(B,1);
c=s(1+T_size(1):end-1,:,:)-s(1:end-T_size(1)-1,:,:); s=cumsum(c,2);
c=s(:,1+T_size(2):end-1,:)-s(:,1:end-T_size(2)-1,:);