您好,登錄后才能下訂單哦!
最近使用OpenCV3.3.0構(gòu)建了一個(gè)識(shí)別圖形的C/C++項(xiàng)目,可以識(shí)別的圖形如下:三角形、正方形、長(zhǎng)方形、菱形、圓形、五邊形、六邊形、五角星以及由不同顏色的兩個(gè)三角形構(gòu)成的特殊矩形。
中值濾波法是一種非線性平滑技術(shù),它將每一像素點(diǎn)的灰度值設(shè)置為該點(diǎn)某鄰域窗口內(nèi)的所有像素點(diǎn)灰度值的中值.
中值濾波是基于排序統(tǒng)計(jì)理論的一種能有效抑制噪聲的非線性信號(hào)處理技術(shù),中值濾波的基本原理是把數(shù)字圖像或數(shù)字序列中一點(diǎn)的值用該點(diǎn)的一個(gè)鄰域中各點(diǎn)值的中值代替,讓周圍的像素值接近的真實(shí)值,從而消除孤立的噪聲點(diǎn)。方法是用某種結(jié)構(gòu)的二維滑動(dòng)模板,將板內(nèi)像素按照像素值的大小進(jìn)行排序,生成單調(diào)上升(或下降)的為二維數(shù)據(jù)序列。二維中值濾波輸出為g(x,y)=med{f(x-k,y-l),(k,l∈W)}
,其中,f(x,y),g(x,y)
分別為原始圖像和處理后圖像。W為二維模板,通常為3*3,5*5
區(qū)域,也可以是不同的的形狀,如線狀,圓形,十字形,圓環(huán)形等。
中值濾波對(duì)脈沖噪聲有良好的濾除作用,特別是在濾除噪聲的同時(shí),能夠保護(hù)信號(hào)的邊緣,使之不被模糊。這些優(yōu)良特性是線性濾波方法所不具有的。此外,中值濾波的算法比較簡(jiǎn)單,也易于用硬件實(shí)現(xiàn)。所以,中值濾波方法一經(jīng)提出后,便在數(shù)字信號(hào)處理領(lǐng)得到重要的應(yīng)用。
Canny邊緣檢測(cè)于1986年由JOHN CANNY首次在論文《A Computational Approach to Edge Detection》中提出,就此拉開(kāi)了Canny邊緣檢測(cè)算法的序幕。Canny邊緣檢測(cè)是從不同視覺(jué)對(duì)象中提取有用的結(jié)構(gòu)信息并大大減少要處理的數(shù)據(jù)量的一種技術(shù),目前已廣泛應(yīng)用于各種計(jì)算機(jī)視覺(jué)系統(tǒng)。
Canny邊緣檢測(cè)算法可以分為以下五個(gè)步驟:
(一)使用高斯濾波器,以平滑圖像,濾除噪聲
為了盡可能減少噪聲對(duì)邊緣檢測(cè)結(jié)果的影響,所以必須濾除噪聲以防止由噪聲引起的錯(cuò)誤檢測(cè)。為了平滑圖像,使用高斯濾波器與圖像進(jìn)行卷積,該步驟將平滑圖像,以減少邊緣檢測(cè)器上明顯的噪聲影響。大小為(2k+1)x(2k+1)的高斯濾波器核的生成方程式由下式給出:
下面是一個(gè)sigma = 1.4
,尺寸為3*3
的高斯卷積核的例子(需要注意歸一化):
若圖像中一個(gè)3*3
的窗口為A,要濾波的像素點(diǎn)為e
,則經(jīng)過(guò)高斯濾波之后,像素點(diǎn)e
的亮度值為:
其中*
為卷積符號(hào),sum
表示矩陣中所有元素相加求和。重要的是需要理解,高斯卷積核大小的選擇將影響Canny檢測(cè)器的性能。尺寸越大,檢測(cè)器對(duì)噪聲的敏感度越低,但是邊緣檢測(cè)的定位誤差也將略有增加。一般5*5
是一個(gè)比較不錯(cuò)的trade off。
(二)計(jì)算圖像中每個(gè)像素點(diǎn)的梯度強(qiáng)度和方向
圖像中的邊緣可以指向各個(gè)方向,因此Canny算法使用四個(gè)算子來(lái)檢測(cè)圖像中的水平、垂直和對(duì)角邊緣。邊緣檢測(cè)的算子(如Roberts,Prewitt,Sobel等)返回水平Gx和垂直Gy方向的一階導(dǎo)數(shù)值,由此便可以確定像素點(diǎn)的梯度G和方向theta 。
其中G為梯度強(qiáng)度, theta表示梯度方向,arctan為反正切函數(shù)。下面以Sobel算子為例講述如何計(jì)算梯度強(qiáng)度和方向。x和y方向的Sobel算子分別為:
其中Sx表示x方向的Sobel算子,用于檢測(cè)y方向的邊緣; Sy表示y方向的Sobel算子,用于檢測(cè)x方向的邊緣(邊緣方向和梯度方向垂直)。在直角坐標(biāo)系中,Sobel算子的方向如下圖所示:
若圖像中一個(gè)3x3的窗口為A,要計(jì)算梯度的像素點(diǎn)為e,則和Sobel算子進(jìn)行卷積之后,像素點(diǎn)e在x和y方向的梯度值分別為:
其中*
為卷積符號(hào),sum
表示矩陣中所有元素相加求和。根據(jù)公式(3-2)便可以計(jì)算出像素點(diǎn)e的梯度和方向。
(三)應(yīng)用非極大值(Non-Maximum Suppression)抑制,以消除邊緣檢測(cè)帶來(lái)的雜散響應(yīng)
非極大值抑制是一種邊緣稀疏技術(shù),非極大值抑制的作用在于“瘦”邊。對(duì)圖像進(jìn)行梯度計(jì)算后,僅僅基于梯度值提取的邊緣仍然很模糊。對(duì)于標(biāo)準(zhǔn)3,對(duì)邊緣有且應(yīng)當(dāng)只有一個(gè)準(zhǔn)確的響應(yīng)。而非極大值抑制則可以幫助將局部最大值之外的所有梯度值抑制為0,對(duì)梯度圖像中每個(gè)像素進(jìn)行非極大值抑制的算法是:
將當(dāng)前像素的梯度強(qiáng)度與沿正負(fù)梯度方向上的兩個(gè)像素進(jìn)行比較。
通常為了更加精確的計(jì)算,在跨越梯度方向的兩個(gè)相鄰像素之間使用線性插值來(lái)得到要比較的像素梯度,現(xiàn)舉例如下:
如圖所示,將梯度分為8個(gè)方向,分別為E、NE、N、NW、W、SW、S、SE,其中0代表00~45o,1代表450~90o,2代表-900~-45o,3代表-450~0o。像素點(diǎn)P的梯度方向?yàn)閠heta,則像素點(diǎn)P1和P2的梯度線性插值為:
因此非極大值抑制的偽代碼描寫如下:
需要注意的是,如何標(biāo)志方向并不重要,重要的是梯度方向的計(jì)算要和梯度算子的選取保持一致。
(四)應(yīng)用雙閾值(Double-Threshold)檢測(cè)來(lái)確定真實(shí)的和潛在的邊緣
在施加非極大值抑制之后,剩余的像素可以更準(zhǔn)確地表示圖像中的實(shí)際邊緣。然而,仍然存在由于噪聲和顏色變化引起的一些邊緣像素。為了解決這些雜散響應(yīng),必須用弱梯度值過(guò)濾邊緣像素,并保留具有高梯度值的邊緣像素,可以通過(guò)選擇高低閾值來(lái)實(shí)現(xiàn)。如果邊緣像素的梯度值高于高閾值,則將其標(biāo)記為強(qiáng)邊緣像素;如果邊緣像素的梯度值小于高閾值并且大于低閾值,則將其標(biāo)記為弱邊緣像素;如果邊緣像素的梯度值小于低閾值,則會(huì)被抑制。閾值的選擇取決于給定輸入圖像的內(nèi)容。雙閾值檢測(cè)的偽代碼描寫如下:
(五)通過(guò)抑制孤立的弱邊緣最終完成邊緣檢測(cè)
到目前為止,被劃分為強(qiáng)邊緣的像素點(diǎn)已經(jīng)被確定為邊緣,因?yàn)樗鼈兪菑膱D像中的真實(shí)邊緣中提取出來(lái)的。然而,對(duì)于弱邊緣像素,將會(huì)有一些爭(zhēng)論,因?yàn)檫@些像素可以從真實(shí)邊緣提取也可以是因噪聲或顏色變化引起的。為了獲得準(zhǔn)確的結(jié)果,應(yīng)該抑制由后者引起的弱邊緣。通常,由真實(shí)邊緣引起的弱邊緣像素將連接到強(qiáng)邊緣像素,而噪聲響應(yīng)未連接。為了跟蹤邊緣連接,通過(guò)查看弱邊緣像素及其8個(gè)鄰域像素,只要其中一個(gè)為強(qiáng)邊緣像素,則該弱邊緣點(diǎn)就可以保留為真實(shí)的邊緣。抑制孤立邊緣點(diǎn)的偽代碼描述如下:
Hough 變換的原理就是利用圖像全局特征將邊緣像素連接起來(lái)組成區(qū)域封閉邊界,它將圖像空間轉(zhuǎn)換到參數(shù)空間,在參數(shù)空間對(duì)點(diǎn)進(jìn)行描述,達(dá)到檢測(cè)圖像邊緣的目的。該方法把所有可能落在邊緣上的點(diǎn)進(jìn)行統(tǒng)計(jì)計(jì)算,根據(jù)對(duì)數(shù)據(jù)的統(tǒng)計(jì)結(jié)果確定屬于邊緣的程度。Hough 變換的實(shí)質(zhì)就是對(duì)圖像進(jìn)行坐標(biāo)變換,把平面坐標(biāo)變換為參數(shù)坐標(biāo),使變換的結(jié)果更易識(shí)別和檢測(cè)。
已知圓的一般方程為:(x - a)^2 + (y - b)^2 = r^2
,其中,(a, b)
為圓心,r為圓的半徑。
把X-Y平面上的圓轉(zhuǎn)換到a-b-r參數(shù)空間,則圖像空間中過(guò)(x, y)點(diǎn)圓對(duì)應(yīng)參數(shù)空間中,高度r變化下的一個(gè)三維錐面,如下圖:
同理,過(guò)圖像空間中任意一點(diǎn)的圓對(duì)應(yīng)于參數(shù)空間中的一個(gè)三維錐面。因此,過(guò)圖像空間上同一圓上的點(diǎn),對(duì)應(yīng)的參數(shù)空間中的三維錐面,在r高度必然相交于一點(diǎn)(a, b, r)。這樣通過(guò)檢測(cè)這一點(diǎn)可以得到圓的參數(shù),相應(yīng)的圓也可求得了。圖像平面的方程轉(zhuǎn)化為參數(shù)平面上的示意圖如圖所示:
霍夫直線檢測(cè)就比較簡(jiǎn)單了。
如上圖所以,將一條直線由截距是表示為在極坐標(biāo)系下:
可以化簡(jiǎn)為:
對(duì)于一個(gè)點(diǎn)(x0,y0)來(lái)說(shuō),可以通過(guò)這個(gè)點(diǎn)的一族直線統(tǒng)一定義為:
每一對(duì)(r0, theta)
代表一條通過(guò)點(diǎn)(x0,y0)
的直線。如果對(duì)于一個(gè)給定點(diǎn)(x0,y0)
,我們?cè)跇O坐標(biāo)對(duì)極徑極角平面繪制出所有通過(guò)它的直線,將會(huì)得到一條正弦曲線。例如x0=8, y0=6
的曲線如下所示:
上圖是r>0 theta(0,2*PI)
。對(duì)圖像中所有的點(diǎn)進(jìn)行上述操作,如果兩個(gè)點(diǎn)在一條直線上,那么兩條正弦曲線將會(huì)交于一點(diǎn):
上圖所有的三個(gè)點(diǎn)在一條直線上,一條直線能夠通過(guò)在平面theta-r尋找交于一點(diǎn)的曲線數(shù)量來(lái)檢測(cè), 越多的 曲線交于一點(diǎn)就意味著這個(gè)交點(diǎn)表示的直線由更多的點(diǎn)組成,通過(guò)設(shè)置交于一點(diǎn)的曲線數(shù)的閾值來(lái)決定是否檢測(cè)到一條直線?;舴蜃儞Q即追蹤圖像中每個(gè)點(diǎn)對(duì)應(yīng)曲線間的交點(diǎn),如果 交點(diǎn)數(shù)量超過(guò)了閾值,那么可以認(rèn)為這個(gè)交點(diǎn)所代表的參數(shù)為原圖像中的一條直線。
圖像二值化( Image Binarization)就是將圖像上的像素點(diǎn)的灰度值設(shè)置為0或255,也就是將整個(gè)圖像呈現(xiàn)出明顯的黑白效果的過(guò)程。在數(shù)字圖像處理中,二值圖像占有非常重要的地位,圖像的二值化使圖像中數(shù)據(jù)量大為減少,從而能凸顯出目標(biāo)的輪廓。
將256個(gè)亮度等級(jí)的灰度圖像通過(guò)適當(dāng)?shù)拈撝颠x取而獲得仍然可以反映圖像整體和局部特征的二值化圖像。在數(shù)字圖像處理中,二值圖像占有非常重要的地位,首先,圖像的二值化有利于圖像的進(jìn)一步處理,使圖像變得簡(jiǎn)單,而且數(shù)據(jù)量減小,能凸顯出感興趣的目標(biāo)的輪廓。其次,要進(jìn)行二值圖像的處理與分析,首先要把灰度圖像二值化,得到二值化圖像。
當(dāng)我們通過(guò)閾值分割提取到圖像中的目標(biāo)物體后,我們就需要通過(guò)邊緣檢測(cè)來(lái)提取目標(biāo)物體的輪廓,使用這兩種方法基本能夠確定物體的邊緣或者前景。接下來(lái),我們通常需要做的是擬合這些邊緣的前景,如擬合出包含前景或者邊緣像素點(diǎn)的最小外包矩形、圓、凸包等幾何形狀,為計(jì)算它們的面積或者模板匹配等操作打下堅(jiān)實(shí)的基礎(chǔ)。一個(gè)輪廓代表一系列的點(diǎn)(像素),這一系列的點(diǎn)構(gòu)成一個(gè)有序的點(diǎn)集,所以可以把一個(gè)輪廓理解為一個(gè)有序的點(diǎn)集。?
在OpenCV中,提供了一個(gè)函數(shù)返回或者輸出一個(gè)有序的點(diǎn)集或者有序的點(diǎn)集的集合(指多個(gè)有序的點(diǎn)集),函數(shù)findContour是從二值圖像中來(lái)計(jì)算輪廓的,它可以使用Canny()函數(shù)處理的圖像,因?yàn)檫@樣的圖像含有邊緣像素;也可以使用threshold()或者adaptiveThreshold()處理后的圖像,其邊緣隱含在正負(fù)區(qū)域的交界處。
主要功能是把一個(gè)連續(xù)光滑曲線折線化,對(duì)圖像輪廓點(diǎn)進(jìn)行多邊形擬合。對(duì)比之前黑點(diǎn)連線,之后藍(lán)色連線:
起始曲線是有序的一組點(diǎn)或線,距離維度ε> 0。該算法遞歸地劃分線。 最初給出了第一點(diǎn)和最后一點(diǎn)之間的所有點(diǎn)。 它會(huì)自動(dòng)標(biāo)記要保存的第一個(gè)和最后一個(gè)點(diǎn)。 然后找到距離第一點(diǎn)和最后一點(diǎn)組成的線段的最遠(yuǎn)的點(diǎn)作為終點(diǎn); 這一點(diǎn)在距離終點(diǎn)之間的近似線段的曲線上顯然最遠(yuǎn)。 如果該點(diǎn)比線段更接近于ε,那么當(dāng)前未被標(biāo)記的任何點(diǎn)將被保存,而沒(méi)有簡(jiǎn)化的曲線比ε更差的可以丟棄。如果離線段最遠(yuǎn)的點(diǎn)距離近似值大于ε,則必須保留該點(diǎn)。 該算法以第一個(gè)點(diǎn)和最遠(yuǎn)點(diǎn)遞歸地調(diào)用自身,然后以最遠(yuǎn)點(diǎn)和最后一個(gè)點(diǎn)(包括最遠(yuǎn)點(diǎn)被標(biāo)記為保留)遞歸調(diào)用自身。當(dāng)遞歸完成時(shí),可以生成一個(gè)新的輸出曲線,其中包括所有且僅標(biāo)記為保留的點(diǎn)。
非參數(shù)Ramer-Douglas-Peucker :ε
的選擇通常是用戶定義的。 像大多數(shù)線擬合/多邊形近似/主點(diǎn)檢測(cè)方法一樣,通過(guò)使用由于數(shù)字化/量化的誤差界限作為終止條件,可以使其非參數(shù)化,這種非參數(shù)RDP算法的MATLAB代碼在這里可用。
https://gitee.com/bluemiaomiao/ImageFound/blob/master/video_x264.mp4
https://gitee.com/bluemiaomiao/ImageFound
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。