OpenCV成長之路(6)數(shù)學(xué)形態(tài)學(xué)基本操作及其應(yīng)用_第1頁
OpenCV成長之路(6)數(shù)學(xué)形態(tài)學(xué)基本操作及其應(yīng)用_第2頁
OpenCV成長之路(6)數(shù)學(xué)形態(tài)學(xué)基本操作及其應(yīng)用_第3頁
OpenCV成長之路(6)數(shù)學(xué)形態(tài)學(xué)基本操作及其應(yīng)用_第4頁
OpenCV成長之路(6)數(shù)學(xué)形態(tài)學(xué)基本操作及其應(yīng)用_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、OpenCV成長之路(6):數(shù)學(xué)形態(tài)學(xué)基本操作及其應(yīng)用分類: OpenCV成長之路2013-12-26 15:42 537人閱讀 評論(5) 收藏 舉報(bào)opencv圖像處理智能交通車牌定位數(shù)學(xué)形態(tài)學(xué)目錄(?)+數(shù)學(xué)形態(tài)學(xué)實(shí)際上可以理解為一種濾波行為,所以很多地方稱它為形態(tài)學(xué)濾波。有了個這概念,我們就能更好的理解它。我們?yōu)V波中用的濾波器(kernl)在這里被稱為結(jié)構(gòu)元素,結(jié)構(gòu)元素往往是由一個特殊的形狀構(gòu)成,如:線條、矩形、圓、菱形等。我們把結(jié)構(gòu)無素的中心(Anchor Point)與圖像上像素點(diǎn)對齊,然后結(jié)構(gòu)元素覆蓋的領(lǐng)域像素就是我們要分析的像素

2、,我們定義一種操作就形成了一種形態(tài)學(xué)運(yùn)算。我們在這里不解釋形態(tài)學(xué)操作的算法原理及它們的意義,有興趣的可以參見相關(guān)數(shù)字圖像處理方面的教材,或關(guān)注本博客,博主打算在OpenCV系列寫完后,開始寫圖像處理方面算法系列的文章。一、形態(tài)學(xué)的基本操作腐蝕運(yùn)算:erodevoid erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=m

3、orphologyDefaultBorderValue();src:輸入圖像,很多場合下我們使用的是二值圖像,當(dāng)然灰度圖像也可以。dst:輸出圖像,格式和輸入圖像一致。kernel:定義的結(jié)構(gòu)元素。anchor:結(jié)構(gòu)元素的中心,如果是默認(rèn)參數(shù)(-1,-1),程序會自動將其設(shè)置為結(jié)構(gòu)元素的中心。iterations:迭代次數(shù),我們可以選擇對圖像進(jìn)行多次形態(tài)學(xué)運(yùn)算。后面兩個參數(shù)是邊界類型,由于要處理領(lǐng)域問題,所以圖像需要擴(kuò)充邊界。一般情況下使用默認(rèn)即可。膨脹運(yùn)算:dilate膨脹跟腐蝕的參數(shù)完全一致,就不過多的說明了。這兩個形態(tài)學(xué)操作是最基本的兩個操作。int main() Mat image=i

4、mread("./cat.png"); / 彩色轉(zhuǎn)灰度 cvtColor(image,image,CV_BGR2GRAY); / 閾值化 threshold(image,image,255*(0.5),255,THRESH_BINARY); / 形態(tài)學(xué)操作 / 如果把結(jié)構(gòu)元素設(shè)置為Mat(),則將用默認(rèn)的3*3的矩形結(jié)構(gòu)元素 Mat eroded; erode(image,eroded,Mat(); Mat dilated; dilate(image,dilated,Mat(); return 0;下面要介紹的兩個形態(tài)學(xué)操作,在實(shí)際應(yīng)用中要比上面兩個更加廣泛,但實(shí)際上它們是

5、上面兩種操作的一個組合式的操作。開運(yùn)算與閉運(yùn)算這兩個運(yùn)算都是使用函數(shù)morphologyEx來實(shí)現(xiàn)的,這個函數(shù)的接口如下: void morphologyEx(InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue();函數(shù)的大部分參數(shù)都與上面介紹的erode函數(shù)

6、參數(shù)是一樣的,這里面的op是我們要進(jìn)行的形態(tài)學(xué)的類型:MORPH_OPEN:對圖像進(jìn)行開運(yùn)算。MORPH_CLOSE:對圖像進(jìn)行閉運(yùn)算。下面我們還是以小貓圖像為例顯示一下對二值圖像進(jìn)行開運(yùn)算和閉運(yùn)算后得到的結(jié)果。int main() Mat image=imread("./cat.png"); / 彩色轉(zhuǎn)灰度 cvtColor(image,image,CV_BGR2GRAY); / 閾值化 threshold(image,image,255*(0.5),255,THRESH_BINARY); / 定義結(jié)構(gòu)元素 Mat se(5,5,CV_8U,Scalar(1); Mat

7、closed; morphologyEx(image,closed,MORPH_CLOSE,se); Mat opened; morphologyEx(image,opened,MORPH_OPEN,se); return 0;從圖片中我們可以得出結(jié)論:閉運(yùn)算可以填充圖像中的孔洞,連接一些缺口;開運(yùn)算可以去除圖像中一些較小的結(jié)構(gòu)。前提是這些孔洞或碎片要與進(jìn)行運(yùn)算的結(jié)構(gòu)元素尺度相當(dāng)。二、用形態(tài)學(xué)操作來檢測邊緣和角點(diǎn)其實(shí)用形態(tài)學(xué)來檢測邊緣的原理非常簡單,我們打開源碼看它是怎么操作的:case CV_MOP_GRADIENT: erode( src, temp, kernel, anchor, it

8、erations, borderType, borderValue ); dilate( src, dst, kernel, anchor, iterations, borderType, borderValue ); dst -= temp; break;可以看出來,它是對圖像先做了一個腐蝕,再做了一次膨脹,然后將兩次的結(jié)果相減即可。int main() Mat image=imread("./cat.png"); / 彩色轉(zhuǎn)灰度 cvtColor(image,image,CV_BGR2GRAY); Mat catEdge; morphologyEx(image,catE

9、dge,MORPH_GRADIENT,Mat(); / 閾值化 threshold(catEdge,catEdge,40,255,THRESH_BINARY); namedWindow("catEdge");imshow("catEdge",catEdge); waitKey(); return 0;下面我們來實(shí)現(xiàn)用形態(tài)學(xué)操作來檢測角點(diǎn)。首先我們需要定義幾個特殊的結(jié)構(gòu)元素,我們這里都用Mat來定義,并像素式的賦值,你可以選擇OpenCV里的getStructElement來更快的實(shí)現(xiàn)。/ 定義結(jié)構(gòu)元素 Mat cross(5,5,CV_8U,Scalar

10、(0); Mat diamond(5,5,CV_8U,Scalar(1); Mat square(5,5,CV_8U,Scalar(1); Mat x(5,5,CV_8U,Scalar(0); for(int i=0;i<5;i+) cross.at<uchar>(2,i)=1; cross.at<uchar>(i,2)=1; diamond.at<uchar>(0,0)=0; diamond.at<uchar>(0,1)=0; diamond.at<uchar>(1,0)=0; diamond.at<uchar>(

11、4,4)=0; diamond.at<uchar>(3,4)=0; diamond.at<uchar>(4,3)=0; diamond.at<uchar>(4,0)=0; diamond.at<uchar>(4,1)=0; diamond.at<uchar>(3,0)=0; diamond.at<uchar>(0,4)=0; diamond.at<uchar>(0,3)=0; diamond.at<uchar>(1,4)=0; for(int i=0;i<5;i+) x.at<uchar

12、>(i,i)=1; x.at<uchar>(4-i,i)=1; 第一個為一個十字型的結(jié)構(gòu)元素,第二個為菱形,第三個是矩形,第四個是一個“X”型。然后我們按下面的順序?qū)σ环鶊D像進(jìn)行操作,并對最后的結(jié)果進(jìn)行閾值化。Mat result;dilate(image,result,cross);erode(result,result,diamond);Mat result2;dilate(image,result2,x);erode(result2,result2,square);absdiff(result2,result,result);threshold(result,resul

13、t,40,255,THRESH_BINARY);經(jīng)過上面步驟,我們得到了一張二值圖像,顯示了圖像的一些角點(diǎn)的位置。為了更形象的說明,我們將上面的這些點(diǎn)在原彩色圖像上標(biāo)出來:/ 標(biāo)記角點(diǎn)void drawOnImage(const Mat& binary,Mat& image) for(int i=0;i<binary.rows;i+) / 獲取行指針 const uchar* data=binary.ptr<uchar>(i); for(int j=0;j<binary.cols;j+) if(dataj) /角點(diǎn)圖像上的白點(diǎn) circle(image,

14、Point(j,i),8,Scalar(0,255,0);/ 畫圈 三、用數(shù)學(xué)形態(tài)學(xué)進(jìn)行車牌定位智能交通中車牌的檢測與識別一直是核心問題,而車牌識別發(fā)展了20余年,已經(jīng)存在了很多的解決方案,我們這里采用數(shù)學(xué)形態(tài)學(xué)來進(jìn)行車牌檢測。本部分并不是一個完整的車牌定位程序,后面還需要進(jìn)行連通區(qū)域的標(biāo)記和篩選以及偽車牌去除等,有興趣的讀者可以繼續(xù)現(xiàn)實(shí)或和我交流。第一步:應(yīng)用形態(tài)學(xué)做豎直方向的邊緣檢測。文章第二部分中已經(jīng)介紹了用形態(tài)學(xué)做邊緣檢測,我們這里只需要修改結(jié)構(gòu)元素就可以實(shí)現(xiàn)只檢測豎直方向上的邊緣。第二步:定義水平方向的閉運(yùn)算和豎直方向的閉運(yùn)算,將豎直的線條連成一塊。第三步:遍歷連通區(qū)域,按照車牌的一些限制條件進(jìn)行篩選即可。int main() Mat cimage=imread("./car.png"); Mat image; cvtColor(cimage,image,CV_BGR2GRAY); Mat result; /檢測豎直邊緣 morphologyEx(image,result,MORPH_GRADIENT,Mat(1,2,CV_8U,Scalar(1); /閾值化 threshold(result,result,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論