3.1
先舉個例子說明一下什麼是平滑(smoothing),如下面兩幅圖所示:可以看到,圖3.2比圖3.1柔和一些(也模糊一些)。是不是覺得很神奇?其實實現起來很簡單。我們將原圖中的每一點的灰度和它周圍八個點的灰度相加,然後除以9,作為新圖中對應點的灰度,就能實現上面的效果。
圖3.1 原圖 | 圖3.2 經過平滑處理後的圖 |
這麼做並非瞎蒙,而是有其道理的。大概想一想,也很容易明白。舉個例子,就象和面一樣,先在中間加點水,然後不斷把周圍的面和進來,攪拌幾次,面就均勻了。
用信號處理的理論來解釋,這種做法實現的是一種簡單的低通濾波器(low pass filter)。哇,好深奧呀!不要緊,這些理論的內容並不多,而且知道一些理論也是很有好處的。在灰度連續變化的圖象中,如果出現了與相鄰象素的灰度相差很大的點,比如說一片暗區中突然出現了一個亮點,人眼能很容易覺察到。就象看老電影時,由於膠片太舊,屏幕上經常會出現一些亮斑。這種情況被認為是一種噪聲。灰度突變在頻域中代表了一種高頻分量,低通濾波器的作用就是濾掉高頻分量,從而達到減少圖象噪聲的目的。
為了方便地敘述上面所說的「將原圖中的每一點的灰度和它周圍八個點的灰度相加,然後除以9,作為新圖中對應點的灰度」這一操作,我們采用如下的表示方法:
(3.1)
這種表示方法有點象矩陣,我們稱其為模板(template)。中間的黑點表示中心元素,即,用哪個元素做為處理後的元素。例如[2. 1]表示將自身的2倍加上右邊的元素作為新值,而[2 1.]表示將自身加上左邊元素的2倍作為新值。
通常,模板不允許移出邊界,所以結果圖象會比原圖小,例如模板是 ,原圖是 ,經過模板操作後的圖象為 ;其中數字代表灰度,x表示邊界上無法進行模板操作的點,通常的做法是復制原圖的灰度,不進行任何處理。
模板操作實現了一種鄰域運算(Neighborhood Operation),即某個象素點的結果灰度不僅和該象素灰度有關,而且和其鄰域點的值有關。在以後介紹的細化算法中,我們還將接觸到鄰域運算。模板運算的數學涵義是一種卷積(或互相關)運算,你不需要知道卷積的確切含義,只要有這麼一個概念就可以了。
模板運算在圖象處理中經常要用到,可以看出,它是一項非常耗時的運算。以
(3.2)
為例,每個象素完成一次模板操作要用9個乘法、8個加法、1個除法。對於一幅n×n(寬度×高度)的圖象,就是9n2個乘法,8n2個加法和n2個除法,算法復雜度為O(n2),這對於大圖象來說,是非常可怕的。所以,一般常用的模板並不大,如3×3,4×4。有很多專用的圖象處理系統,用硬件來完成模板運算,大大提高了速度。另外,可以設法將二維模板運算轉換成一維模板運算,對速度的提高也是非常可觀的。例如,(3.2)式可以分解成一個水平模板和一個垂直模板,即,
= × =
(3.3)
我們來驗證一下。
設圖象為 ,經過(3.2)式處理後變為 ,經過(3.3)式處理後變為 ,兩者完全一樣。如果計算時不考慮周圍一圈的象素,前者做了4×(9個乘法,8個加法,1個除法),共36個乘法,32個加法,4個除法;後者做了4×(3個乘法,2個加法)+4×(3個乘法,2個加法)+4個除法,共24個乘法,16個加法,4個除法,運算簡化了不少,如果是大圖,效率的提高將是非常客觀的。
平滑模板的思想是通過將一點和周圍8個點作平均,從而去除突然變化的點,濾掉噪聲,其代價是圖象有一定程度的模糊。上面提到的模板(3.1),就是一種平滑模板,稱之為Box模板。Box模板雖然考慮了鄰域點的作用,但並沒有考慮各點位置的影響,對於所有的9個點都一視同仁,所以平滑的效果並不理想。實際上我們可以想象,離某點越近的點對該點的影響應該越大,為此,我們引入了加權系數,將原來的模板改造成 ,可以看出,距離越近的點,加權系數越大。
新的模板也是一個常用的平滑模板,稱為高斯(Gauss)模板。為什麼叫這個名字,這是因為這個模板是通過采樣2維高斯函數得到的。
設圖象為 ,分別用兩種平滑模板處理(周圍一圈象素直接從原圖拷貝)。采用Box模板的結果為 ,采用高斯模板的結果為 。
可以看到,原圖中出現噪聲的區域是第2行第2列和第3行第2列,灰度從2一下子跳到了6,用Box模板處理後,灰度從3.11跳到4.33;用高斯模板處理後,灰度從3.跳到4.56,都緩和了跳變的幅度,從這一點上看,兩者都達到了平滑的目的。但是,原圖中的第3,第4行總的來說,灰度值是比較高的,經模板1處理後,第3行第2列元素的灰度變成了4.33,與第3,第4行的總體灰度相比偏小,另外,原圖中第3行第2列元素的灰度為6,第3行第3列元素的灰度為4,變換後,後者4.56反而比前者4.33大了。而采用高斯模板沒有出現這些問題,究其原因,就是因為它考慮了位置的影響。
舉個實際的例子:下圖中,從左到右分別是原圖,用高斯模板處理的圖,用Box模板處理的圖,可以看出,采用高斯模板,在實現平滑效果的同時,要比Box模板清晰一些。
在學習銳化後,我們將給出一個通用的3×3模板操作的程序。
圖3.3 高斯模板和Box模板的對比圖
3.2
中值濾波也是一種典型的低通濾波器,它的目的是保護圖象邊緣的同時去除噪聲。所謂中值濾波,是指把以某點(x,y)為中心的小窗口內的所有象素的灰度按從大到小的順序排列,將中間值作為(x,y)處的灰度值(若窗口中有偶數個象素,則取兩個中間值的平均)。中值濾波是如何去除噪聲的呢?舉個例子就很容易明白了。
原圖 | 處理後的圖 |
| |
圖中數字代表該處的灰度。可以看出原圖中間的6和周圍的灰度相差很大,是一個噪聲點。經過3×1窗口(即水平3個象素取中間值)的中值濾波,得到右邊那幅圖,可以看出,噪聲點被去除了。
下面將中值濾波和上面介紹的兩種平滑模板作個比較,看看中值濾波有什麼特點。我們以一維模板為例,只考慮水平方向,大小為3×1(寬×高)。Box模板為 ,高斯模板為 。
先考察第一幅圖:
原圖 | 經Box模板處理後 | 經Gauss模板處理後 | 經中值濾波處理後 |
| | | |
從原圖中不難看出左邊區域灰度值低,右邊區域灰度值高,中間有一條明顯的邊界,這一類圖象稱之為「step」(就象灰度上了個台階)。應用平滑模板後,圖象平滑了,但是也使邊界模糊了。應用中值濾波,就能很好地保持原來的邊界。所以說,中值濾波的特點是保護圖象邊緣的同時去除噪聲。
再看第二幅圖:
原圖 | 經Box模板處理後 | 經Gauss模板處理後 | 經中值濾波處理後 |
| | | |
不難看出,原圖中有很多噪聲點(灰度為正代表灰度值高的點,灰度為負代表灰度值低的點),而且是雜亂無章,隨機分布的。這也是一類很典型的圖,稱之為高斯噪聲。經過Box平滑,噪聲的程度有所下降。Gauss模板對付高斯噪聲非常有效。而中值濾波對於高斯噪聲則無能為力。
最後看第三幅圖:
原圖 | 經Box模板處理後 | 經Gauss模板處理後 | 經中值濾波處理後 |
| | | |
從原圖中不難看出,中間的灰度要比兩邊高許多。這也是一類很典型的圖,稱之為脈沖 (impulse)。可見,中值濾波對脈沖噪聲非常有效。
綜合以上三類圖,不難得出下面的結論:中值濾波容易去除孤立點,線的噪聲同時保持圖象的邊緣;它能很好的去除二值噪聲,但對高斯噪聲無能為力。要注意的是,當窗口內噪聲點的個數大於窗口寬度的一半時,中值濾波的效果不好。這是很顯然的。
銳化(sharpening)和平滑恰恰相反,它是通過增強高頻分量來減少圖象中的模糊,因此又稱為高通濾波(high pass filter)。銳化處理在增強圖象邊緣的同時增加了圖象的噪聲。
常用的銳化模板是拉普拉斯(Laplacian)模板(見(3.4)式),又是個數學家的名字,可見學好數學,走遍天下都不怕。
(3.4)
容易看出拉普拉斯模板的作法:先將自身與周圍的8個象素相減,表示自身與周圍象素的差別;再將這個差別加上自身作為新象素的灰度。可見,如果一片暗區出現了一個亮點,那麼銳化處理的結果是這個亮點變得更亮,增加了圖象的噪聲。
因為圖象中的邊緣就是那些灰度發生跳變的區域,所以銳化模板在邊緣檢測中很有用,這一點將在後面詳細介紹。
圖3.1經過拉普拉斯模板處理後,如圖3.4所示
圖3.4 銳化