图像的几何运算

%利用interp2函数对图像通过各种插值法进行放大
I=imread('lean.jpg');
I2=imresize(I,0.125);
Z1=interp2(double(I2),2,'nearest'); %最近邻法插值
Z1=uint8(Z1);
subplot(221);imshow(Z1);
title('最近邻插值');
Z2=interp2(double(I2),2,'linear'); %线性法插值
Z2=uint8(Z2);
subplot(222);imshow(Z2);
title('线性邻插值');
Z3=interp2(double(I2),2,'spline'); %三次样条法插值
Z3=uint8(Z3);
subplot(223);imshow(Z3);
title('三次样条法插值');
Z4=interp2(double(I2),2,'cubic'); %立方法插值
Z4=uint8(Z4);
subplot(224);imshow(Z4);
title('立方法插值');

 自定义translation

function J=translation(I,a,b)
%I为输入图像,a和b描述I图像沿着x轴和y轴移动的距离
%不考虑溢出情况
[M,N,G]=size(I);
I=im2double(I);
J=ones(M,N,G);
for i=1:M
    for j=1:N
        if ((i+a)>=1&&(j+b>=1)&&(j+b<=N));%判断平移后行列坐标是否超出范围
            J(i+a,j+b,:)=I(i,j,:);%图像平移
        end
    end
end




%对图像实现平移操作
I=imread('office_1.jpg');
a=90;b=90; %设置平移坐标
J1=translation(I,a,b);
subplot(221);imshow(J1);axis on;
title('右下平移图像');
a=-90;b=-90;
J2=translation(I,a,b);
subplot(222);imshow(J2);axis on;
title('左上平移图像');
a=-90;b=90;
J3=translation(I,a,b);
subplot(223);imshow(J3);axis on;
title('右上平移图像');
a=90;b=-90;
J2=translation(I,a,b);
subplot(224);imshow(J4);axis on;
title('左下平移图像');

结果:

 

考虑溢出情况:

function J=translation1(I,a,b)
%I为输入图像,a和b描述I图像沿着x轴和y轴移动的距离
%考虑溢出情况,采用扩大显示区域的方法
[M,N,G]=size(I);
I=im2double(I);
J=ones(M+abs(a),N+abs(b),G);
for i=1:M
for j=1:N
    if (a<0&&b<0); %如果进行右下移动,对新图像矩阵进行赋值
        J(i,j,:)=I(i,j,:);
    else if(a>0&&b>0);
        J(i+a,j+b,:)=I(i,j,:);
    else if(a>0&&b<0);
        J(i+a,j,:)=I(i,j,:);
    else
        J(i,j+b,:)=I(i,j,:);
        end
       end
     end
   end
end
%对图像实现平移操作
I=imread('office_1.jpg');
a=90;b=90; %设置平移坐标
J1=translation_T(I,a,b);
subplot(221);imshow(J1);axis on;
title('右下平移图像');
a=-90;b=-90;
J2=translation_T(I,a,b);
subplot(222);imshow(J2);axis on;
title('左上平移图像');
a=-90;b=90;
J3=translation_T(I,a,b);
subplot(223);imshow(J3);axis on;
title('右上平移图像');
a=90;b=-90;
J4=translation_T(I,a,b);
subplot(224);imshow(J4);axis on;
title('左下平移图像');

结果:

 

imrotate 旋转处理

%利用imrotate函数对图像进行旋转处理
A=imread('20151130101641521.jpg');
J1=imrotate(A,60);%设置旋转角度,实现旋转并显示
J2=imrotate(A,-60);
J3=imrotate(A,60,'bicubic','crop');%设置输出图像的大小,实现旋转图像并显示
J4=imrotate(A,30,'bicubic','loose');
figure;
subplot(221);imshow(J1);
title('逆时针旋转60度')
subplot(222);imshow(J2);
title('逆时针旋转30度')
subplot(223);imshow(J3);
title('裁剪旋转')
subplot(224);imshow(J4);
title('不裁剪旋转')

结果:

 

 imresize实现对图像缩放

%利用imresize函数对图像实现缩放
I=imread('20151130101641521.jpg');
J=imresize(I,0.2);
subplot(2,2,1);imshow(I);
title('原始图像');
disp('图像放大,最近邻插值法运算时间:');
tic
J1=imresize(J,8,'nearest');
toc
subplot(2,2,2);imshow(J1);
title('图像放大,最近邻插值')
disp('图像放大,双线性插值法时间:');
tic
J2=imresize(J,8,'bilinear');
toc
subplot(2,2,3);imshow(J2);
title('图像放大,双线性插值')
disp('图像放大,双立方插值法时间:')
tic
J3=imresize(J,8,'bicubic');
toc
subplot(2,2,4);imshow(J3);
title('图像放大,双立方插值')

结果:

 

imcrop实现图像裁剪 

%利用imcrop图像的裁剪
I=imread('20151130101641521.jpg');
I2=imcrop(I,[50 80 80 112]);
figure;imshow(I),
title('原图像');
figure();imshow(I2)
title('剪切图像')

结果:

 

用手动实现图像的裁剪

%用手动实现图像的裁剪
[I,map]=imread('20151130101641521.jpg');
figure;imshow(I,map);
I2=imcrop(I,map);
figure;imshow(I2);

结果:

 

matlab实现图像错切

%错切
im=(imread('robot.jpg'));
im1=rgb2gray(im);
figure
subplot(131),imshow(im1);
[row,col]=size(im1); %获取行数 和 列数

%图像的水平错切
G=zeros(row,col);
a=pi/6; %水平错切30度
b=tan(a);
for m=1:row
for n=1:col
G(round(m+b*n),n)=im1(m,n);
end
end
subplot(132),imshow(uint8(G));
 
%图像的垂直错切
G=zeros(row,col);
a=pi/6; %水平错切30度
b=tan(a);
for m=1:row
for n=1:col
G(n,round(m+b*n))=im1(m,n);
end
end
subplot(133),imshow(uint8(G));

结果:

 

图像镜像变换

图像的镜像变换不改变的图像的形状。图像的镜像变换分为三种:水平镜像,垂直镜像和对角镜像。

%利用matlab实现图像的水平,垂直及对角镜像变换
I1=imread('robot.jpg');
I1=double(I1);
subplot(2,2,1);imshow(uint8(I1));
title('原始图像');
H=size(I1);
I2(1:H(1),1:H(2),1:H(3))=I1(H(1):-1:1,1:H(2),1:H(3));
subplot(2,2,2);imshow(uint8(I2));
title('垂直镜像');
I3(1:H(1),1:H(2),1:H(3))=I1(1:H(1),H(2):-1:1,1:H(3));
subplot(2,2,3);imshow(uint8(I3));
title('水平镜像');
I4(1:H(1),1:H(2),1:H(3))=I1(H(1):-1:1,H(2):-1:1,1:H(3));
subplot(2,2,4);imshow(uint8(I4));
title('对角镜像');

结果:

 
领域处理 

滑动领域处理

%利用nlfilter函数实现滑动邻域操作
A=imread('cameraman.tif');
A=im2double(A);
fun=@(x)median(x(:));
B=nlfilter(A,[3 3],fun);
subplot(121);imshow(A);
title('原始图像');
subplot(122);imshow(B);
title('领域操作');

结果:
 

猜你喜欢

转载自blog.csdn.net/qq_35654080/article/details/82796218