背景
几何变换是将图像像素从一个位置映射到另一个位置。 几何变换有五种常见类型:剪切变换、平移变换、缩放变换、旋转变换和投影变换。 它们如图4.1所示。 在该图中,原始图像显示在(A)中,而变换后的图像显示在(B)到(F)中。
几何变换可以表示为原始像素位置和新像素位置之间的矩阵方程。
设f是输入图像。
设g是对图像f应用几何变换时产生的输出图像。
设(w,z)是输入图像f中的像素位置,该位置的像素值表示为f(w,z)。
设(x,y)是输出图像g中对应的像素位置,该位置的像素值表示为g(x,y)。
矩阵形式的常见几何变换
MATLAB中的几何变换MATLAB图像处理工具箱提供了两个可用于对图像执行几何变换的函数:maketform和imtransform。 通常,需要两个主要步骤。
步骤1:使用功能maketform创建所需变换的描述。
步骤2:使用函数imtransform将在步骤1中找到的变换应用于输入图像。
这两个函数的基本语法如下:
tform = maketform(transform_type,T)
g = imtransform(f,tform)
其中T是如表4.1中所述的3×3矩阵,transform_type可以是一个 在“仿射”,“投影”,“框”,“复合”或“自定义”这五个字符串中,f是输入图像,g是输出图像。
4.3.1执行单个仿射变换
a)例如,当图像Lena.bmp顺时针旋转30o时,我们将计算输出图像。
运行此程序并研究其步骤。
修改程序以计算和显示90o,135o和-45o旋转角度的输出图像。
f = imread('Lena.bmp'); % read an image
%% Step 1: Create a description of the desired transform % Create 3-by-3 transformation matrix
alpha = pi/6;
T = [cos(alpha) sin(alpha) 0; -sin(alpha) cos(alpha) 0; 0 0 1] ;
% Create TFORM structure tform = maketform('affine', T);
%% Step 2: Apply the transform on the input image
g = imtransform(f, tform); imshow(g);
问题1:
基于4.1并使用Lena.bmp作为输入图像,编写一个MATLAB程序来执行以下几何转换并显示输出图像。
将输入图像在水平方向上缩放1.5倍,在垂直方向上缩放2倍。 输出图像的大小是多少?
在水平方向上将输入图像剪切0.2倍。
将输入图像在水平方向上平移50个像素,在垂直方向上平移100个像素。实现:
%q1.1
close all;clear all;clc
f = imread('Lena.bmp');
sx=1.5;
sy=2;
T=[sx 0 0
0 sy 0
0 0 1];
t1 = maketform('affine',T);
g = imtransform(f,t1);
figure;
subplot(1,2,1), imshow(f), title('original image');
subplot(1,2,2), imshow(g), title('scale image');
[x,y]=size(g); fprintf('the size of scale image is %.0f, %.0f\n',x,y)
%%
%q1.2
close all;clear all;clc
f = imread('Lena.bmp');
Ts = maketform('affine',[1 0 0; 0.2 1 0; 0 0 1]);
g2 = imtransform(f,Ts);
imshow(g2), title('shear image');
%%
%q1.3
close all;clear all;clc
f = imread('Lena.bmp');
t=[1 0 0;0 1 0;50 100 1];
T = maketform('affine',t);
g3=imtransform(f,T, 'XData', [1 (size(f,2)+t(3,1))], 'YData', [1 (size(f,1)+t(3,2))],'FillValues', 255 );
%图像平移,size(f,2)表示原始图像列数,t(3,1)表示第三行第一列
%g3 = imtransform(f,T);
imshow(g3), title('transformer image');axis on;
对于上述每个变换,编写相应的3×3变换矩阵。
4.3.2组合多个仿射变换多个仿射变换的组合也是仿射变换。 例如,让T1,T2和T3为代表三个不同几何变换的3×3矩阵。 在输入图像上连续应用三个变换等效于应用一个合成变换T,由T=T1*T2*T3
a)对于以下给出的三个几何变换,确定变换类型:旋转,缩放,平移,剪切还是投影?
b)当我们在输入图像Lena.bmp上应用三个转换(首先是T1,然后是T2,最后是T3)时,计算并显示输出图像。
c)计算T1,T2和T3的乘积T。 当将T给出的几何变换应用于输入图像Lena.bmp时,计算输出图像。
d)比较(b)和(c)部分的输出图像。 对结果发表评论。
4.3.3投影变换投影变换由八个参数控制:t11,t12,t13,t21,t22,t23,t31和t32。 如果我们知道输入图像中的四个点和输出图像中的对应的四个点,则可以确定这些参数。
例如,我们将实现一个投影变换,将输入图像中的四个点映射到输出图像中的四个点(图4.3)。 这些点的坐标在表4.2中给出。
4.2中显示了实现此转换的程序。
程序使用“图像处理工具箱”中的一个名为cp2tform的函数来查找用于转换的适当参数。
程序使用imtransform函数将变换应用于输入图像。 在此示例中,我们通过参数“ XData”和“ YData”指定输出图像的大小。
a)运行清单4.2中的程序并研究其输出。
b)为四个输出点输入不同的坐标集,并观察输出图像。
4.4用于几何图像操作的其他MATLAB函数除了MATLAB函数maketform和imtransform之外,MATLAB还提供用于简单几何变换的函数。 为了完整起见,在本节中,我们将研究三个这样的命令
imresize:用于调整图像大小
imrotate:用于旋转图像
imcrop:用于裁剪图像或截取图像的矩形区域。
4.4.1调整图像大小要更改图像大小,请使用imresize功能。 下面的示例说明了调用此函数的不同方法。
f = imread('Lena.bmp'); % read an image
g = imresize(f, 1.25); % enlarge image 1.25 times
g = imresize(f, 0.5); % reduce image by a half
g = imresize(f, [300 600]);% resize image to 300-by-600 pixels
4.4.2旋转图像要旋转图像,请使用旋转功能。 以下示例显示如何使用此功能。
f = imrotate(f, 45); % 逆时针选择45度
f = imrotate(f, -100); % 逆时针%-100度
4.4.3裁切图像要提取图像的矩形区域,请使用裁切功能。 它的语法为
g = imcrop(f,[min_col min_row region_width region_height])
例如,以下命令提取一个区域,其中左列= 40,顶行= 50,宽度= 300,高度= 200:
g = imcrop (f,[40 50 300 200]); imshow(g)
E3。 图像旋转无需使用MATLAB内置函数进行旋转或不变形,就可以编写MATLAB函数以使图像绕其中心顺时针旋转角度为。 该函数的语法为g = rotation_image(f,theta)
提示:假设输入图像(w,z)中的一个点是已知的,那么输出图像中的对应点(x,y)是什么? 用(w,z)来写(x,y)的矩阵方程。
假设输出图像(x,y)中的点是已知的,那么输入图像中的对应点(w,z)是什么? 用(x,y)来写(w,z)的矩阵方程。
步骤1:通过计算四个图像角的新坐标来确定输出图像的大小。
步骤2:针对输出图像中的每个像素位置(x,y)进行循环:o在输入图像中找到对应的点(w,z),o将像素值从输入图像复制到输出图像g(x, y)= f(w,z)。
o如果需要,使用最近邻像素插值。