MATLAB--数字图像处理 图像旋转

举报
海轰Pro 发表于 2021/08/06 00:52:44 2021/08/06
【摘要】 图像旋转 图像的旋转其实矩阵的旋转,而整个矩阵的旋转,则可以看出单个坐标的旋转。也就是说,只有我们知道了单个坐标旋转后的坐标,那么就很好得出旋转之后的图像了。这里我们假定旋转后的图像大小不变哈。 对于看旋转原理,这里可以去看一位大佬写的文章,写的很好,慢慢按着他的方法,就会懂旋转的原理,这里我就不多说了。(写的真的很好!)文章链接 自己写的代码: functio...

图像旋转

图像的旋转其实矩阵的旋转,而整个矩阵的旋转,则可以看出单个坐标的旋转。也就是说,只有我们知道了单个坐标旋转后的坐标,那么就很好得出旋转之后的图像了。这里我们假定旋转后的图像大小不变哈。

对于看旋转原理,这里可以去看一位大佬写的文章,写的很好,慢慢按着他的方法,就会懂旋转的原理,这里我就不多说了。(写的真的很好!)文章链接

自己写的代码:

function [newimage]=rotate(img,degree)

%获取图片信息 注意三通道获取完 即定义三个变量
[m,n,dep]=size(img);

%计算出旋转之后,形成一个大矩形的长宽 可以看效果图
rm=round(m*abs(cosd(degree))+n*abs(sind(degree)));
rn=round(m*abs(sind(degree))+n*abs(cosd(degree)));

%定义一个新矩阵,三通道的,存储新图片的信息
newimage=zeros(rm,rn,dep);

%坐标变换 分三步 
m1=[1,0,0;0,1,0;-0.5*rm,-0.5*rn,1];
m2=[cosd(degree),sind(degree),0;-sind(degree),cosd(degree),0;0,0,1];
m3=[1,0,0;0,1,0;0.5*m,0.5*n,1];

%利用循环,对每一个像素点进行变换
for i=1:rm for j=1:rn tem=[i j 1]; tem=tem*m1*m2*m3; x=tem(1,1); y=tem(1,2); x=round(x); y=round(y); if(x>0&&x<=m)&&(y>0&&y<=n) newimage(i,j,:)=img(x,y,:); end end end

end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
 t=imread('a1.jpg');
t1=rotate(t,30);
subplot(1,2,1),imshow(uint8(t)),title('原图');
subplot(1,2,2),imshow(uint8(t1)),title('旋转30度后');

  
 
  • 1
  • 2
  • 3
  • 4

效果图:
在这里插入图片描述

总结:

  • 这里其实很多文章的坐标转换有点不一样,其实只要懂了原理,发现就是一样的,差异就在坐标轴的建立上,上面那篇文章,作者是用了两种坐标轴,一种是高中我们学的一般的,第二种就是我们图像处理常用的,即向下为X,右为Y。
  • 我自己写的算法都是按照图像处理常用的坐标轴,方便点,当然算法也是按照顺时针旋转写的。

文章来源: haihong.blog.csdn.net,作者:海轰Pro,版权归原作者所有,如需转载,请联系作者。

原文链接:haihong.blog.csdn.net/article/details/100622517

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。