OpenCV中幾何形狀識別與測量

最近使用OpenCV3.3.0構建了一個識別圖形的C/C++項目,可以識別的圖形如下:三角形、正方形、長方形、菱形、圓形、五邊形、六邊形、五角星以及由不同顏色的兩個三角形構成的特殊矩形。

OpenCV中幾何形狀識別與測量

中值濾波

中值濾波法是一種非線性平滑技術,它將每一像素點的灰度值設置爲該點某鄰域窗口內的所有像素點灰度值的中值.

中值濾波是基於排序統計理論的一種能有效抑制噪聲的非線性信號處理技術,中值濾波的基本原理是把數字圖像或數字序列中一點的值用該點的一個鄰域中各點值的中值代替,讓周圍的像素值接近的真實值,從而消除孤立的噪聲點。方法是用某種結構的二維滑動模板,將板內像素按照像素值的大小進行排序,生成單調上升(或下降)的爲二維數據序列。二維中值濾波輸出爲g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分別爲原始圖像和處理後圖像。W爲二維模板,通常爲3*3,5*5區域,也可以是不同的的形狀,如線狀,圓形,十字形,圓環形等。

中值濾波對脈衝噪聲有良好的濾除作用,特別是在濾除噪聲的同時,能夠保護信號的邊緣,使之不被模糊。這些優良特性是線性濾波方法所不具有的。此外,中值濾波的算法比較簡單,也易於用硬件實現。所以,中值濾波方法一經提出後,便在數字信號處理領得到重要的應用。

Canny邊緣檢測

Canny邊緣檢測於1986年由JOHN CANNY首次在論文《A Computational Approach to Edge Detection》中提出,就此拉開了Canny邊緣檢測算法的序幕。Canny邊緣檢測是從不同視覺對象中提取有用的結構信息並大大減少要處理的數據量的一種技術,目前已廣泛應用於各種計算機視覺系統。

Canny邊緣檢測算法可以分爲以下五個步驟:
(一)使用高斯濾波器,以平滑圖像,濾除噪聲
爲了儘可能減少噪聲對邊緣檢測結果的影響,所以必須濾除噪聲以防止由噪聲引起的錯誤檢測。爲了平滑圖像,使用高斯濾波器與圖像進行卷積,該步驟將平滑圖像,以減少邊緣檢測器上明顯的噪聲影響。大小爲(2k+1)x(2k+1)的高斯濾波器核的生成方程式由下式給出:
OpenCV中幾何形狀識別與測量
下面是一個sigma = 1.4,尺寸爲3*3的高斯卷積核的例子(需要注意歸一化):
OpenCV中幾何形狀識別與測量
若圖像中一個3*3的窗口爲A,要濾波的像素點爲e,則經過高斯濾波之後,像素點e的亮度值爲:
OpenCV中幾何形狀識別與測量
其中*爲卷積符號,sum表示矩陣中所有元素相加求和。重要的是需要理解,高斯卷積核大小的選擇將影響Canny檢測器的性能。尺寸越大,檢測器對噪聲的敏感度越低,但是邊緣檢測的定位誤差也將略有增加。一般5*5是一個比較不錯的trade off。

(二)計算圖像中每個像素點的梯度強度和方向
圖像中的邊緣可以指向各個方向,因此Canny算法使用四個算子來檢測圖像中的水平、垂直和對角邊緣。邊緣檢測的算子(如Roberts,Prewitt,Sobel等)返回水平Gx和垂直Gy方向的一階導數值,由此便可以確定像素點的梯度G和方向theta 。
OpenCV中幾何形狀識別與測量
其中G爲梯度強度, theta表示梯度方向,arctan爲反正切函數。下面以Sobel算子爲例講述如何計算梯度強度和方向。x和y方向的Sobel算子分別爲:
OpenCV中幾何形狀識別與測量
其中Sx表示x方向的Sobel算子,用於檢測y方向的邊緣; Sy表示y方向的Sobel算子,用於檢測x方向的邊緣(邊緣方向和梯度方向垂直)。在直角座標系中,Sobel算子的方向如下圖所示:
OpenCV中幾何形狀識別與測量
若圖像中一個3x3的窗口爲A,要計算梯度的像素點爲e,則和Sobel算子進行卷積之後,像素點e在x和y方向的梯度值分別爲:
OpenCV中幾何形狀識別與測量
其中*爲卷積符號,sum表示矩陣中所有元素相加求和。根據公式(3-2)便可以計算出像素點e的梯度和方向。
(三)應用非極大值(Non-Maximum Suppression)抑制,以消除邊緣檢測帶來的雜散響應
非極大值抑制是一種邊緣稀疏技術,非極大值抑制的作用在於“瘦”邊。對圖像進行梯度計算後,僅僅基於梯度值提取的邊緣仍然很模糊。對於標準3,對邊緣有且應當只有一個準確的響應。而非極大值抑制則可以幫助將局部最大值之外的所有梯度值抑制爲0,對梯度圖像中每個像素進行非極大值抑制的算法是:

  1. 將當前像素的梯度強度與沿正負梯度方向上的兩個像素進行比較。

  2. 如果當前像素的梯度強度與另外兩個像素相比最大,則該像素點保留爲邊緣點,否則該像素點將被抑制。

通常爲了更加精確的計算,在跨越梯度方向的兩個相鄰像素之間使用線性插值來得到要比較的像素梯度,現舉例如下:

OpenCV中幾何形狀識別與測量

如圖所示,將梯度分爲8個方向,分別爲E、NE、N、NW、W、SW、S、SE,其中0代表00~45o,1代表450~90o,2代表-900~-45o,3代表-450~0o。像素點P的梯度方向爲theta,則像素點P1和P2的梯度線性插值爲:

OpenCV中幾何形狀識別與測量

因此非極大值抑制的僞代碼描寫如下:

OpenCV中幾何形狀識別與測量

需要注意的是,如何標誌方向並不重要,重要的是梯度方向的計算要和梯度算子的選取保持一致。

(四)應用雙閾值(Double-Threshold)檢測來確定真實的和潛在的邊緣

在施加非極大值抑制之後,剩餘的像素可以更準確地表示圖像中的實際邊緣。然而,仍然存在由於噪聲和顏色變化引起的一些邊緣像素。爲了解決這些雜散響應,必須用弱梯度值過濾邊緣像素,並保留具有高梯度值的邊緣像素,可以通過選擇高低閾值來實現。如果邊緣像素的梯度值高於高閾值,則將其標記爲強邊緣像素;如果邊緣像素的梯度值小於高閾值並且大於低閾值,則將其標記爲弱邊緣像素;如果邊緣像素的梯度值小於低閾值,則會被抑制。閾值的選擇取決於給定輸入圖像的內容。雙閾值檢測的僞代碼描寫如下:
OpenCV中幾何形狀識別與測量

(五)通過抑制孤立的弱邊緣最終完成邊緣檢測

到目前爲止,被劃分爲強邊緣的像素點已經被確定爲邊緣,因爲它們是從圖像中的真實邊緣中提取出來的。然而,對於弱邊緣像素,將會有一些爭論,因爲這些像素可以從真實邊緣提取也可以是因噪聲或顏色變化引起的。爲了獲得準確的結果,應該抑制由後者引起的弱邊緣。通常,由真實邊緣引起的弱邊緣像素將連接到強邊緣像素,而噪聲響應未連接。爲了跟蹤邊緣連接,通過查看弱邊緣像素及其8個鄰域像素,只要其中一個爲強邊緣像素,則該弱邊緣點就可以保留爲真實的邊緣。抑制孤立邊緣點的僞代碼描述如下:
OpenCV中幾何形狀識別與測量

霍夫圓檢測

Hough 變換的原理就是利用圖像全局特徵將邊緣像素連接起來組成區域封閉邊界,它將圖像空間轉換到參數空間,在參數空間對點進行描述,達到檢測圖像邊緣的目的。該方法把所有可能落在邊緣上的點進行統計計算,根據對數據的統計結果確定屬於邊緣的程度。Hough 變換的實質就是對圖像進行座標變換,把平面座標變換爲參數座標,使變換的結果更易識別和檢測。

已知圓的一般方程爲:(x - a)^2 + (y - b)^2 = r^2,其中,(a, b)爲圓心,r爲圓的半徑。

把X-Y平面上的圓轉換到a-b-r參數空間,則圖像空間中過(x, y)點圓對應參數空間中,高度r變化下的一個三維錐面,如下圖:

OpenCV中幾何形狀識別與測量

同理,過圖像空間中任意一點的圓對應於參數空間中的一個三維錐面。因此,過圖像空間上同一圓上的點,對應的參數空間中的三維錐面,在r高度必然相交於一點(a, b, r)。這樣通過檢測這一點可以得到圓的參數,相應的圓也可求得了。圖像平面的方程轉化爲參數平面上的示意圖如圖所示:

OpenCV中幾何形狀識別與測量

霍夫直線檢測

霍夫直線檢測就比較簡單了。
OpenCV中幾何形狀識別與測量

如上圖所以,將一條直線由截距是表示爲在極座標系下:

OpenCV中幾何形狀識別與測量

可以化簡爲:

OpenCV中幾何形狀識別與測量

對於一個點(x0,y0)來說,可以通過這個點的一族直線統一定義爲:

OpenCV中幾何形狀識別與測量

每一對(r0, theta)代表一條通過點(x0,y0)的直線。如果對於一個給定點(x0,y0),我們在極座標對極徑極角平面繪製出所有通過它的直線,將會得到一條正弦曲線。例如x0=8, y0=6的曲線如下所示:
OpenCV中幾何形狀識別與測量

上圖是r>0 theta(0,2*PI)。對圖像中所有的點進行上述操作,如果兩個點在一條直線上,那麼兩條正弦曲線將會交於一點:

OpenCV中幾何形狀識別與測量

上圖所有的三個點在一條直線上,一條直線能夠通過在平面theta-r尋找交於一點的曲線數量來檢測, 越多的 曲線交於一點就意味着這個交點表示的直線由更多的點組成,通過設置交於一點的曲線數的閾值來決定是否檢測到一條直線。霍夫變換即追蹤圖像中每個點對應曲線間的交點,如果 交點數量超過了閾值,那麼可以認爲這個交點所代表的參數爲原圖像中的一條直線。

圖像二值化

圖像二值化( Image Binarization)就是將圖像上的像素點的灰度值設置爲0或255,也就是將整個圖像呈現出明顯的黑白效果的過程。在數字圖像處理中,二值圖像佔有非常重要的地位,圖像的二值化使圖像中數據量大爲減少,從而能凸顯出目標的輪廓。

將256個亮度等級的灰度圖像通過適當的閾值選取而獲得仍然可以反映圖像整體和局部特徵的二值化圖像。在數字圖像處理中,二值圖像佔有非常重要的地位,首先,圖像的二值化有利於圖像的進一步處理,使圖像變得簡單,而且數據量減小,能凸顯出感興趣的目標的輪廓。其次,要進行二值圖像的處理與分析,首先要把灰度圖像二值化,得到二值化圖像。

輪廓發現

當我們通過閾值分割提取到圖像中的目標物體後,我們就需要通過邊緣檢測來提取目標物體的輪廓,使用這兩種方法基本能夠確定物體的邊緣或者前景。接下來,我們通常需要做的是擬合這些邊緣的前景,如擬合出包含前景或者邊緣像素點的最小外包矩形、圓、凸包等幾何形狀,爲計算它們的面積或者模板匹配等操作打下堅實的基礎。一個輪廓代表一系列的點(像素),這一系列的點構成一個有序的點集,所以可以把一個輪廓理解爲一個有序的點集。 

在OpenCV中,提供了一個函數返回或者輸出一個有序的點集或者有序的點集的集合(指多個有序的點集),函數findContour是從二值圖像中來計算輪廓的,它可以使用Canny()函數處理的圖像,因爲這樣的圖像含有邊緣像素;也可以使用threshold()或者adaptiveThreshold()處理後的圖像,其邊緣隱含在正負區域的交界處。

多邊形擬合

主要功能是把一個連續光滑曲線折線化,對圖像輪廓點進行多邊形擬合。對比之前黑點連線,之後藍色連線:

OpenCV中幾何形狀識別與測量

起始曲線是有序的一組點或線,距離維度ε> 0。該算法遞歸地劃分線。 最初給出了第一點和最後一點之間的所有點。 它會自動標記要保存的第一個和最後一個點。 然後找到距離第一點和最後一點組成的線段的最遠的點作爲終點; 這一點在距離終點之間的近似線段的曲線上顯然最遠。 如果該點比線段更接近於ε,那麼當前未被標記的任何點將被保存,而沒有簡化的曲線比ε更差的可以丟棄。如果離線段最遠的點距離近似值大於ε,則必須保留該點。 該算法以第一個點和最遠點遞歸地調用自身,然後以最遠點和最後一個點(包括最遠點被標記爲保留)遞歸調用自身。當遞歸完成時,可以生成一個新的輸出曲線,其中包括所有且僅標記爲保留的點。

非參數Ramer-Douglas-Peucker :ε 的選擇通常是用戶定義的。 像大多數線擬合/多邊形近似/主點檢測方法一樣,通過使用由於數字化/量化的誤差界限作爲終止條件,可以使其非參數化,這種非參數RDP算法的MATLAB代碼在這裏可用。

識別結果

OpenCV中幾何形狀識別與測量

OpenCV中幾何形狀識別與測量

環境搭建講解視頻

https://gitee.com/bluemiaomiao/ImageFound/blob/master/video_x264.mp4

實現原理和項目代碼

https://gitee.com/bluemiaomiao/ImageFound

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章