MATLAB影象旋轉原始碼

換個角度看自己發表於2017-12-18

程式碼如下:

程式碼如下:

clear;
clc;
%要旋轉的角度,旋轉方向為順時針
jiaodu=input('請輸入角度:');                       
[filename,pathname]=uigetfile({'*jpg;*.bmp;*.jpeg;*.png;'},'load?image');
fpath=fullfile(pathname,filename);
img=imread(fpath);
img=rgb2gray(img);
imshow(img);                    %這裡y為變換後影象的高度,x為變換後影象的寬度
[h w]=size(img);


theta=jiaodu/180*pi;
rot=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1]; 
pix1=[1 1 1]*rot;               %變換後影象左上點的座標
pix2=[1 w 1]*rot;               %變換後影象右上點的座標
pix3=[h 1 1]*rot;               %變換後影象左下點的座標
pix4=[h w 1]*rot;               %變換後影象右下點的座標

%變換後影象的高度
height=round(max([abs(pix1(1)-pix4(1))+0.5 abs(pix2(1)-pix3(1))+0.5]));   
%變換後影象的寬度  
width=round(max([abs(pix1(2)-pix4(2))+0.5 abs(pix2(2)-pix3(2))+0.5]));      
imgn=zeros(height,width);

%取得y方向的負軸超出的偏移量
delta_y=abs(min([pix1(1) pix2(1) pix3(1) pix4(1)]));     
%取得x方向的負軸超出的偏移量       
delta_x=abs(min([pix1(2) pix2(2) pix3(2) pix4(2)]));            


for i=1-delta_y:height-delta_y
    for j=1-delta_x:width-delta_x
        %用變換後影象的點的座標去尋找原影象點的座標,
        pix=[i j 1]/rot;                                                                             
        %否則有些變換後的影象的畫素點無法完全填充
        float_Y=pix(1)-floor(pix(1)); 
        float_X=pix(2)-floor(pix(2));    
       
        if pix(1)>=1 && pix(2)>=1 && pix(1) <= h && pix(2) <= w     
            pix_up_left=[floor(pix(1)) floor(pix(2))];          %四個相鄰的點
            pix_up_right=[floor(pix(1)) ceil(pix(2))];
            pix_down_left=[ceil(pix(1)) floor(pix(2))];
            pix_down_right=[ceil(pix(1)) ceil(pix(2))]; 
        
            value_up_left=(1-float_X)*(1-float_Y);              %計算臨近四個點的權重
            value_up_right=float_X*(1-float_Y);
            value_down_left=(1-float_X)*float_Y;
            value_down_right=float_X*float_Y;
            imgn(i+delta_y,j+delta_x)=value_up_left*img(pix_up_left(1),pix_up_left(2))+...            
            value_up_right*img(pix_up_right(1),pix_up_right(2))+ ...
            value_down_left*img(pix_down_left(1),pix_down_left(2))+ ...
            value_down_right*img(pix_down_right(1),pix_down_right(2));
        end          
    end
end
figure,
subplot(121);
imshow(img);
subplot(122);
imshow(uint8(imgn))

結果如下:

相關文章