今天上了图像处理的上机课,结果因为没选计算机图形学的课,好像别人都会作业的算法就我不会.........于是赶紧学习了一下相关的资料,终于实现了这个函数....
参考文章:https://blog.csdn.net/Bryan_QAQ/article/details/78805201

原理分析

首先在matlab里,图像都是以矩阵的形式存储的,每个元素的数字范围为0到255,对图像做处理实际上就是对这个矩阵做处理。所以旋转图像其实就是把矩阵中的各个元素经过某个变换矩阵变换,使其移动到新的位置的过程。所以首先可以画出一个坐标系及点P0和P1,找到它们之间的关系。

可以看到在一个给定的坐标系中,P0可以通过一个变换矩阵变成P1

所以接下来我们就要把坐标建立在图片的中心,然后对其做变换,使其可以绕中心旋转

可以看到旋转后图片的宽和高也会改变,所以还要记录这些值
最终还要将坐标系换回原来的坐标系

所以对该图像的操作大致为三步

坐标系变换

在变换后的坐标中作旋转操作

变回原来的坐标系

可以由下面的矩阵变换表示:

代码实现

代码:

function [img_rotate]=my_img_rotate(img,angle)
[row,col,d]=size(img);
newHei=round(row*abs(cosd(angle))+col*abs(sind(angle)));    %旋转后的高
newWid=round(row*abs(sind(angle))+col*abs(cosd(angle)));    %旋转后的宽
img_rotate=zeros(newHei,newWid,d);                          %旋转后的画布,0表示黑色
MAT1=[1 0 0;0 -1 0;-0.5*newWid 0.5*newHei 1];                 %坐标系变换矩阵
MAT2=[cosd(angle) -sind(angle) 0;sind(angle) cosd(angle) 0;0 0 1];  %角度变换矩阵
MAT3=[1 0 0;0 -1 0;0.5*col 0.5*row 1];                      %坐标系变换矩阵
    for i=1:newWid
        for j=1:newHei
            temp=[i j 1]*MAT1*MAT2*MAT3;                        
            width=temp(1,1);
            width=round(width);
            height=temp(1,2);
            height=round(height);
            if (width>=1&&width<=col)&&(height>=1&&height<=row)
                img_rotate(j,i,:)=img(height,width,:);
            end
        end
    end
end

效果图:

Last modification:July 12th, 2020 at 01:15 am