matlab实现图像旋转

要求

图像是彩色的;旋转后,原图像的四个角点应在新图像的四条边上(即新图像的大小是包含原图像旋转后的最小矩形);旋转的角度可以是 0~ 360度;函数的调用形式是 J=myrotate(I,angle);不允许使用 imrotate。

 

原理

原理部分仅仅是代码中所体现的,具体推导过程参看 百度文库 图像旋转

 

下图显示新图像与原图像的长宽关系,注意如果旋转角度是120度,则需要取绝对值,具体参见下面源代码。

 

下图显示原图像旋转后的点与原图像点的对应关系,以按此公式求得新图像每一点对应的原图像点。

旋转后,由于图像点可能是非整数,出现像素空洞问题,故需要进行插值法,下面选用最近邻插值法。

 

 

源代码

function img_rotate=my_img_rotate_chazhi(img1,angle)
% 旋转后图像=my_img_rotate(原图像,旋转角度) 0<旋转角度<360
% 查找新图对应的原图像素点
% 最邻近点插值方法

[h,w,d]=size(img1);
radian=angle/180*pi;
cos_val	= cos(radian);
sin_val	= sin(radian);

w2=round(abs(cos_val)*w+h*abs(sin_val));
h2=round(abs(cos_val)*h+w*abs(sin_val));
img_rotate	= uint8(zeros(h2,w2,3));	%像素是整数


for x=1:w2
    for y=1:h2
        x0 = uint32(x*cos_val + y*sin_val -0.5*w2*cos_val-0.5*h2*sin_val+0.5*w);
        y0= uint32(y*cos_val-x*sin_val+0.5*w2*sin_val-0.5*h2*cos_val+0.5*h);    
        
        x0=round(x0);         %最邻近插值
        y0=round(y0);         %最邻近插值
        if x0>0 && y0>0&& w >= x0&& h >= y0
            img_rotate(y,x,:) = img1(y0,x0,:);
        end
    end
end
%I = imread('C:\Users\Desktop\love.jpg')
%I2=my_img_rotate(I,30);
%figure,imshow(I2);

 

 

 

  • 14
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值