图像几何变化之旋转

博客来源:https://blog.csdn.net/Bryan_QAQ/article/details/78805201

以坐标原点为中心旋转的原理:

点p0绕坐标原点逆时针方向旋转θθ角度得到点p1

以任意图形中心点为坐标原点旋转原理:

从上图可知以任意图形中心点为坐标原点旋转我们需要三步: (1)将坐标系Ⅰ变成坐标系Ⅱ (2)在坐标系Ⅱ中旋转θθ角 (3)将坐标系Ⅱ变成坐标系Ⅰ
(1)将坐标系Ⅰ变成坐标系Ⅱ

(2)在坐标系Ⅱ中旋转θθ角

见上面以坐标原点为中心旋转的原理

(3)将坐标系Ⅱ变成坐标系Ⅰ

Matlab编程实现

(1)Matlab自带函数实现图像任意角度旋转
旋转函数介绍:

B=imrotate(A,angle,method, ‘crop’)
angle :旋转角度,单位为度,角度为正值时逆时针旋转
method :该可选参数为imrotate()指定插值方法
‘crop’:裁剪旋转后增大的图像

  close all;
  clear all;
  clc;
  
  I=imread('C:\Users\luoqi\Desktop\图片\影院\file.jpg');
  I1=imrotate(I,60);
  I2=imrotate(I,60,'crop');
  I3=imrotate(I,60,'bilinear','crop');
  figure
  subplot(141),imshow(I);
  subplot(142),imshow(I1);
  subplot(143),imshow(I2);
  subplot(144),imshow(I3);
(2)自编myimrotate()函数实现图像任意角度旋转
  function [ A ] = myimrotate(B,degree)                                 %定义旋转函数,degree为要旋转的角度
  [r,c,d]=size(B);                                                      %获取输入图像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=uint8(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,:)=B(y,x,:);                                     %将原图像的像素点赋值给对应的旋转后图像上的点
             end                                                        %(”有人疑惑为啥不是A(i,j,:)=B(x,y,:);因为i,x对应的是列,即宽,而j,y对应的是行,即高“),我这里以x为横坐标,y为竖向纵坐标
          end
      end
  end
posted @ 2020-08-05 10:52  luoqi123456  阅读(718)  评论(0编辑  收藏  举报