




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、前言在圖像處理過程中,經(jīng)常會遇到這樣一部分圖像,圖像的整體部分如果人來看的話一眼就能看出,但是它的內(nèi)部由于有各種小缺口,導(dǎo)致斷開了,這樣在計算機(jī)“眼”里就被認(rèn)為是斷開的,為了使圖像達(dá)到適應(yīng)人眼的感覺,需要將這些缺口和斷開的口給連接上去,這就需要用到計算機(jī)圖形學(xué)中的連通域處理技術(shù)。本文給出一個簡單的連通域處理函數(shù),當(dāng)然這個函數(shù)是來自O(shè)penCV著名教程Learning OpenCV中,只不過它的接口是基于c版本的OpenCV,而到目前為止,基于C+接口的OpenCV已經(jīng)是主流,所以我將其接口改成了c+版的,但是其內(nèi)部一些代碼基本沒有動它。開發(fā)環(huán)境:OpenCV2.4.3+QtCreator2.5
2、.1 實驗基礎(chǔ)首先來看這個連通域處理函數(shù)的形式:void ConnectedComponents(Mat &mask_process, int poly1_hull0, float perimScale, int number = 0, Rect &bounding_box = Rect(), Point &contour_centers = Point(-1, -1);參數(shù)mask表示的是需要進(jìn)行連通域處理二值圖像。參數(shù)poly1_hull0表示輪廓邊緣是否采用多邊形擬合,如果該參數(shù)為1,則表示采用
3、多邊形擬合,否則采用凸包擬合。參數(shù)perimScale是用來將那些小的輪廓去掉,那些小的輪廓時指它的周長小于(mask長+寬)/perimScale。當(dāng)然你在其內(nèi)部代碼也可以該為面積來判斷。參數(shù)num表示實際需要處理最多的輪廓的個數(shù)(如果輸入的mask有多個輪廓的話),這里的處理是指計算出這些輪廓的外接矩形和中心點。默認(rèn)值為0,表示函數(shù)內(nèi)部不需要處理這些外接矩形和中心點。參數(shù)bbs表示的是處理完后對應(yīng)輪廓的外接矩形,默認(rèn)值為Rect(),表示不需要返回這些外接矩形。參數(shù)centers表示處理完后對應(yīng)輪廓的中心點坐標(biāo),默認(rèn)值為Point(-1, -1),表示不需要返回這些中心點。 C/
4、C+知識點總結(jié):如果一些函數(shù)需要默認(rèn)值的話,可以直接在函數(shù)定義的時候指定,該指定并不一定是具體的某個值,也可以是空值等等。另外在函數(shù)內(nèi)部實現(xiàn)時,有時候要注意默認(rèn)值的特殊性。 實驗結(jié)果所需處理原始圖像的灰度圖: 其對應(yīng)的mask圖像: 使用多項式擬合的連通域處理后圖像: 使用凸包集擬合的連通域處理后的圖像: 實驗代碼及注釋(附錄有工程code下載地址):main.cpp:#include <iostream>#include <opencv.hpp>using namespace cv;using namespace st
5、d;/Just some convienience macros#define CV_CVX_WHITE CV_RGB(0xff,0xff,0xff)#define CV_CVX_BLACK CV_RGB(0x00,0x00,0x00)void ConnectedComponents(Mat &mask_process, int poly1_hull0, float perimScale, int number = 0, Rect &bounding_box = Rect(), Point &contour_centers = Point(-1, -1) /*下面4句代
6、碼是為了兼容原函數(shù)接口,即內(nèi)部使用的是c風(fēng)格,但是其接口是c+風(fēng)格的*/ IplImage *mask = &mask_process.operator IplImage(); int *num = &number; CvRect *bbs = &bounding_box.operator CvRect(); CvPoint *centers = &contour_centers.operator CvPoint(); static CvMemStorage* mem_storage = NULL; static CvSeq* contours = NULL;
7、/CLEAN UP RAW MASK /開運(yùn)算作用:平滑輪廓,去掉細(xì)節(jié),斷開缺口 cvMorphologyEx( mask, mask, NULL, NULL, CV_MOP_OPEN, 1 );/對輸入mask進(jìn)行開操作,CVCLOSE_ITR為開操作的次數(shù),輸出為mask圖像 /閉運(yùn)算作用:平滑輪廓,連接缺口 cvMorphologyEx( mask, mask, NULL, NULL, CV_MOP_CLOSE, 1 );/對輸入mask進(jìn)行閉操作,CVCLOSE_ITR為閉操作的次數(shù),輸出為mask圖像 /FIND CONTOURS AROUND ONLY BIGGER REGIONS
8、 if( mem_storage=NULL ) mem_storage = cvCreateMemStorage(0); else cvClearMemStorage(mem_storage); /CV_RETR_EXTERNAL=0是在types_c.h中定義的,CV_CHAIN_APPROX_SIMPLE=2也是在該文件中定義的 CvContourScanner scanner = cvStartFindContours(mask,mem_storage,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE); CvSeq* c
9、; int numCont = 0; /該while內(nèi)部只針對比較大的輪廓曲線進(jìn)行替換處理 while( (c = cvFindNextContour( scanner ) != NULL ) double len = cvContourPerimeter( c ); double q = (mask->height + mask->width) /perimScale; /calculate perimeter len threshold if( len < q ) /Get rid of blob if it's perimeter is too small cv
10、SubstituteContour( scanner, NULL ); /用NULL代替原來的那個輪廓 else /Smooth it's edges if it's large enough CvSeq* c_new; if(poly1_hull0) /Polygonal approximation of the segmentation c_new = cvApproxPoly(c,sizeof(CvContour),mem_storage,CV_POLY_APPROX_DP, 2,0); else /Convex Hull of the segmentation c_ne
11、w = cvConvexHull2(c,mem_storage,CV_CLOCKWISE,1); cvSubstituteContour( scanner, c_new ); /最開始的輪廓用凸包或者多項式擬合曲線替換 numCont+; contours = cvEndFindContours( &scanner ); /結(jié)束輪廓查找操作 / PAINT THE FOUND REGIONS BACK INTO THE IMAGE cvZero( mask ); IplImage *maskTemp; /CALC CENTER OF MASS AND OR BOUNDING RECTA
12、NGLES if(*num != 0) int N = *num, numFilled = 0, i=0; CvMoments moments; double M00, M01, M10; maskTemp = cvCloneImage(mask); for(i=0, c=contours; c != NULL; c = c->h_next,i+ ) /h_next為輪廓序列中的下一個輪廓 if(i < N) /Only process up to *num of them /CV_CVX_WHITE在本程序中是白色的意思 cvDrawContours(maskTemp,c,CV_
13、CVX_WHITE, CV_CVX_WHITE,-1,CV_FILLED,8); /Find the center of each contour if(centers != &cvPoint(-1, -1) cvMoments(maskTemp,&moments,1); /計算mask圖像的最高達(dá)3階的矩 M00 = cvGetSpatialMoment(&moments,0,0); /提取x的0次和y的0次矩 M10 = cvGetSpatialMoment(&moments,1,0); /提取x的1次和y的0次矩 M01 = cvGetSpatialMom
14、ent(&moments,0,1); /提取x的0次和y的1次矩 centersi.x = (int)(M10/M00); /利用矩的結(jié)果求出輪廓的中心點坐標(biāo) centersi.y = (int)(M01/M00); /Bounding rectangles around blobs if(bbs != &CvRect() bbsi = cvBoundingRect(c); /算出輪廓c的外接矩形 cvZero(maskTemp); numFilled+; /Draw filled contours into mask cvDrawContours(mask,c,CV_CVX_
15、WHITE,CV_CVX_WHITE,-1,CV_FILLED,8); /draw to central mask /end looping over contours *num = numFilled; cvReleaseImage( &maskTemp); /ELSE JUST DRAW PROCESSED CONTOURS INTO THE MASK else for( c=contours; c != NULL; c = c->h_next ) cvDrawContours(mask,c,CV_CVX_WHITE, CV_CVX_BLACK,-1,CV_FILLED,8); int main() Mat src, mask; src = imread("test.png", 0); /以灰度圖像讀入 imshow("src", src); mask = src > 0; /轉(zhuǎn)換為二值圖像 imshow("ma
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 修繕采購協(xié)議合同范本
- 兼職輔導(dǎo)老師合同范例
- 新能源汽車動力蓄電池系統(tǒng)構(gòu)造與檢修 項目三-課后習(xí)題帶答案
- 勞務(wù)分包用工合同范本
- 公司銷售渠道合同范本
- 農(nóng)民玉米出售合同范本
- 2024年杭州銀行招聘考試真題
- 2024年江西省人才服務(wù)有限公司招聘筆試真題
- 企業(yè)雇傭貨車合同范本
- 以修代租 合同范本
- DB11T 852-2019 有限空間作業(yè)安全技術(shù)規(guī)范
- 最新2022年減肥食品市場現(xiàn)狀與發(fā)展趨勢預(yù)測
- 材料化學(xué)合成與制備技術(shù)
- DB23∕T 343-2003 國有林區(qū)更新造林技術(shù)規(guī)程
- 發(fā)展?jié)h語初級綜合1:第30課PPT課件[通用]
- 馬工程西方經(jīng)濟(jì)學(xué)(第二版)教學(xué)課件-(4)
- 醫(yī)療廢物管理組織機(jī)構(gòu)架構(gòu)圖
- cjj/t135-2009《透水水泥混凝土路面技術(shù)規(guī)程》
- 社保人事專員績效考核表
- 杭州育才小升初數(shù)學(xué)試卷(共4頁)
- 旋挖樁主要施工方法及技術(shù)措施(全護(hù)筒)
評論
0/150
提交評論