2014年6月13日 星期五

Visible Watermarking

這次我們要實作出浮水印的效果,拿 lena.bmp 當作 一開始讀入的檔案


並且使用小畫家自製的學號圖檔 1001527.png 來當作欲增加的浮水印

兩張圖形我是都設成 256*256 的大小,避免崩潰。
透過  ( 0.4 * 1001527.png ) + ( 0.9 * lena.bmp ) 來調整到自己喜歡的感覺,得到的結果即為浮水印後的樣貌。





2014年6月5日 星期四

RGB to HSI Image Transformation & Skin Detection

根據以下的轉換公式,我們可以算出原圖的hue,saturation以及intensity!

我的做法是將 h,s,i 個別開一個Mat array 來儲存,每得到一組h,s,i的值後就將value放進去.
以下是以 256*256的 lena.bmp 來實做!
Convert to HSI format :



Skin Detection
根據saturation的值來判斷哪些地方是屬於膚色,我選擇的圖片若不乘上255,範圍大概落在0.24~0.4之間
以下是以270*185的hand.jpg來實做
最後得到結果:





2014年5月11日 星期日

HW4 Discrete Fourier Transform and Frequency Filtering


第一步  :  讀入256 x 256 pixel 灰階 lena.bmp 原圖


第二步 : 將讀入的原圖做 ( 2 x M , 2 x N  ) 的 padding
第三步 : 將奇數點 x ( - 1 )


以下是 Discrete Fourier Transform 的公式

第四步 : 對 padding 完的圖做 DFT
並且已 spectrum 及 phase angle 表示

spectrum : 



將做完DFT的實部與虛部分別存在 float type 的 array中,並且透過以下的公式


得到頻譜


phase angle :  


frequency domain  & spatial domain :

















































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




結論

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