深度学习——图像旋转

以坐标原点为中心旋转的原理:
在这里插入图片描述
在这里插入图片描述
以任意图形中心点为坐标原点旋转原理:
在这里插入图片描述
从上图可知以任意图形中心点为坐标原点旋转我们需要三步:
(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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值