图像的几何变换
图像的几何变换是将一幅图像中的坐标映射到另外一幅图像中的新坐标位置,它不改变图像的像素值,只是改变像素所在的几何位置,使原始图像按照需要产生位置、形状和大小的变换。
1、图像的平移
在MATLAB中,没有提供具体图像平移函数,直接运用MATLAB指令编程即可实现图像的平移操作。
MATLAB实现
示例:
构造图像平移函数
function [output_image] = move(input_image,m,n)
%定义move函数,input_image为输入图像,m为输入图像沿着水平方向移动的距离,n为输入图像沿着垂直方向移动的距离,output_image为平移后的输出图像
%不考虑图像平移以后的溢出情况,找不到对应点的地方都赋值为1
[M,N,G]=size(input_image); %获取输入图像的大小
double_image=im2double(input_image); %将数据图像类型转换成双精度
new_image=ones(M,N,G); %初始化新图像矩阵全为1,大小与输入图像相同
for i=1:M
for j=1:N
if((i+m)>=1&&(i+m)<=M&&(j+n)>=1&&(j+n)<=N) %判断平移以后行列坐标是否超出范围
new_image(i+m,j+n,:)=double_image(i,j,:); %进行图像平移
end
end
end
output_image=new_image;
调用函数,实现图像平移
clear all; close all; clc;
input=imread('G:\picture\Fig0450(a)(woman_original).tif');
output1=move(input,100,100);
output2=move(input,-100,-100);
subplot(1,3,1); imshow(input); title('原图像');
subplot(1,3,2); imshow(output1); title('右下平移后的图像');
subplot(1,3,3); imshow(output2); title('左上平移后的图像');
运行结果:
2、图像的镜像
图像的镜像分为垂直镜像和水平镜像。
MATLAB实现
示例:
构造图像镜像函数
function [outImage] = mirror(InImage,n)
%定义mirror函数实现图像镜像变换
%参数n为1时,实现水平镜像变换
%参数n为2时,实现垂直镜像变换
%参数n为3时,实现水平垂直镜像变换
[M,N,G]=size(InImage); %获取输入图像InImage的大小
transImage=InImage;
if n==1
for i=1:M
for j=1:N
transImage(i,M+1-j,:)=InImage(i,j,:);
end
end
elseif n==2
for i=1:M
for j=1:N
transImage(M+1-i,j,:)=InImage(i,j,:);
end
end
elseif n==3
for i=1:M
for j=1:N
transImage(M+1-i,M+1-j,:)=InImage(i,j,:);
end
end
else
error('参数n输入不正确,n取1、2、3');
end
outImage=transImage;
调用函数,实现图像镜像
clear all; close all; clc;
input=imread('G:\picture\Fig0450(a)(woman_original).tif');
output1=mirror(input,1);
output2=mirror(input,2);
output3=mirror(input,3);
subplot(2,2,1); imshow(input); title('原图像');
subplot(2,2,2); imshow(output1); title('水平镜像');
subplot(2,2,3); imshow(output2); title('垂直镜像');
subplot(2,2,4); imshow(output3); title('水平垂直镜像');
运行结果:
3、图像的缩放
图像的缩放是指将给定的图像在x轴方向按比例缩放fx倍,在y轴方向按比例缩放fy倍,从而获得一幅新的图像。如果fx=fy,即在x轴方向和y轴方向缩放的比例相同,即为图像的全比例缩放。如果fx≠fy,图像比例缩放会改变原始图像像素间的相对位置,产生几何畸变。
–imresize()函数
MATLAB实现
示例:
clear all; close all; clc;
InImage=imread('G:\picture\Fig0450(a)(woman_original).tif');
shrink1=imresize(InImage,0.5); %设置缩放比例,缩小图像
enlarge1=imresize(InImage,2); %设置缩放比例,扩大图像
shrink2=imresize(InImage,[500 600]); %设置缩放后的图像行列,实现缩放图像并显示
shrink3=imresize(InImage,[NaN 600]); %函数按照输入图像纵横比生成行数,实现缩放图像并显示
enlarge2=imresize(InImage,1.5,'bilinear'); %采用双线性插值法对图像进行缩放
enlarge3=imresize(InImage,1.5,'triangle'); %采用三角型核函数插值对图像进行缩放
subplot(2,4,1); imshow(InImage); title('原图像');
subplot(2,4,2); imshow(shrink1); title('shrink1');
subplot(2,4,3); imshow(enlarge1); title('enlarge1');
subplot(2,4,4); imshow(shrink2); title('shrink2');
subplot(2,4,5); imshow(shrink3); title('shrink3');
subplot(2,4,6); imshow(enlarge2); title('enlarge2');
subplot(2,4,7); imshow(enlarge3); title('enlarge3');
运算结果:
4、图像的转置
图像转置即为图像的行列坐标互换,进行图像转置后,图像的大小会发生变化。
MATLAB实现
示例:
function [outputImage] = transposition(inputImage)
% inputImage为输入图像
% outputImage为对输入图像转置的输出图像
[M,N,G]=size(inputImage);
inputImage=im2double(inputImage);
transp=ones(N,M,G);
for i=1:M
for j=1:N
transp(j,i,:)=inputImage(i,j,:);
end
end
outputImage=transp;
end
运行结果:
5、图像的旋转
图像的旋转变换属于图像的位置变换,通常是以图像的中心为原点,将图像上的所有像素都旋转一个相同的角度。旋转后,图像的大小一般会改变。
–imrotate()函数
MATLAB实现
示例:
clear all; close all; clc;
InImage=imread('G:\picture\Fig0227(a)(washington_infrared).tif');
rotate1=imrotate(InImage,20); %将图像以其中心为原点逆时针旋转20°,采用最近邻插值生成完整旋转图像
rotate2=imrotate(InImage,-20); %将图像以其中心为原点顺时针旋转20°,采用最近邻插值生成完整旋转图像
rotate3=imrotate(InImage,20,'bilinear'); %将图像以其中心为原点逆时针旋转20°,采用双线性插值生成完整旋转图像
rotate4=imrotate(InImage,20,'bilinear','crop'); %将图像以其中心为原点逆时针旋转20°,采用最近邻插值,对旋转后图像裁剪保证输出图像与输入图像大小相等
rotate5=imrotate(InImage,20,'bilinear','loose'); %将图像以其中心为原点逆时针旋转20°,采用最近邻插值生成完整旋转图像
subplot(2,3,1); imshow(InImage);
subplot(2,3,2); imshow(rotate1);
subplot(2,3,3); imshow(rotate2);
subplot(2,3,4); imshow(rotate3);
subplot(2,3,5); imshow(rotate4);
subplot(2,3,6); imshow(rotate5);
运行结果:
6、图像的剪切
–imcrop()函数
MATLAB实现
示例:
clear all; close all; clc;
InImage=imread('G:\picture\Fig0227(a)(washington_infrared).tif');
rect=[445 625 130 200]; %定义剪切区域
X=imcrop(InImage,rect); %进行图像剪切
subplot(1,2,1); imshow(InImage); title('原图像');
rectangle('Position',rect,'LineWidth',2,'EdgeColor','r'); %将图像的剪切区域标出
subplot(1,2,2); imshow(X); title('剪切图像');
运行结果:
7、图像的空间变换
在MATLAB的图像处理工具箱中提供了一个专门的函数 intransform(),可以通过定义参数实现多种类型的空间变换,包括仿射变换(如平移、缩放、旋转、剪切)、投影变换等。