2014年3月26日 星期三

Histogram Equalization & Edge detection

作業內容:
Image Enhancement Using Histogram Equalization & Edge detection


(一)Histogram Equalization(直方圖均衡化)


顧名思義,將原本的圖片均衡化,簡單來講每張圖上,散布著各種不同顏色的pixel所組成,把每個pixel的值,
讀出來加以轉化,即可得到我們想要的結果,Histogram Equlization利用把原本某一塊機率函數平均分配到所有顏色上面,會得到一張對比度較高的圖片,如下圖,Origianl的顏色分布原本是比較不均勻的,經過Equlization後可以得到一個對比度較強的圖片
 Histogram Equalization 的步驟如下
1.    建立影像的 histogram(及每個顏色的機率分布,稱作PDF).
2.     計算影像的 cumulative distribution function(即CDF,轉換成機率累積分布).
3.     根據 CDF 以及 cumulative equalization 公式 計算灰階亮度的對應關係.(此題為累積機率*255)
4.     根據對應關係計算出新的灰階亮度.

 實際程式結果demo:
左邊的為Source image   右邊的為 Equalize後的image


(二) Edge detection using Sobel Operators


Edge detection 的目的是要找出灰階有劇烈變化的邊界

理論上邊界處之灰階會呈現階梯狀變化(step edge)或直線狀變化(line edge)












Sobel 的方法就是算出影像的垂直梯度(gradient)與水平梯度,兩者取絕對值相加即可。
















開根號計算比較麻煩,所以通常用取絕對值相加

實際程式結果demo:

左邊為原本的image ,右邊為邊界化後的image



2014年3月13日 星期四

HW2_image 縮放旋轉實作

作業題目 :

利用nearest 和 bilinear兩人種演算法實做image 的 scale 和image rotate 的implement

使用ide:vs2013
語言:c++.net
實做時間:約8小時

=========================================================

使用說明:




















點選file->open 
選擇Lena.bmp 點選確認




















點擊視窗上方的algorithm可以選擇
nearest or bilinear 
預設為nearest 
拉取 x和y的trackbar 調整 image的 縮放















拉取 rotate的trackbar 調整 image的旋轉角度

















=========================================================

敘述演算法實做:

Nearnest:

放大的圖經由比例的換算對應到某一點上
由於不會剛好對準某一點,所以這個演算法是找最接近的某一點, 我使用的方法是用 
x=(int)x+0.5
y=(int) y+0.5
時間複雜度為O(n^2)
方法簡單 但是不準確 放大看可以發現邊邊上有小鋸齒狀態





Bilinear:

跟上面一種演算法相同
不過這次對應到的點 取四周最靠近的4個點做內插,得到的圖較第一種準確
時間複雜度為O(16n^2)













 左邊為Nearest Neighbor            
    右邊為  Bilinear interpolation








旋轉:

高中數學都有學過旋轉的公式為
X'=X *COSQ - Y*SINQ
Y'=X*SINQ+ Y*COSQ
但是如果用這個方法算過去的話 ,因為會對應到非整數的部分,所以會讓圖錯誤

所以要逆向操作

利用反矩陣的概念我們可以用新的座標推得舊的座標


X= X' *COSQ +Y'*SINQ
Y= X'*(-SINQ) +Y'*COSQ

如此就可以得知原本的座標
有一個重要的地方
我剛開始在寫兩層for迴圈時用x=0 ,y=0開始算
把旋轉的軸心放在了(0,0)的位置了 造成debug的困難


就這個例子  應該吧旋轉軸心放在圖的中心點 我設定為
Width/2 和height/2的位置 ,用此點旋轉才可以得到正確的圖

這裡mapping 回去使用NN的方式


=========================================================

Conclusion:


學習了.net視窗使用和pixel處理的概念
學習使用nearest 和Bilinear演算法的概念與實做上的問題
學習到圖片旋轉和軸心的處理問題
複習反矩陣的運算和cos sin ,徑度和角度轉換的使用


NN寫法相對比較快速,但準確較低
Bilinear寫法相對較慢,但準確率較高