基于灰度的图像配准matlab源程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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,:);

相关文档
最新文档