近鄰內插法雙立方內插法

Download Report

Transcript 近鄰內插法雙立方內插法

CH6影像幾何
+ 6.1-數據內插法
+ 6.2-影像內插法
+ 6.3-一般性內插法
+ 6.4-使用空間濾波器放大影像
+ 6.5-縮小
+ 6.6-旋轉
+ 6.7-歪像
+ 很多時候我們希望圖片可以改變大小,形狀或
方向,讓放大影像以符合特定空間大小或用於
印刷,縮小影像以便置於網頁上,旋轉影像以
調整不正確的攝影角度或單純為了某種效果。
+ 何謂內插法:以周圍數值估算函數值的方法稱
為內插法。
+ 先重簡單的問題開始:假設一條長為3的線上面有4個數值要放大成8
個數值,該怎麼做?首先,我們先設放入4個x點在沿著這些x點平均
的放8個a點
+ 實心點為x 空心點為a
+ 原來的x點裡面找出最接近的a點這種方法稱為近鄰內插法
+ 另外一種方式是以直線連結原始函數值,內插方式如圖所示,此稱
為線性內插法。
+
近鄰內插法
線性內插法
+ 上一節提到的方法也可應用於影像。
+ 使用之前的兩種方法可以整合出雙線性內插法。
+ 使用近鄰內插法或雙線性內插法,來計算內插值,
未規定縮放係數必須大於1,縮放係數也可以小
於1,得到的影像陣列會比原始影像來的小。
+ 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:雙線性內插法
+ 由剛剛的圖片結果可知近鄰內插法會產生
難以接受的馬賽克效果,尤其邊緣鋸齒化
的很厲害。雙線性內插法的結果較為平滑,
但無法避免模糊現象。內插法無法預測未
知的數值:數據無法無中生有!我們只能猜測
何種數值最能符合原始數據
+
+ 雖然有剛剛說的那兩種不同的方法,實際上這兩種方法屬於一種
+
+
+
+
+
+
+
更一般性的內插法的特例。
只對行和列兩個方向對影像執行內插法稱為雙立方內插法。
若要在MATLAB中對影像執行雙立方內插法,可在函數imresize中
的方法參數的地方鍵入雙立方('bicubic')。
用此方法上放大攝影師的頭部影像
程式碼:
head4c=imresize(head,4,'bicubic');
imshow(head4c)
結果圖片:
+ 若只想將影像放大為二的次方倍大小,有一個簡
單取巧的方法,就是使用線性濾波器。以下面為
例,假設影像為4X4
+ 程式碼
+ m=magic(4)
+ 第一步就是要先對影像執行零交錯,也就是將影像的
行列間交錯插入數值為零的行與列。設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讓內插點的位置
能剛好位在原始數據值的中間。
+ 濾波器:
+ 可以模擬雙立方內插法。
+ 對攝影師頭部影像執行上述所有指令,先將影
像放大兩倍
+
+
+
+
+
+
+
程式碼:
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
Bilinear
Bicubic
+ 若要放大,可以在對濾波器結果執行零交錯,然後再執行另一個濾
波。
+ 將影像變小也稱為影像最小化。要縮小影像,其中一種方法就
+
+
+
+
+
+
+
是取走間隔的像素。例如要將影像縮成原本的十六分之一,取
走像素(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+(j512).^2<(256.5)^2);
t=~t;
+ 取走大部份的像素來調整影像大小:
+ tr=imresize(t,0.25);
+ 結果如圖一所示。因為這種取走像素的方式,圓形邊線變得
斷斷續續。但如果用其他方法,
+ trc=imresize(t,0.25,'bicubic');
+ 先對影像執行低通濾波,結果便如圖二所示。
圖一
圖二
+ 學會內插法縮放影像後,也可以用同樣的方法來旋轉。
+ 先在將影像視為點的集合來加以旋轉,然而這些方法不適用於
影像處理。影像網格可視為由像素所構成的一組笛卡兒(整數值)
網格,因為我們必須保證旋轉之後,像素仍然必須位在網格上。
+ 將旋轉後的影像用虛線方框框住,我們必須保證旋轉後的影像
再旋轉回去可以落在(0,0)(0,b)(a,0)(a,b)間
+ 將影像視為點的集合來加以旋轉,圖中實心圓代表原始位置,空
心圓代表旋轉後的位置。然而這個方法不適用於影像處理,因為
我們不能保證旋轉後的影像還會落在影像網格上。
+ MATLAB的影像旋轉可使用指令imrotatr和imreaize一樣,方法參數
method可以是近鄰nearest、雙線性bilinear或雙立方bicubic。如果
不設定方法參數,內定值使用的是近鄰內插法。
+ 舉例來說,將攝影師影像旋轉60度。以近鄰和雙立內插法各做一次。
+ c=imread(‘cameraman.tif’);
+ cr=imrotate(c,60);
+ imshow(cr)
+ crc=imrotate(c,60,'bicubic');
+ figure,imshow(crc)
+
近鄰內插法
+ 結果兩個影像看
不出有太大的差
別,不過近鄰內
插法邊緣鋸齒化
的情況比較明顯
雙立方內插法
+ 歪像是指為了藝術或戲劇效果,故意延展或扭曲物體的形狀,
+
+
+
+
只要從某個特定的角度去看這幅畫的時候才能辨識出來。
使用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這個包含了正確骷髏頭的
部分影像:
+ imshow(skull2(200:350,:))