www.gusucode.com > 《图像配准技术及其Matlab编程实现》--源码程序 > 《图像配准技术及其Matlab编程实现》/match/CubicConvolutionInterpolation.m
function [newImage]=CubicConvolutionInterpolation(oldImage,w,z) %参数:oldImage:待插值图像 % w:反射变换参数x0(与oldImage同维数组) % z:反射变换参数y0(与oldImage同维数组) % newImage:插值后图像 %功能:利用立方卷积插值法根据几何变换参数进行灰度级插值 [Width,Height]=size(oldImage); newImage=uint8(zeros(Width,Height)); for i=1:Width for j=1:Height source_x=w(i,j); source_y=z(i,j); if(source_x>=Width-3 || source_y>=Height-3 || double(uint16(source_x))<=2 || double(uint16(source_y))<=2) newImage(i,j)=0; else if(source_x/double(uint16(source_x))==1.0) & (source_y/double(uint16(source_y))==1.0) newImage(i,j)=oldImage(int16(source_x),int16(source_y)); else %立方体卷积插值法 a=fix(source_x); b=fix(source_y); u=(source_x -a); v=(source_y -b); a11=S(u+1); a12=S(u); a13=S(u-1); a14=S(u-2); A=[a11 a12 a13 a14]; b11=double(oldImage(a-1,b-1)); b12=double(oldImage(a-1,b)); b13=double(oldImage(a-1,b+1)); b14=double(oldImage(a-1,b+2)); b21=double(oldImage(a,b-1)); b22=double(oldImage(a,b)); b23=double(oldImage(a,b+1)); b24=double(oldImage(a,b+2)); b31=double(oldImage(a+1,b-1)); b32=double(oldImage(a+1,b)); b33=double(oldImage(a+1,b+1)); b34=double(oldImage(a+1,b+2)); b41=double(oldImage(a+2,b-1)); b42=double(oldImage(a+2,b)); b43=double(oldImage(a+2,b+1)); b44=double(oldImage(a+2,b+2)); B=[b11 b12 b13 b14;b21 b22 b23 b24;b31 b32 b33 b34;b41 b42 b43 b44]; c11=S(v+1); c21=S(v); c31=S(v-1); c41=S(v-2); C=[c11;c21;c31;c41]; newImage(i,j)=A*B*C; end end end end figure;imshow(newImage); %插值该函数 function s=S(w) w=abs(w); if w<1 s=1-2*w^2+w^3; elseif w>=2 s=0; else s=4-8*w+5*w^2-w^3; end %RunInterpolation('lena.bmp',3); %RunInterpolation('ct.bmp',3);