以坐标原点为中心旋转的原理:
以任意图形中心点为坐标原点旋转原理:
从上图可知以任意图形中心点为坐标原点旋转我们需要三步:
(1)将坐标系Ⅰ变成坐标系Ⅱ
(2)在坐标系Ⅱ中旋转θθ角
(3)将坐标系Ⅱ变成坐标系Ⅰ
**(1)将坐标系Ⅰ变成坐标系Ⅱ
Matlab编程实现
(1)Matlab自带函数实现图像任意角度旋转
旋转函数介绍:
B=imrotate(A,angle,method, ‘crop’)
angle:旋转角度,单位为度,角度为正值时逆时针旋转
method :该可选参数为imrotate()指定插值方法
‘crop’:裁剪旋转后增大的图像
以上图像旋转的理论概念,具体实现如下:
1,图像读取
2,自由度旋转(本文以90度为例)
> I = imread('F:\deep_learn\data\untest-tiff\sand09_sharpen.png');%
> 读取彩色图 figure(1);
> imshow(I)
> title('sand09');
> %I=rgb2gray(RGB);
> %imshow(I);
> %title('原始灰度图像');
> I2=myimrotate(I,-90); %调用myimrotate()函数旋转-90° figure,imshow(uint8(I2));
> title('旋转-90°:I2');
> I2=uint8(I2)
>%img=uint8(img)
>imwrite(I2,'F:\deep_learn\data\untesttiff\sand09_rotate90.png');
> 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=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
最终实现效果对比图
原图
旋转90度
注:在自动保存图片时出现了空白文本;
需要在代码中添加这一句:
I2=uint8(I2) img=uint8(img)
理论引用:来源:CSDN 原文https://blog.csdn.net/Bryan_QAQ/article/details/78805201