




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、前言在圖像處理過程中,經(jīng)常會遇到這樣一部分圖像,圖像的整體部分如果人來看的話一眼就能看出,但是它的內(nèi)部由于有各種小缺口,導(dǎo)致斷開了,這樣在計(jì)算機(jī)“眼”里就被認(rèn)為是斷開的,為了使圖像達(dá)到適應(yīng)人眼的感覺,需要將這些缺口和斷開的口給連接上去,這就需要用到計(jì)算機(jī)圖形學(xué)中的連通域處理技術(shù)。本文給出一個(gè)簡單的連通域處理函數(shù),當(dāng)然這個(gè)函數(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 實(shí)驗(yàn)基礎(chǔ)首先來看這個(gè)連通域處理函數(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是用來將那些小的輪廓去掉,那些小的輪廓時(shí)指它的周長小于(mask長+寬)/perimScale。當(dāng)然你在其內(nèi)部代碼也可以該為面積來判斷。參數(shù)num表示實(shí)際需要處理最多的輪廓的個(gè)數(shù)(如果輸入的mask有多個(gè)輪廓的話),這里的處理是指計(jì)算出這些輪廓的外接矩形和中心點(diǎn)。默認(rèn)值為0,表示函數(shù)內(nèi)部不需要處理這些外接矩形和中心點(diǎn)。參數(shù)bbs表示的是處理完后對應(yīng)輪廓的外接矩形,默認(rèn)值為Rect(),表示不需要返回這些外接矩形。參數(shù)centers表示處理完后對應(yīng)輪廓的中心點(diǎn)坐標(biāo),默認(rèn)值為Point(-1, -1),表示不需要返回這些中心點(diǎn)。 C/
4、C+知識點(diǎn)總結(jié):如果一些函數(shù)需要默認(rèn)值的話,可以直接在函數(shù)定義的時(shí)候指定,該指定并不一定是具體的某個(gè)值,也可以是空值等等。另外在函數(shù)內(nèi)部實(shí)現(xiàn)時(shí),有時(shí)候要注意默認(rèn)值的特殊性。 實(shí)驗(yàn)結(jié)果所需處理原始圖像的灰度圖: 其對應(yīng)的mask圖像: 使用多項(xiàng)式擬合的連通域處理后圖像: 使用凸包集擬合的連通域處理后的圖像: 實(shí)驗(yàn)代碼及注釋(附錄有工程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代替原來的那個(gè)輪廓 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 ); /最開始的輪廓用凸包或者多項(xiàng)式擬合曲線替換 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為輪廓序列中的下一個(gè)輪廓 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); /計(jì)算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é)果求出輪廓的中心點(diǎn)坐標(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融租賃公司業(yè)務(wù)模式創(chuàng)新與操作風(fēng)險(xiǎn)防范策略研究報(bào)告001
- 2025大氣污染防治專項(xiàng)資金項(xiàng)目實(shí)施過程中資金使用效益評估報(bào)告
- 工業(yè)互聯(lián)網(wǎng)平臺光通信技術(shù)升級路徑下的網(wǎng)絡(luò)安全保障策略研究報(bào)告
- 2025年乳制品企業(yè)奶源質(zhì)量控制與品牌價(jià)值提升策略報(bào)告
- 室內(nèi)質(zhì)控失控記錄表
- 2025-2030中國花卉營養(yǎng)液行業(yè)競爭趨勢與銷售規(guī)模預(yù)測報(bào)告
- 醫(yī)療設(shè)備租賃服務(wù)流程再造的應(yīng)急響應(yīng)與處理機(jī)制考核試卷
- 水處理設(shè)備材料抗生物膜形成性能研究考核試卷
- 企業(yè)內(nèi)部溝通障礙分析與改進(jìn)措施考核試卷
- 單板加工廢棄物處理技術(shù)選型與評估考核試卷
- 七年級上冊數(shù)學(xué)知識點(diǎn)總結(jié)及精編例題1
- 學(xué)校物業(yè)服務(wù)監(jiān)督及處罰辦法
- 心內(nèi)科高危藥物安全管理與指引
- 2012《天津市安裝工程預(yù)算基價(jià)》電氣工程(預(yù)算基價(jià)導(dǎo)出)
- 1104基礎(chǔ)報(bào)表填報(bào)說明(最新)
- UCLA肩關(guān)節(jié)評分系統(tǒng)
- 老舊小區(qū)改造技術(shù)標(biāo)-
- 分支型室速的導(dǎo)管消融術(shù)ppt課件
- 2011年吉林省初中生物會考試題
- 長陸電子秤TR700說明書V1.17
- 病例匯報(bào)ppt課件
評論
0/150
提交評論