Github地址:
最常用的邊緣提取方法是基於局部梯度的,參考:低層次的圖像特徵提取——邊緣檢測
在基於梯度的經典邊緣檢測算子中,以Roberts、Prewitt、Sobel、Laplacian算子最爲經典和常用。它們都是基於像素的處理方法,具有形式簡單、易於實現的優點,但都有定位精度較差、對噪聲敏感、準確性不高的缺點,而且被檢測出來的邊緣通常是不連續和不規則的。
Huechel最早提出亞像素邊緣檢測技術,現已發展爲插值、矩法和最小二乘法等多種檢測方法。插值法計算時間相對較短,但定位精度低,抗噪聲能力差;矩法和最小二乘法定位精度高,抗噪聲能力強,但計算複雜度高,且最小二乘法需要有一定先驗知識,很難適應在線檢測的需要。
將邊緣作爲配準特徵進行圖像配準時,邊緣的準確性直接決定了配準結果的正確性和精確性。前述的經典邊緣提取算子,都具有對噪聲敏感和邊緣定位精度低的問題,採用經典邊緣提取算子很難滿足前述對邊緣的準確性、精確性和單邊響應的要求。由於數學形態學的方法有較好的並行計算能力和適應性,因此可以用來代替經典邊緣提取算子。
數學形態學
數學形態學(Mathematical Morphology),是基於積分幾何和幾何概率理論建立的關於圖像形狀和尺寸的研究方法,其實質是一種非線性濾波方法。數學形態學的方法應用於視覺圖象的處理就是用具有一定形狀、大小的結構元素去探測、度量和提取圖象中的對應形狀,以達到對圖像進行處理、分析、識別的目的。數學形態學處理能簡化圖像數據,在保持圖像基本形狀特性的同時去除不相干的結構。
目前,數學形態學已經廣泛用於噪聲抑制、特徵提取、形狀識別、紋理分析、圖像恢復與重建等圖像處理問題中。在圖像處理中,主要使用的是二值形態學和灰度形態學。形態學方法對圖像數據的基本操作都是膨脹(Dilation)、腐蝕(Erosion)以及建立在這兩種運算基礎之上的開(Open)運算和閉(Close)運算,膨脹可以填充孔洞,而腐蝕則可以去除孤點和尖峯。
二值形態學運算
A被B膨脹的結果爲~B被所有x平移後與A至少有一個非零的公共元素。
A被B腐蝕的結果爲所有使B被x平移後包含於A的點x的集合。
A被B開運算就是A被B腐蝕後的結果再被B膨脹。
A被B閉運算就是A被B膨脹後的結果再被B腐蝕。
基於方向的灰度形態學邊緣提取
形態學輪廓提取
形態學提取圖像輪廓有3種方法,即(符號⊕表示膨脹運算,Θ表示腐蝕運算):
1)f⊕b − f
2)f − fΘb
3)f⊕b − fΘb
三種方案的邊緣提取結果對比
原圖 | |
方案1 | |
方案2 | |
方案3 |
方法1)在提取高灰度值、小間距的輪廓時,容易產生輪廓錯位和合並,導致檢測不準確。方法2)則容易引起間距小的低灰度輪廓的錯位和合並。方法3)又稱作形態學梯度,對噪聲敏感且提取的輪廓較粗,而且要進行膨脹和腐蝕操作各一次,因而計算複雜度大。根據用配準的邊緣準則,在用輪廓進行配準定位時,若輪廓越細膩和完整,則配準結果越精確。由於低灰度輪廓的特徵不明顯,因此,爲了保證高灰度值輪廓點的準確提取,方法2)最適合用於輪廓提取。
基於方向的灰度形態學輪廓提取
對圖像構造如下邊緣模型:
(4)
其中,b爲背景灰度,a爲輪廓幅值,θ爲輪廓的方向,則輪廓可通過對各方向提取到的輪廓進行合成。令g( f(x,y),θ)表示在方向θ提取的輪廓,則最終的輪廓合成可表示成:
(5)
考慮到從區間[0,],和區間[,2]的對稱性,上式改寫成:
(6)
顯然,如果將此式直接用於輪廓提取的計算,首先要確定角度分辨率,然後提取各方向上的輪廓,再將所有方向的輪廓進行合成。在對各方向輪廓提取時,必須根據角度分辨率對圖像進行插值運算,這將會帶來極大的計算複雜度。
基於此,考慮使用一系列帶有方向性的一維形態學算子對圖像進行多角度的輪廓提取,然後再對各方向上的圖像輪廓進行綜合即可得到整個圖像的輪廓,爲了簡單起見,避免對圖像進行復雜的插值運算,選擇規則的角度方向:0、/4、/2、3/4。
對於圖像只需要進行座標平移的配準的情形,只考慮提取圖像在橫向和縱向上的輪廓即可滿足配準條件,即只需要提取0方向和/2方向的輪廓。爲了保證檢測的邊緣位置的精確,在提取橫向輪廓時,應儘量減少縱向輪廓點可能帶來的影響;反之,在提取縱向輪廓時,儘量減少橫向輪廓點帶來的影響;採用的算子如圖所示:
opencv的基於方向的形態學邊緣檢測實現:
預測的雙閾值邊緣分割
在邊緣提取出來後,考慮到算法誤差帶來噪聲和漏判。因此,要進一步判斷是否是真的邊緣點並且將圖像進行二值化,雙閾值邊緣分割法是最常用的方法。
首先,選擇一個較大的閾值T,然後再取一小閾值T'=0.8T。
然後,逐像素進行雙閾值處理,對每一個像素考慮三種情況:如果該像素點灰度值大於高閾值,那麼它一定是邊緣;如果該像素點灰度值低於小閾值,那麼它一定不是邊緣;如果該像素點灰度值介於兩者之間,則考慮其8鄰域像素點的灰度值有沒有大於高閾值的,如果有則將其視爲輪廓點,否則視爲非輪廓點。