【實踐】數字圖像處理DIP課程課業打卡實驗2 圖像幾何變換


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

一、實驗目的

1、通過編程實現圖像縮放算法、鏡像算法,加深對於該算法的原理和工作過程的理解;
2、理解圖像仿射變換的工作原理。瞭解各種不同形式的仿射變換矩陣。
3、通過編程實現圖像旋轉、仿射變換。

二、實驗內容

在這裏插入圖片描述

1、實現圖像水平鏡像的代碼

參考測試代碼:

I  =imread('..\..\im\pepper1.bmp'); 
[im]=mirror_horizontal(I);
imshow(I);figure, imshow(im)

(備註:將執行正確的代碼粘貼在此處,核心代碼要求有註釋)

% I =imread('im\pepper1.bmp'); 
% [im]=mirror_horizontal(I);
% imshow(I);figure, imshow(im)
 
function [im]=mirror_horizontal(I)
[M,N,K] = size(I);
J=zeros(M,N,K);
for i = 1:M
    for j = 1:N
        J(i,N-j+1,:)=I(i,j,:);
    end
end
im=uint8(J);

在這裏插入圖片描述

2、實現直角座標系中的圖像縮小算法

要求:
算法實現爲函數[im]= rsz_S1 (I,times1,times2),其中I爲讀入的圖像矩陣;times1和times2分別爲圖像豎直方向和水平方向的縮小比例。

參考測試代碼:

I =imread('.\han.jpg'); 
[im]= rsz_S1 (I,0.3,0.5); 
imshow(I);figure, imshow(im); 

算法僞代碼如下:

輸入參數:圖像矩陣F,行縮小比例k1,列縮小比例k2
輸出參數:縮小後的矩陣G
處理:
1、得到原始圖像尺寸MN、d
2、得到新圖像尺寸:M2N2
3、初始化新圖像矩陣G
4、對新圖像的每一行for i=1:M2
5、對新圖像的每一列for j=1:N2
6、計算新圖像的i行j列對應原圖像的座標x、y
7、檢查x、y的邊界條件
8、將原圖x、y點的灰度值(或者RGB顏色值)賦給新圖i、j點

(備註:將執行正確的代碼粘貼在此處,核心代碼要求有註釋)

% I =imread('im\han.jpg'); 
% [im]= rsz_S1 (I,0.3,0.5); 
% imshow(I);figure, imshow(im); 
 
 
function [im_rsz_l]= rsz_S1 (I,Kr,Kc)
[M,N,K] = size(I);
M2=round(M*Kr);
N2=round(N*Kc);
 
J=zeros(M2,N2,K);
for i=1:M2
    for j=1:N2
        x=round(i/Kr);
        y=round(j/Kc);
        if x>M
            x=M;
        end
        if y>N
            y=N;
        end
        if x<1
            x=1;
        end
        if y<1
            y=1;
        end
        
        J(i,j,:)=I(x,y,:);
    end
end
 
im_rsz_l=uint8(J);
        
end
 

在這裏插入圖片描述

3、實現基於仿射變換的圖像變換代碼。
要求:
算法實現爲函數 [im]=aff(I,T),其中I爲讀入的圖像矩陣;T爲仿射變換矩陣。函數文件爲aff.m

參考測試代碼1:

I =imread('..\..\im\peppers.png'); 
dy=0.5;
A=[1 0 0;dy 1 0;0 0 1];                     
[im]=aff(I,A) ;                             
figure,imshow(I);figure, imshow(im);

參考測試代碼2:

I =imread('..\..\im\peppers.png'); 
delta_ang = 30;
q=delta_ang*pi/180;
A=[cos(q) -sin(q) 0;sin(q) cos(q) 0;0 0 1];  %求旋轉變換矩陣
[im]=aff(I,A) ;                          
figure,imshow(I);figure, imshow(im);

算法僞代碼如下:

輸入參數:圖像矩陣F,仿射變換矩陣A
輸出參數:變換後的圖像矩陣G
處理:
1、求仿射變換A的逆變換矩陣InvA。
2、獲得圖像尺寸,計算圖像的四個頂點的x、y座標 。
3、根據仿射變換公式:rst=A*[x; y;1],計算圖像的四個頂點旋轉後的座標。(x、y爲原始圖像的座標,rst(1,:)是旋轉後的行座標,rst(2,:)是旋轉後的列座標)
4、根據四個頂點旋轉後的座標,計算畫布擴展後的大小M2N2,並計算x和y方向的偏移量deltaX、deltaY。初始化新圖新G
5、對新圖像G的每一行for i=1:M_2
6、對新圖像G的每一列for j=1:N_2
     6.1 根據仿射變換的逆變換矩陣InvA,計算像素點G(i,j,:)旋轉前在原圖像F中的座標x、y(rst=InvA*[i-deltaX ;j-deltaY; 1 ])6.2 如果(x>0 && x<=M && y>0 && y<=N),則將F(x,y,:)的像素值採樣並且賦給G(i,j,:)

(備註:將執行正確的代碼粘貼在此處,核心代碼要求有註釋)

% 參考測試代碼1% I =imread('im\peppers.png'); 
% dy=0.5;
% A=[1 0 0;dy 1 0;0 0 1];                     
% [im]=aff(I,A) ;                             
% figure,imshow(I);figure, imshow(im);
% 
% 參考測試代碼2% I =imread('im\peppers.png'); 
% delta_ang = 30;
% q=delta_ang*pi/180;
% A=[cos(q) -sin(q) 0;sin(q) cos(q) 0;0 0 1];  %求旋轉變換矩陣
% [im]=aff(I,A) ;                          
% figure,imshow(I);figure, imshow(im);


function  [im]=aff(I,A)
[M,N,K] = size(I);

InvA=inv(A);    %%矩陣求逆;

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];
d1=ones(1,4);    %%產生一個1*4的矩陣
rst=A*[x;y;d1];
rst=round(rst);

xmin=min(rst(1,:));   %rst(1,:)是四個定點的行座標x';
xmax=max(rst(1,:));
ymin=min(rst(2,:));   %rst(2,:)是四個定點的列座標y';
ymax=max(rst(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              
        rst = InvA*[i-deltaX j-deltaY 1]';
       
        x=rst(1);
        y=rst(2);
        x=round(x);
        y=round(y);

 %%新圖像的行列座標i和j,經過旋轉逆變換後的座標爲x、y,
 %%如果x、y在原圖像的合法範圍內,就將原圖像x、y處的像素值賦給新圖像i、j處的像素;
        if(x>0 && x<=M && y>0 && y<=N)  
            im(i,j,:)=I(x,y,:);
        end                                 
    end
end
im=uint8(im);

end

在這裏插入圖片描述
在這裏插入圖片描述

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

就醬,嘎啦!

在這裏插入圖片描述

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

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