Трансформация изображения (2)

MATLAB

Завершите эксперименты по геометрическому преобразованию изображений, в том числе: преобразование вращения, евклидово преобразование, преобразование подобия, аффинное преобразование и проективное преобразование.

Как правило, поворот изображения берет центр изображения в качестве источника и поворачивает на определенный угол, то есть поворачивает все пиксели изображения на один и тот же угол. После поворота размер изображения в целом изменится, то есть изображение, перенесенное за пределы области отображения, может быть обрезано, либо диапазон изображения может быть расширен для отображения всех изображений. Преобразование вращения изображения также может быть представлено матричным преобразованием. Вращение изображения относится к процессу поворота изображения вокруг определенной точки на определенный угол для формирования нового изображения. Конечно, эта точка обычно является центром изображения. Так как он вращается относительно центра, то естественно будет такой атрибут: положение точки от центра до и после поворота не меняется.

По этому свойству мы можем получить соответствие между координатами повернутой точки и исходными координатами. Поскольку координаты исходного изображения берут левый верхний угол в качестве источника, мы сначала преобразуем координаты, чтобы взять центр изображения в качестве источника. Предполагая, что ширина исходного изображения равна w, высота равна h, (x0, y0) — точка в исходных координатах, а точка после преобразованных координат — (x1, y1). Тогда не сложно получить:

x1 = x0 - w/2; y1 = -y0 + h/2;

В новой системе координат, если предположить, что расстояние между точкой (x0, y0) от начала координат равно r, угол между линией между точкой и началом координат и осью x равен b, угол поворота равен a, и повернутая точка ( x1, y1), как показано на рисунке ниже.

Затем следующие выводы:

x0=rcosb, y0=rsinb

x1 = rcos(b-a) = rcosbcosa+rsinbsina=x0cosa+y0sina;

y1=rsin(b-a)=rsinbcosa-rcosbsina=-x0sina+y0cosa;

Как только преобразованные координаты получены, нам нужно только преобразовать эти координаты в исходную систему координат. Еще один момент, на который следует обратить внимание, заключается в том, что длина и ширина повернутого изображения изменятся, поэтому необходимо рассчитать длину и ширину нового изображения. Преобразование вращения: Чтобы повернуть с центральной точкой любого графика в качестве начала координат, нам нужно три шага:

(1) Измените систему координат I на систему координат II.

(2) Повернуть на угол θ \thetaθ в системе координат II

(3) Измените систему координат II на систему координат I.

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);                                                     %定义生成目标图像的行列以及通道数
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;                                    %得到旋转后的矩阵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