【實踐】數字圖像處理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、得到原始圖像尺寸M、N、d
2、得到新圖像尺寸:M2、N2
3、初始化新圖像矩陣G
4、對新圖像的每一行for i=1:M2
5、對新圖像的每一列for j=1:N2
6、計算新圖像的i行j列對應原圖像的座標x、y
7、檢查x、y的邊界條件
8、將原圖x、y點的灰度值(或者R、G、B顏色值)賦給新圖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、根據四個頂點旋轉後的座標,計算畫布擴展後的大小M2、N2,並計算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!
更多課程知識學習記錄隨後再來吧!
就醬,嘎啦!
注:
人生在勤,不索何獲。