圖像銳化 邊緣檢測的一些基礎知識
互聯網興起, 生活節奏飛速,快餐成了favorite。理論學習也受到了巨大的沖擊,一些不明所以的冰冷的公式和整段可以運行的代碼是很多人的最愛。使得原本應該沉靜的軟件開發變得異常浮躁,(當然很多博客也成了幫凶:))今天就要融化冰雪, 說說代碼以外的東西,說說冰雪初成的原因。
銳化的概念,我們從銳度開始談起。很多人都以為銳度就是Sharpness,其實在數字圖像的領域, 這個銳度更准確的說法是acutance, 萬能的Wiki給出了 acutance 的標准的定義。In photography, acutance is the edge contrast of an image。 這句話已經說的非常清晰了, 銳度的意思就是邊緣的對比度。(這裡的邊緣指的就是圖像中的物件的邊緣)。
下面是一組很形象的圖:(無圖無真相)
從這一組圖可以看出, 這裡的銳度從左到右逐漸提高了。銳度的提高會使圖像像素不增加的基礎上造成提高清晰度的假象。
那麼這樣的銳化效果如何實現呢?那一個個傳統的算子(Operator)是如何可以工作的呢?
我們慢慢來展開,回到銳度的本意來看, 銳度就是邊緣的對比度, 提高銳度(銳化)就是把邊緣的對比度提高,所以我們的工作就變成了
a)找到有差異的相鄰的像素 (這個東東是不是就是檢測到邊緣,我們一直說的邊緣檢測)
b)增加有差異的像素的對比度
為了方便說明問題, 我們把尋找邊緣的問題從一維的情形開始定義,我們把這樣的所謂的差異定義成一種數學模型:
不要看到數學分析就慌張了, 其實這裡還是非常容易理解,這裡的一階微分就是水平掃面相鄰像素的灰度值差, 而二階的只是在前面的灰度差上又做了一個微分, 就是再求了一次灰度差。
說實話看到這樣的模型的時候,第一反應就是Win32的一個接口GradientFill, GradientFill會把像素漸變的平鋪在一定的矩形中。或者說在某個方向上的f(x)就類似於f(x)=ax+b;的直線。 如果我們使用一階微分的模型來度量, 那樣的微分就永遠是f(x+1)-f(x)=a!!!也就是說這裡的漸變的像素都需要增強!但是增強a,換句話說大家的灰度差在進行了這個增強操作之後還是沒有效果的。但是如果二階的模型的話,就是再f(x)=a上再做一次微分也就是0, 就是不需要做任何的增強!很容易地看出還是有差異的。 繼續聯想到如果我們一個圖裡面只有一個區域是GradientFill的, 而其他的區域都是隨機的顏色, 那這裡的一階微分就會改變這裡的大片的 GradientFill區域和周圍顏色的差異, 可能這樣的效果不是我們需要的。
從這裡的一階和二階的對比馬上可以看出, 如果使用二階的模型的話, 能夠更為准確的把握出邊緣,同時去除那種穩定漸變的情況, 而一階明顯的拉大了邊緣的范圍, 使邊緣變得更粗了(當然也可以通過後期的threshold來去除)。所以總的來說二階的模型還是更為受歡迎。在這樣的背景下,Laplace算子誕生就不難理解了.這個就是一個明顯的二階微分在水平和豎直方向的和!
我們來看看它的模版:
其實這個公式的推導異常容易就是 laplace ={ f(x+1,y)+f(x-1,y)+2f(x,y) } + { f(x,y-1) + f(x, y+1) - 2f(x, y)}
= f (x-1,y) + f(x+1,y) + f(x,y-1) + f(x, y+1) - 4f(x, y);
是不是赫然就是前面的公式。更常見的一個 Laplace算子也如是:
那就是在原來的基礎上加上和對角線的微分, 就是在原來基礎上加上了
f(x-1,y-1)+f(x-1,y+1)+f(x+1,y-1)+f(x+1,y+1)-4f(x,y); 套用老羅的一句話, 好理解吧:)
在二階之前的一階的微分算子可能就更容易理解一些, 比如做常見的Roberts算子:
這個就是對角的微分的差的和啦, f(x,y)+f(x+1,y)-f(x,y+1)-f(x+1,y+1)
這裡的prewitt就是把微分擴展成了Δf(x,y) = (f(x+h)-f(x-h))/2h的case, 而這裡的h=1; 在他的基礎上Sobel又更進了一步,他把像素的微分加上了權重的概念
可以看到,離帶處理點越近的點具有更高的權重,這樣能夠更准確的定位到邊緣的所在。
到這裡, 我們大致了解了邊緣檢測的一些基本的邏輯, 完了之後, 如何繼續銳化呢?其實這個在前面一篇文章中都有實現了, 我們還是以Laplace的算子為例, 我們要處理原來的f(x,y)和現在得到的laplace(x,y)之間的關系, 到底是加法還是減法呢??利用原來的sample我們繼續計算得到:
明顯的看出,在這樣的情形下, 減法還是獲得了更大的對比值, 也就是獲得了更好的效果, 所以我們選用了減法, 當然這裡的理論性的說明就是, 如果這個3x3模版的最中央的數字為正數,那麼他就是加法,如果是負數,那麼就是減法。這樣的說法很容易得到了驗證, 由此, 我們可以方便的得出結論, Laplace算子如果要用來銳化圖像的話, 可以表示成為
到這裡沒有太多的想法去試驗其他的邊緣檢測和銳化, 就把laplace的這個模版試了一下, 效果不是很好, 沒有前面一篇文章的效果那麼好, 呵呵
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/hhygcy/archive/2009/07/29/4390551.aspx