250 likes | 558 Views
影像處理. CH6 影像幾何. 6.1- 數據內插法 6.2- 影像內插法 6.3- 一般性內插法 6.4- 使用空間濾波器放大影像 6.5- 縮小 6.6- 旋轉 6.7- 歪像. 很多時候我們希望圖片可以改變大小,形狀或方向,讓放大影像以符合特定空間大小或用於印刷,縮小影像以便置於網頁上,旋轉影像以調整不正確的攝影角度或單純為了某種效果。 何謂內插法 : 以周圍數值估算函數值的方法稱為 內插法。. 6.1- 數據內插法.
E N D
影像處理 CH6影像幾何
6.1-數據內插法 • 6.2-影像內插法 • 6.3-一般性內插法 • 6.4-使用空間濾波器放大影像 • 6.5-縮小 • 6.6-旋轉 • 6.7-歪像
很多時候我們希望圖片可以改變大小,形狀或方向,讓放大影像以符合特定空間大小或用於印刷,縮小影像以便置於網頁上,旋轉影像以調整不正確的攝影角度或單純為了某種效果。 • 何謂內插法:以周圍數值估算函數值的方法稱為內插法。
6.1-數據內插法 • 先重簡單的問題開始:假設一條長為3的線上面有4個數值要放大成8個數值,該怎麼做?首先,我們先設放入4個x點在沿著這些x點平均的放8個a點 • 實心點為x 空心點為a • 原來的x點裡面找出最接近的a點這種方法稱為近鄰內插法 • 另外一種方式是以直線連結原始函數值,內插方式如圖所示,此稱為線性內插法。 • 近鄰內插法 線性內插法
6.2影像內插法 • 上一節提到的方法也可應用於影像。 • 使用之前的兩種方法可以整合出雙線性內插法。 • 使用近鄰內插法或雙線性內插法,來計算內插值,未規定縮放係數必須大於1,縮放係數也可以小於1,得到的影像陣列會比原始影像來的小。
MATLAB的函數imresize可以進行這樣的運算,用法如下MATLAB的函數imresize可以進行這樣的運算,用法如下 • resize(A,k, 'method' ) • A是任何型態的影像,k是縮放係數,方法('method') 則可為近鄰('nearest')或雙線性('bilinear')。 • imresize還有另一種用法 • resize(A,[m,n],'method') • [m,n]是縮放後輸出結果大小。 • 再看看幾個例子,使用係數4放大攝影師的頭部影像 • 程式碼 • c=imread('cameraman.tif'); • head=c(33:96,90:153); • imshow(head) • head4n=imresize(head,4,'nearest');figure,imshow(head4n) • head4b=imresize(head,4,'bilinear');imshow(head4b)
圖片1:原始抓到的攝影師的頭部 圖片2:近鄰內插法 圖片3:雙線性內插法
由剛剛的圖片結果可知近鄰內插法會產生難以接受的馬賽克效果,尤其邊緣鋸齒化的很厲害。雙線性內插法的結果較為平滑,但無法避免模糊現象。內插法無法預測未知的數值:數據無法無中生有!我們只能猜測何種數值最能符合原始數據由剛剛的圖片結果可知近鄰內插法會產生難以接受的馬賽克效果,尤其邊緣鋸齒化的很厲害。雙線性內插法的結果較為平滑,但無法避免模糊現象。內插法無法預測未知的數值:數據無法無中生有!我們只能猜測何種數值最能符合原始數據
6.3一般性內插法 • 雖然有剛剛說的那兩種不同的方法,實際上這兩種方法屬於一種更一般性的內插法的特例。 • 只對行和列兩個方向對影像執行內插法稱為雙立方內插法。 • 若要在MATLAB中對影像執行雙立方內插法,可在函數imresize中的方法參數的地方鍵入雙立方('bicubic')。 • 用此方法上放大攝影師的頭部影像 • 程式碼: • head4c=imresize(head,4,'bicubic'); • imshow(head4c) • 結果圖片:
6.4-使用空間濾波器放大影像 • 若只想將影像放大為二的次方倍大小,有一個簡單取巧的方法,就是使用線性濾波器。以下面為例,假設影像為4X4 • 程式碼 • m=magic(4)
第一步就是要先對影像執行零交錯,也就是將影像的行列間交錯插入數值為零的行與列。設m2為零交錯版的m第一步就是要先對影像執行零交錯,也就是將影像的行列間交錯插入數值為零的行與列。設m2為零交錯版的m • m2=zeroint(m)
現在可以對矩陣執行空間濾波,置換這些數值為零的行與列現在可以對矩陣執行空間濾波,置換這些數值為零的行與列 • 上面的兩個濾波器分別可執行近鄰內插法與雙線性內插法。可用下列指令來測試
程式碼: • filter2([1 1 0;1 1 0;0 0 0],m2) • 近鄰內插法: • filter2([1 2 1;2 4 2;1 2 1]/4,m2) • 雙線性內插法:
然後可用下列指令來檢驗 • m2b=imresize(m,[8,8],'nearest');m2b m2b=imresize(m,[7,7],'bilinear');m2b
第二個指令只將影像放大為7X7讓內插點的位置能剛好位在原始數據值的中間。第二個指令只將影像放大為7X7讓內插點的位置能剛好位在原始數據值的中間。 • 濾波器: • 可以模擬雙立方內插法。 • 對攝影師頭部影像執行上述所有指令,先將影像放大兩倍
程式碼: • imshow(hz) • imshow(filter2([1 1 0;1 1 0;0 0 0],hz)/255) • imshow(filter2([1 2 1;2 4 2;1 2 1]/4,hz)/255) • bfilt=[1 4 6 4 1;4 16 24 16 4;6 24 36 24 6;4 16 24 16 4;1 4 6 4 1]/64; • imshow(filter2(bfilt,hz)/255) • 圖片 • Zero interlraving Nearest nrighbor BilinearBicubic • 若要放大,可以在對濾波器結果執行零交錯,然後再執行另一個濾波。
6.5-縮小 • 將影像變小也稱為影像最小化。要縮小影像,其中一種方法就是取走間隔的像素。例如要將影像縮成原本的十六分之一,取走像素(i,j),其中i和j都必須是4的倍數。這種方法稱為次取樣 • 然而,對於影像的高頻部分,這種方法的效果並不好。以下面白色方形內有一個圓形的影像為例。 • t=zeros(1024,1024); • u=[1:1024]'; • i=u*ones(1,1024); • j=i'; • t=((255.5)^2<(i-512).^2+(j-512).^2) & ((i-512).^2+(j-512).^2<(256.5)^2); • t=~t;
取走大部份的像素來調整影像大小: • tr=imresize(t,0.25); • 結果如圖一所示。因為這種取走像素的方式,圓形邊線變得斷斷續續。但如果用其他方法, • trc=imresize(t,0.25,'bicubic'); • 先對影像執行低通濾波,結果便如圖二所示。 圖一 圖二
6.6-旋轉 • 學會內插法縮放影像後,也可以用同樣的方法來旋轉。 • 先在將影像視為點的集合來加以旋轉,然而這些方法不適用於影像處理。影像網格可視為由像素所構成的一組笛卡兒(整數值)網格,因為我們必須保證旋轉之後,像素仍然必須位在網格上。 • 將旋轉後的影像用虛線方框框住,我們必須保證旋轉後的影像再旋轉回去可以落在(0,0)(0,b)(a,0)(a,b)間
將影像視為點的集合來加以旋轉,圖中實心圓代表原始位置,空心圓代表旋轉後的位置。然而這個方法不適用於影像處理,因為我們不能保證旋轉後的影像還會落在影像網格上。將影像視為點的集合來加以旋轉,圖中實心圓代表原始位置,空心圓代表旋轉後的位置。然而這個方法不適用於影像處理,因為我們不能保證旋轉後的影像還會落在影像網格上。 • MATLAB的影像旋轉可使用指令imrotatr和imreaize一樣,方法參數method可以是近鄰nearest、雙線性bilinear或雙立方bicubic。如果不設定方法參數,內定值使用的是近鄰內插法。
舉例來說,將攝影師影像旋轉60度。以近鄰和雙立內插法各做一次。舉例來說,將攝影師影像旋轉60度。以近鄰和雙立內插法各做一次。 • c=imread(‘cameraman.tif’); • cr=imrotate(c,60); • imshow(cr) • crc=imrotate(c,60,'bicubic'); • figure,imshow(crc) • 近鄰內插法 雙立方內插法 • 結果兩個影像看 不出有太大的差 別,不過近鄰內 插法邊緣鋸齒化 的情況比較明顯
6.7-歪像 • 歪像是指為了藝術或戲劇效果,故意延展或扭曲物體的形狀,只要從某個特定的角度去看這幅畫的時候才能辨識出來。 • 使用MATLAB指令: • a=imread('AMBASSADORS.JPG'); • a=rgb2gray(a); • imshow(a) 原圖
我們先單獨取出骷髏頭的影像: • 程式碼: • skull=a(566:743,157:586); • figure,imshow(skull) • 取出的骷髏頭 • 要取消歪像的效果必須將骷髏頭以順時針方現稍微旋轉,然後縱向展開來。這個動作可以由下面的指令完成: • skull2=imresize(imrotate(skull,-22,'bicubic'),[500,150],'bicubic');
最後,檢視skull2這個包含了正確骷髏頭的部分影像:最後,檢視skull2這個包含了正確骷髏頭的部分影像: • imshow(skull2(200:350,:))