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);

 

 

 

發佈了25 篇原創文章 · 獲贊 60 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章