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

图像旋转

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

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

自己写的代码:

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
 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度后');

效果图:
MATLAB--数字图像处理 图像旋转_第1张图片

总结:

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

你可能感兴趣的:(MATLAB--数字图像处理)