【20200415】數字圖像處理DIP課程課業打卡六之圖像的旋轉——反變換MATLAB代碼理解


叮嘟!這裏是小啊嗚的學習課程資料整理。好記性不如爛筆頭,今天也是努力進步的一天。一起加油進階吧!
在這裏插入圖片描述

一、DIP課程課業打卡六

1、閱讀下面代碼並回答相應問題:

function [im]=rot3_inv(I,delta_ang)  
[M,N,K] = size(I);
a=delta_ang*pi/180;   %%----------(a行)

 
x1=1; x2=M;x3=M;x4=1;            %%----------(b行)
y1=1; y2=1;y3=N;y4=N;
x=[x1,x2,x3,x4];
y=[y1,y2,y3,y4];  
x_2 = round(x*cos(a)-y*sin(a));
y_2 = round(x*sin(a)+y*cos(a));%%----------(c行)
xmin=min(x_2);
xmax=max(x_2);
ymin=min(y_2);
ymax=max(y_2);


if xmin<=0          %%-------(d行)
    deltaX = abs(xmin)+1;
else
    deltaX = 0;
end                  %%-------(e行)
if ymin<=0
    deltaY = abs(ymin)+1;
else
    deltaY = 0;
end

M_2 =xmax- xmin+1;         %%-------(f行)
N_2 =ymax- ymin+1;
im = ones(M_2,N_2,K)*-1;  %%-------(g行) 

for i=1:M_2 
    for j=1:N_2              
        x = round((i-deltaX)*cos(a)+(j-deltaY)*sin(a));
        y = round(-(i-deltaX)*sin(a)+(j-deltaY)*cos(a));     
        if(x>0 && x<=M && y>0 && y<=N)  %%-------(h行)
            im(i,j,:)=I(x,y,:);
        end                                  %%-------(i行)
    end
end
im=uint8(im );

(1) [單選題]
解釋第a行代碼的作用

A、將旋轉的弧度轉化爲角度
B、將旋轉的角度轉化爲弧度
C、計算四個頂點旋轉之後的座標

正確答案:B 

(2) [單選題]
解釋第b行到第c行代碼的作用:

A、計算四個頂點旋轉的弧度
B、計算四個頂點旋轉的角度
C、計算四個頂點旋轉之後的座標

正確答案:C

(3) [單選題]
解釋第d行到第e行代碼的作用:

A、計算行的方向上的偏移量
B、計算新的圖像有幾行
C、計算新的圖像有幾列

正確答案:A 

(4) [單選題]
解釋第f行到第g行代碼的作用:

A、計算新的圖像有幾行、幾列,並得到新的圖像
B、計算新的圖像有幾行、幾列,並初始化新的圖像
C、計算新的圖像有幾列

正確答案:B

(5) [單選題]
解釋第h行到第i行代碼的作用:

A、新圖像的行列座標i和j,經過旋轉逆變換後的座標爲x、y,如果x、y在原圖像的合法範圍內,就將原圖像x、y處的像素值賦給新圖像i、j處的像素
B、原圖像的行列座標i和j,經過旋轉變換後的座標爲x、y,將原圖像i、j處的像素值賦給新圖像x、y處的像素

正確答案:A 

二、知識鞏固

1、關於圖像的旋轉——反變換【效果最好】

反變換方法就是從新圖形的像素座標反過來計算對應原圖像座標點的座標。
即將 圖像的旋轉計算公式:
x1 =x0 cos(a)-y0 sin(a);
y1 =x0 sin(a)+y0 cos(a);
改寫爲:

x0 =x1 cos(a)+y1 sin(a);
y0 =-x1 sin(a)+y1 cos(a);

2、圖像旋轉方法3之反變換法僞代碼

輸入參數:圖像矩陣F,旋轉角度a
輸出參數:旋轉後的圖像矩陣G
處理:
1、獲得圖像尺寸,計算圖像的四個頂點座標。
2、根據旋轉公式:x_2 = round(x*cos(a)-y*sin(a));
y_2 = round(x*sin(a)+y*cos(a)),計算圖像的四個頂點旋轉後的座標。
(x、y爲原始圖像的座標,x_2、y_2爲對應點旋轉後的座標)
3、根據四個頂點旋轉後的座標,計算畫布擴展後的大小M2、N2,並計算x和y方向的偏移量。初始化新圖像G
4、對新圖像G的每一行for i=1:M_2
5、對新圖像G的每一列for j=1:N_2
5.1 根據旋轉反變換公式和x、y方向的偏移量,計算新圖像的像素點G(i,j,:)旋轉前在原圖像F中對應的座標x、y。
5.2 如果(x>0 && x<=M && y>0 && y<=N),則將F(x,y,:)的像素值採樣並且賦給G(i,j,:)

3、圖像旋轉方法3之反變換法代碼實現

function [im]=rot3_inv(I,delta_ang)  
[M,N,K] = size(I);
a=delta_ang*pi/180;  

x1=1; x2=M;x3=M;x4=1;            
y1=1; y2=1;y3=N;y4=N;
x=[x1,x2,x3,x4];
y=[y1,y2,y3,y4];  
x_2 = round(x*cos(a)-y*sin(a));
y_2 = round(x*sin(a)+y*cos(a));
xmin=min(x_2);
xmax=max(x_2);
ymin=min(y_2);
ymax=max(y_2);

if xmin<=0        
    deltaX = abs(xmin)+1;
else
    deltaX = 0;
end                  
if ymin<=0
    deltaY = abs(ymin)+1;
else
    deltaY = 0;
end

M_2 =xmax- xmin+1;         
N_2 =ymax- ymin+1;
im = ones(M_2,N_2,K)*-1; 

for i=1:M_2 
    for j=1:N_2              
        x = round((i-deltaX)*cos(a)+(j-deltaY)*sin(a));
        y = round(-(i-deltaX)*sin(a)+(j-deltaY)*cos(a));     
        if(x>0 && x<=M && y>0 && y<=N)  
            im(i,j,:)=I(x,y,:);
        end                                
    end
end
im=uint8(im );
imshow(I);title('原圖');figure;
imshow(im);title('轉置後');

函數調用:

//此處旋轉角度爲60度;

>> I = imread('football.jpg');
>> [im]=rot3_inv(I,60);

效果展示:

在這裏插入圖片描述

Ending!
更多課程知識學習記錄隨後再來吧!

就醬,嘎啦!

在這裏插入圖片描述

注:
人生在勤,不索何獲。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章