2014年3月24日 星期一

HW3 直方圖均化以及邊緣偵測 (Image Enhancement Using Histogram Equalization & Edge detection)

直方圖均化Histogram Equalization
 我們這次可以使用openCV所提供的function來完成H.E,也可以自己寫function來implement出  同樣  的效果,主要的數學公式如下 : 

上述公式中,rk是原始分布的隨機變數r的第k種灰階,nk是第k種灰階的像素數,n是整張影像  的像素數。
上述公式中,L為256,此為(所有灰階的總和數*255)/n,最後再取四捨五入後的值。

 Follow以上的數學運算式,我們就能實做出H.E一樣的效果 !


均勻分布圖 : 
程式實作如下 : 

(左)圖為Source Image,(右)圖為Equalized Image
Histogram comparison :

(左)圖為Source Image 的直方圖,(右)圖為Equalized Image 的直方圖

邊緣偵測 Sobel EdgeDection 
Sobel 的方法就是算出影像的垂直梯度(gradient)與水平梯度兩者取絕對值相加即可,用來加深邊緣的顏色。
影像 與上述兩個kernel作convolution得到


結果如下 : 
                       
程式實作如下 : 

(左)圖為Source Image,(右)圖為EdgeDection Image

結論 : 
這次的作業要我們做的事情,雖然用openCV內建的function就能輕鬆搞定,但是若直接用反而不清楚實際的色值如何運用,透過已知的數學公式,照著式子一步一步做,得到跟內建的結果一樣,也對H.E和edge dection更加了解 !







2014年3月13日 星期四

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




結論

綜觀以上兩種影像處理的演算法,我們知道若是從原圖找出越多的點的灰度值來做運算,所得出來的影像也會越趨近於實際的圖片,失真率也會大大的降低!