1.仿射变换理论
仿射变换(Affine Transformation或 Affine Map)是一种二维坐标(x,y)到二维坐标(u,v)之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。仿射变换可以写为线性变换和平移的组合如下:
可以实现平移、缩放、旋转、翻转(对称)、错切(剪切、错位交换,产生弹性物体的变形处理)五种变换,其中前四种变换已经有其他函数可以完美实现,但错切的实现目前只学习到了这一招
2.变换的实现
通过设置变换矩阵,可以实现上述变换功能,效果如图(网图,侵删。错切shear的那两个矩阵有误!!详情见3.)
特别说明一下错切是这样算的:
错切shear,就是以某一系数对单方向的像素点(x,y)进行变换,针对X轴方向做错切变换
针对Y轴方向做错切变换
3.MATLAB实现代码及结果展示
3.0 读取图像
clc,clear,close all
image = imread('C:\Users\HS\Desktop\巴拉巴拉.jpg');
figure,imshow(image);title('原图/No change');
set(gcf,'color','w');set(gca,'linewidth',1,'fontsize',16);
3.1 平移 Translate
%% 1.平移 Translate
T1 = maketform('affine',[1 0 0;0 1 0;50 80 1]); % 变换矩阵
%I1 = imtransform(image,T1); % 仿射变换,大小一样
I1 = imtransform(image,T1,'XData',[1 size(image,2)],...
'YData',[1 size(image,1)]);%大小不一样但有黑边
figure,imshow(I1);title('平移/Translate');
set(gcf,'color','w');set(gca,'linewidth',1,'fontsize',16);
当采用
I1 = imtransform(image,T1,'XData',[1 size(image,2)],...
'YData',[1 size(image,1)]);
生成平移图像,结果是
符合预期的平移。
但当使用
I1 = imtransform(image,T1);
生成平移后的图像,结果
与原图一样,此时MATLAB可以正常运行但提示这样的结果和原图一致,如果需要达到效果,可以采用上面那种方法生成目标图像。
3.2 缩放 Scale about origin–放大
%% 缩放 Scale about origin
%2.放大
%
T2 = maketform('affine',[1.2 0 0;0 1.5 0;0 0 1]); % 放大矩阵
I2 = imtransform(image,T2); % 仿射变换,正常放大
%I2 = imtransform(image,T2,'XData',[1 size(image,2)],...
% 'YData',[1 size(image,1)]); % 尺寸不变 但视野变了
figure,imshow(I2);title('缩放/Scale about origin');
set(gcf,'color','w');set(gca,'linewidth',1,'fontsize',16);
代码里的两种方法生成的结果分别如下
I2 = imtransform(image,T2);
正常放大了图像,结果比原图像素大
I2 = imtransform(image,T2,'XData',[1 size(image,2)],...
'YData',[1 size(image,1)]);
这一句导致的结果与原图像素一样大,但图像里奥特曼明显和原图不一样了
3.3 缩放 Scale about origin–缩小
%% 3.缩小
T3 = maketform('affine',[0.5 0 0;0 0.8 0;0 0 1]);% 变换矩阵
I3 = imtransform(image,T3); % 仿射变换,有一点点黑边
%I3 = imtransform(image,T3,'XData',[1 size(image,2)],...
% 'YData',[1 size(image,1)]);%会有黑色部分
figure,imshow(I3);title('缩放/Scale about origin');
set(gcf,'color','w');set(gca,'linewidth',1,'fontsize',16)