HW2 圖像縮放與旋轉程式撰寫 (Image Scaling And Rotated Programming )
( 1 ) 使用下列內插演算法實作影像大小縮放調整程式
( a ) Neareast Neighbor Interpolation
( b ) Bilinear Interpolation
( c ) Bicubic Interpolation ( 加分)
( 2 ) 撰寫圖像轉程式
Neareast Neighbor Interpolation
主要演算法如下 :
g ( u , v ) 為 scaling 完之後的影像,NNL的演算法是必須透過 g ( u , v ) 推導回原圖所對應到的 影像 f ( x , y ) 點,但 x 和 y 並不保證醫定是整數值,有可能是 float 或 double 的值,所以我們必須找到「最鄰近」的整數值,所以我們將 x 和 y 分別加上 0.5,並利用處理過的 f ( x , y ) 的灰度值放入到 g ( u , v ) 中。
Bilinear Interpolation
主要演算法如下 :
相較於NNL,Bilinear 所 scaling 出來的影像的失真度會大幅縮小,原因從演算法就能看出端倪,我們必須算出鄰近 p 的最近4個點的灰度值,並利用以下公式 :
f ( p ) = ( 1 - alpha ) * ( 1 - beta ) * f( a ) + ( alpha ) * ( 1 - beta ) * f( b ) + ( 1 - alpha ) * ( beta ) * f( c ) + ( alpha ) * ( beta ) * f( d )
圖(左)是 NNL 所設計出來的眼睛影像,圖(右)則是 Bilinear 設計出來的眼睛影像,我們很明顯地從眼球的鋸齒狀看出 Bilinear 的優化效果。
圖(左)是 NNL 所設計出來的肩膀影像,圖(右)則是 Bilinear 設計出來的肩膀影像,我們很明顯的看出肩膀弧度的位置,鋸齒狀的差異。
Image Rotated
主要公式如下 :
套用以上的公式,我們可以很簡單的做出旋轉圖片的效果。
30-degree :
90-degree :
180-degree
結論
綜觀以上兩種影像處理的演算法,我們知道若是從原圖找出越多的點的灰度值來做運算,所得出來的影像也會越趨近於實際的圖片,失真率也會大大的降低!