OpenCV中幾何形狀識別與測量

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

OpenCV中幾何形狀識別與測量

中值濾波

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

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

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

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。3d

(二)計算圖像中每一個像素點的梯度強度和方向
圖像中的邊緣能夠指向各個方向,所以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,對梯度圖像中每一個像素進行非極大值抑制的算法是:code

  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的梯度線性插值爲:blog

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

相關文章
相關標籤/搜索