图像变换(三)

693 阅读4分钟

欧式变换: 欧式变换保持了向量的长度和夹角,相当于我们把一个刚体原封不动地 2 进行移 动和旋转,不改变它自身的样子

相似变换:比它相当于是等距变换和均匀缩放的一个复合,用 S 表示变换矩阵, S 为 3×3 矩阵,比欧式变换多了一个自由度,允许物体进行均匀的缩放 S={{sr11,sr12,tx},{sr21,sr22,ty},{0,0,1}} 左上角 2×2 矩阵为旋转部分,tx 和 ty 为平移因子,它有 4 个自由度,即旋转,x 方向平移,y 方向平移和缩放因子 s。相似变换前后长度比,夹角,虚圆点 I,J 保持不变。

仿射变换与射影变换: 射影变换组成了一个群,这个群被称为射影变换群,n×n 可逆实矩阵称为一般线 性群 GL(n),当把相差非零纯量因子的矩阵都视为等同时,便得到射影映射群, 记为 PL(n)。在平面,射影变换为 PL(3)。 射影变换在平面的变换矩阵形式,也就是一个 3×3 的矩阵。 其中当上面矩阵的最后一行为(0,0,1)时的变换就为仿射变换,在仿射的前 提下,当左上角 2×2 矩阵正交时为欧式变换,左上角矩阵行列式为 1 时为定向 欧式变换。所以射影变换包含仿射变换,而仿射变换包含欧式变换。 至此我们得到了射影变换和仿射变换的关系。 我们将上面的矩阵分成几个部分,如下: 其中大矩形中的 4 个元素组成的整体表示线性变换,比如 scaling(尺度), shearing(剪切)和 ratotion(旋转);椭圆部分表示平移的参数,一个确定在 x 方向上的平移一个确定在 y 方向上的平移;小矩形部分用于产生透视变换。从 这里所以可以理解成仿射等是透视变换的特殊形式。 一个平移变换(t)和一个非均匀变换(A)的复合,A 是可逆矩阵,并不要求是 正交矩阵。 仿射变换的不变量是:平行线,平行线的长度的比例,面积的比例 自由度 12 (9+3) 可以看出,仿射变换就是对图像的旋转+平移+缩放+切变(shear),相比前两 种变换图像的形状发生了改变,但是原图中的平行线仍然保持平行。 射影变换(透视变换) 当图像中的点的齐次坐标的一般非奇异线性变换 射影变换的不变量是:重合关系、长度的交比 自由度 15 (整个矩阵除以 v 右下角为 1) 最后一行为 0 0 0 1 时就是仿射变换

im = imread('D:/cvpr/作业1/实验一/test.jpeg');%读入一幅图
degree=30;%degree为要旋转的角度
[r,c,d]=size(im);  
I=im2double(im);%获取输入图像B的行r、列c和通道数d,为了旋转彩色图像所以有必要得到通道数d
nH=round(r*abs(cosd(degree))+c*abs(sind(degree)));                    %旋转图像后得到的新高度,“round()函数四舍五入“
nW=round(c*abs(cosd(degree))+r*abs(sind(degree)));                    %旋转图像后得到的新宽度
A=zeros(nH,nW,d);         
%定义生成目标图像的行列以及通道数
delX = 50; % 平移量X
delY = 100; % 平移量Y
beis=1.5;
deis=2
tras = [beis 0 0; 0 deis 0; delX delY 1];
M1=[1 0 0;0 -1 0;-0.5*nW 0.5*nH 1 ];                                  %坐标系变换矩阵M1
M2=[cosd(degree) -sind(degree) 0;sind(degree) cosd(degree) 0;0 0 1];  %角度旋转变换矩阵M2,我用的是顺时针方向
M3=[1 0 0;0 -1 0;0.5*c 0.5*r 1];                                      %坐标系变换矩阵M3
    for i=1:nW
        for j=1:nH
            temp=[i j 1]*M1*M2*M3*tras;                                    %得到旋转后的矩阵temp
            y=temp(1,2);                                              %y取矩阵temp的第一行第二列,y对应j,为高度
            x=temp(1,1);                                              %x取矩阵temp的第一行第一列,x对应i,为宽度
            y=round(y);                                               %y四舍五入取整
            x=round(x);                                               %x四舍五入取整
           if(x>=1&&x<=c)&&(y>=1&&y<=r)                               %判断的得到的(x,y)点是否在原图像上
               A(j,i,:)=I(y,x,:);                                     %将原图像的像素点赋值给对应的旋转后图像上的点
           end                                                        %(”有人疑惑为啥不是A(i,j,:)=B(x,y,:);因为i,x对应的是列,即宽,而j,y对应的是行,即高“),我这里以x为横坐标,y为竖向纵坐标
        end
    end
set(0,'defaultFigurePosition',[100,100,1000,500]);%设置窗口大小
set(0,'defaultFigureColor',[1 1 1]);%设置窗口颜色
figure;%打开一个窗口,用来显示(多幅)图像
subplot(1,2,1), imshow(I),axis on ;%显示图片,一行两列,第一幅
subplot(1,2,2), imshow(A),axis on;%显示图片,一行两列,第二幅

image.png