91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OpenCV中幾何形狀識別與測量

發布時間:2020-05-27 15:17:18 來源:網絡 閱讀:4870 作者:BlueMiaomiao 欄目:編程語言

最近使用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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

盱眙县| 本溪市| 宁安市| 榆林市| 特克斯县| 简阳市| 札达县| 织金县| 罗山县| 当涂县| 会泽县| 绍兴县| 梁河县| 思茅市| 普陀区| 尼木县| 永春县| 察隅县| 城市| 瑞昌市| 永川市| 五台县| 潢川县| 康马县| 塘沽区| 手机| 灵台县| 积石山| 广饶县| 鸡泽县| 香格里拉县| 阳高县| 吴旗县| 黎川县| 尚义县| 连平县| 永春县| 边坝县| 竹山县| 泰州市| 甘泉县|