图形图像处理实验报告实验八:几何变换(第五章)指导教师:张宝雷姓名:刘爽专业:09信本二班学号:09040342021一、图像的平移变换MATLAB代码:clear all;A=imread('iep.jpg');figure;subplot(121);imshow(A);A=double(A);A_move=zeros(size(A));H=size(A);A_x=50;A_y=50;I_movesult(A_x+1:H(1),A_y+1:H(2),1:H(3))=I(1:H(1)-A_x,1:H(2)-A_y,1:H(3));subplot(122);imshow(uint8(A_move));二、图像的裁剪1、用imcrop函数对图像进行裁剪MATLAB代码:I=imread('iep.jpg');I1=imcrop(I,[80 60 50 50]);figure;subplot(121);imshow(I);subplot(122);imshow(I1);2、使用剪切图像函数制作动画MATLAB代码:I=imread('iep.jpg')n=50;m=50;figure;imshow(I);for i=1:50n=n-1;m=m+1;I1=imcrop(I,[n,n,m,m]);figure;imshow(I1);end三、图像的比例缩放变换1、用最近邻域法进行图像放大4倍和缩小1/2倍的操作。
MATLAB代码:I=imread('fish.jpg'); %I为原始图像figure;subplot(131);imshow(I); %显示原始图像I=double(I);I_en=imresize(I,4,'nearest'); %最近邻法标志函数nearest扩大4倍subplot(132);imshow(uint8(I_en)); %显示扩大4倍后的图像I_re=imresize(I,0.5,'nearest'); %缩小两倍subplot(133);imshow(uint8(I_re));%显示缩小2倍后的图像2、图像旋转MATLAB代码:clear all;I=imread('mei.jpg'); %本书用的图片都在当前目录下,故不用写路径figure;subplot(121);imshow(I);I1=imrotate(I,30,'crop');subplot(122);imshow(I1);3、使用imrotate函数旋转图像,制作动画效果MATLAB代码:I=imread('mei.jpg');for i=1:25I1=imrotate(I,15*i,'crop');imshow(I1);end三、图像错切变换1、图像错切示例MATLAB代码:I=imread('mao.jpg');figure;subplot(121);imshow(I);I=double(I);h=size(I);I1=zeros(h(1)+round(h(2)*tan(pi/6)),h(2),h(3));for m=1:h(1)for n=1:h(2)I1(m+round(n*tan(pi/6)),n,1:h(3))=I(m,n,1:h(3));endendI2=uint8(I1);subplot(122);imshow(I2);2、图像镜面变换示例MATLAB代码:I=imread('ta.jpg');figure;subplot(221);imshow(I);I=double(I);h=size(I);I_fliplr(1:h(1),1:h(2),1:h(3))=I(1:h(1),h(2):-1:1,1:h(3)); %水平镜像变换I1=uint8(I_fliplr);subplot(222);imshow(I1);I_flipud(1:h(1),1:h(2),1:h(3))=I(h(1):-1:1,1:h(2),1:h(3)); %垂直镜像变换I2=uint8(I_flipud);subplot(223);imshow(I2);I_fliplr_flipud(1:h(1),1:h(2),1:h(3))=I(h(1):-1:1,h(2):-1:1,1:h(3)); %对角镜像变换I3=uint8(I_fliplr_flipud);subplot(224);imshow(I3);四、图像复合变换1、将图像向下、向右平移,并用白色填充空白部分,再对其作垂直镜像,然后旋转45度,再扩大3倍。
MATLAB代码:I=imread('ben.jpg'); %读取原始图像figure;subplot(121);imshow(I);I=double(I);I1=zeros(size(I))+255;h=size(I1);I1(50+1:h(1),50+1:h(2),1:h(3))=I(1:h(1)-50,1:h(2)-50,1:h(3)); %平移变换I2(1:h(1),1:h(2),1:h(3))=I1(h(1):-1:1,1:h(2),1:h(3)); %镜像变换I3=imrotate(I2,45,'nearest'); %旋转变换I4=imresize(I3,3,'nearest'); %扩大3倍I4=uint8(I4);subplot(122);imshow(I4);五、图像的几何变换1、使用imtrasform函数实现图像平面扭曲功能MATLAB代码:T=maketform('affine',[0.5 0 0;0.5 1 0;0 0 1]);I=imread('cameraman.tif');I1=imtransform(I,T);figure;subplot(121);imshow(I);subplot(122);imshow(I1);2、图像二维投影变换示例MATLAB代码:I=imread('ben.jpg'); %读取原始图像I1=imresize(I,[60 60]);figure;subplot(121);imshow(I);T=maketform('projective',[1 1;31 1;31 31;1 31],[5 5;40 5;35 30;-10 30]);T1=makeresampler('cubic','circular');T2=imtransform(I1,T,T1,'size',[150 200],'XYScale',1);subplot(122);imshow(T2);六、图像的邻域操作1、对图像进行邻域操作,使图像的轮廓变得清晰MATLAB代码:I=imread('nah.bmp'); %读取原始图像I1=double(I);I2=floor((I1(:,:,1)+I1(:,:,2)+I1(:,:,3))/3);A=[-1 -1 -1;-1 8 -1;-1 -1 -1];for i=2:15for j=2:15L=I2(i-1:i+1,j-1:j+1).*A;I3(i,j)=sum(sum(L));endendI3imshow(I3);2、使用nlfilter进行图像邻域操作MATLAB代码:I=imread('nah.bmp');I1=rgb2gray(I);figure;subplot(121);imshow(I1);fun=inline('median(x(:))');B=nlfilter(I1,[3 3],fun);subplot(122);imshow(B);3、使用函数blkproc进行图像分离块操作MATLAB代码:I=imread('mao.bmp');I1=rgb2gray(I);fun=@dct2;I2=blkproc(I1,[8 8],fun);imagesc(I2);七、图像区域选取1、使用函数roipoly选取图像块MATLAB代码:I=imread('yun.jpg');figure;subplot(121);imshow(I);C1=[10 40 90];C2=[30 98 54];I2=roipoly(I,C1,C2);subplot(122);imshow(I2);2、图像块选取后进行加运算,完成图像块的标注MATLAB代码:[I1,m]=imread('yun.jpg');I2=rgb2gray(I1);I3=double(I2);figure;subplot(121);imshow(I3,m);C1=[10 40 90];C2=[30 98 54];BW=roipoly(I3,C1,C2);B=double(BW)*256;AB=(I3+B);subplot(122);imshow(AB,m);3、使用余弦曲线围成图像块MATLAB代码:[I1,m]=imread('yun.jpg');I2=rgb2gray(I1);I3=double(I2);figure;subplot(121);imshow(I3,m);C1=10:pi:180;C2=floor(20*cos(C1));BW=roipoly(I3,C1,C2);B=double(BW)*256;AB=(I3+B);subplot(122);imshow(AB,m);。