在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
2011-05-25 17:21
非刚性图像配准 matlab简单示例 demons算法,
% Clean clc; clear all; close all; % Compile the mex files %compile_c_files % Read two images I1=im2double(imread('ssftrinew1.png')); % Set static and moving image S=I2; M=I1; % Alpha (noise) constant alpha=2.5; % Velocity field smoothing kernel Hsmooth=fspecial('gaussian',[60 60],10); % The transformation fields Tx=zeros(size(M)); Ty=zeros(size(M)); Tz=zeros(size(M)); [Sy,Sx] = gradient(S); for itt=1:200 % Difference image between moving and static image Idiff=M-S; % Default demon force, (Thirion 1998) %Ux = -(Idiff.*Sx)./((Sx.^2+Sy.^2)+Idiff.^2); %Uy = -(Idiff.*Sy)./((Sx.^2+Sy.^2)+Idiff.^2); % Extended demon force. With forces from the gradients from both % moving as static image. (Cachier 1999, He Wang 2005) [My,Mx] = gradient(M); Ux = -Idiff.* ((Sx./((Sx.^2+Sy.^2)+alpha^2*Idiff.^2))+(Mx./((Mx.^2+My.^2)+alpha^2*Idiff.^2))); Uy = -Idiff.* ((Sy./((Sx.^2+Sy.^2)+alpha^2*Idiff.^2))+(My./((Mx.^2+My.^2)+alpha^2*Idiff.^2))); % When divided by zero Ux(isnan(Ux))=0; Uy(isnan(Uy))=0; % Smooth the transformation field Uxs=3*imfilter(Ux,Hsmooth); Uys=3*imfilter(Uy,Hsmooth); % Add the new transformation field to the total transformation field. Tx=Tx+Uxs; Ty=Ty+Uys; %M=movepixels(I1,Tx,Ty,Tz,0); M=movepixels_2d_double(I1,Tx,Ty,0); end gridelment=gridshow(); gridelment=movepixels_2d_double(im2double(gridelment),Tx,Ty,0); subplot(1,3,1), imshow(I1,[]); title('image 1'); subplot(1,3,2), imshow(I2,[]); title('image 2'); subplot(1,3,3), imshow(M,[]); title('Registered image 1'); figure,subplot(131),imshow(I1),subplot(132),imshow(abs(I2-M)),subplot(133),imshow(abs(I2-I1)) figure,imshow(gridelment)
function gridelment=gridshow() gridelment=ones(256,256)*255; for i=1:5:256 gridelment(i,:)=0; end for j=1:5:256 gridelment(:,j)=0; end gridelment=uint8(gridelment); imshow(gridelment);
function Iout=movepixels_2d_double(Iin,Tx,Ty,mode) % This function movepixels, will translate the pixels of an image % according to x and y translation images (bilinear interpolated). % % Iout = movepixels_2d_double(I,Tx,Ty,mode); % % Inputs; % Tx, Ty: The transformation images, describing the % (backwards) translation of every pixel in x and y direction. % mode: If 0: linear interpolation and outside pixels set to nearest pixel % 1: linear interpolation and outside pixels set to zero % (cubic interpolation only supported by compiled mex file) % 2: cubic interpolation and outsite pixels set to nearest pixel % 3: cubic interpolation and outside pixels set to zero % % Outputs, % Iout : The transformed image % % Function is written by D.Kroon University of Twente (February 2009) % Make all x,y indices [x,y]=ndgrid(0:size(Iin,1)-1,0:size(Iin,2)-1); % Calculate the Transformed coordinates Tlocalx = x+Tx; Tlocaly = y+Ty; % All the neighborh pixels involved in linear interpolation. xBas0=floor(Tlocalx); % Linear interpolation constants (percentages) xCom=Tlocalx-xBas0; % limit indexes to boundaries check_xBas0=(xBas0<0)|(xBas0>(size(Iin,1)-1)); check_yBas0=(yBas0<0)|(yBas0>(size(Iin,2)-1)); xBas0(check_xBas0)=0; Iout=zeros(size(Iin)); for i=1:size(Iin,3); Iin_one=Iin(:,:,i); % Get the intensities intensity_xyz0=Iin_one(1+xBas0+yBas0*size(Iin,1)); intensity_xyz1=Iin_one(1+xBas0+yBas1*size(Iin,1)); intensity_xyz2=Iin_one(1+xBas1+yBas0*size(Iin,1)); intensity_xyz3=Iin_one(1+xBas1+yBas1*size(Iin,1)); % Make pixels before outside Ibuffer mode if(mode==1||mode==3) intensity_xyz0(check_xBas0|check_yBas0)=0; intensity_xyz1(check_xBas0|check_yBas1)=0; intensity_xyz2(check_xBas1|check_yBas0)=0; intensity_xyz3(check_xBas1|check_yBas1)=0; end Iout_one=intensity_xyz0.*perc0+intensity_xyz1.*perc1+intensity_xyz2.*perc2+intensity_xyz3.*perc3; Iout(:,:,i)=reshape(Iout_one, [size(Iin,1) size(Iin,2)]); end
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论