




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、前言在圖像處理過程中,經(jīng)常會(huì)遇到這樣一部分圖像,圖像的整體部分如果人來(lái)看的話一眼就能看出,但是它的內(nèi)部由于有各種小缺口,導(dǎo)致斷開了,這樣在計(jì)算機(jī)“眼”里就被認(rèn)為是斷開的,為了使圖像達(dá)到適應(yīng)人眼的感覺,需要將這些缺口和斷開的口給連接上去,這就需要用到計(jì)算機(jī)圖形學(xué)中的連通域處理技術(shù)。本文給出一個(gè)簡(jiǎn)單的連通域處理函數(shù),當(dāng)然這個(gè)函數(shù)是來(lái)自O(shè)penCV著名教程Learning OpenCV中,只不過它的接口是基于c版本的OpenCV,而到目前為止,基于C+接口的OpenCV已經(jīng)是主流,所以我將其接口改成了c+版的,但是其內(nèi)部一些代碼基本沒有動(dòng)它。開發(fā)環(huán)境:OpenCV2.4.3+QtCreator2.5
2、.1 實(shí)驗(yàn)基礎(chǔ)首先來(lái)看這個(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是用來(lái)將那些小的輪廓去掉,那些小的輪廓時(shí)指它的周長(zhǎng)小于(mask長(zhǎng)+寬)/perimScale。當(dāng)然你在其內(nèi)部代碼也可以該為面積來(lái)判斷。參數(shù)num表示實(shí)際需要處理最多的輪廓的個(gè)數(shù)(如果輸入的mask有多個(gè)輪廓的話),這里的處理是指計(jì)算出這些輪廓的外接矩形和中心點(diǎn)。默認(rèn)值為0,表示函數(shù)內(nèi)部不需要處理這些外接矩形和中心點(diǎn)。參數(shù)bbs表示的是處理完后對(duì)應(yīng)輪廓的外接矩形,默認(rèn)值為Rect(),表示不需要返回這些外接矩形。參數(shù)centers表示處理完后對(duì)應(yīng)輪廓的中心點(diǎn)坐標(biāo),默認(rèn)值為Point(-1, -1),表示不需要返回這些中心點(diǎn)。 C/
4、C+知識(shí)點(diǎn)總結(jié):如果一些函數(shù)需要默認(rèn)值的話,可以直接在函數(shù)定義的時(shí)候指定,該指定并不一定是具體的某個(gè)值,也可以是空值等等。另外在函數(shù)內(nèi)部實(shí)現(xiàn)時(shí),有時(shí)候要注意默認(rèn)值的特殊性。 實(shí)驗(yàn)結(jié)果所需處理原始圖像的灰度圖: 其對(duì)應(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 );/對(duì)輸入mask進(jìn)行開操作,CVCLOSE_ITR為開操作的次數(shù),輸出為mask圖像 /閉運(yùn)算作用:平滑輪廓,連接缺口 cvMorphologyEx( mask, mask, NULL, NULL, CV_MOP_CLOSE, 1 );/對(duì)輸入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)部只針對(duì)比較大的輪廓曲線進(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代替原來(lái)的那個(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 元宇宙社交平臺(tái)虛擬社交平臺(tái)虛擬空間布局與用戶體驗(yàn)提升報(bào)告
- 2025年金融行業(yè)反洗錢技術(shù)革命與創(chuàng)新監(jiān)管機(jī)制解讀報(bào)告
- 社區(qū)心理健康服務(wù)在社區(qū)心理健康服務(wù)體系建設(shè)中的實(shí)施效果研究與實(shí)踐評(píng)估探索報(bào)告
- 2025年電動(dòng)汽車電池?zé)峁芾硐到y(tǒng)熱管理材料創(chuàng)新與應(yīng)用趨勢(shì)報(bào)告
- 城市公園改造提升項(xiàng)目社會(huì)穩(wěn)定風(fēng)險(xiǎn)評(píng)估與城市綠地生態(tài)效益評(píng)估報(bào)告
- 分布式能源系統(tǒng)2025年生物質(zhì)能源的生物質(zhì)能熱電聯(lián)產(chǎn)政策環(huán)境研究報(bào)告
- 培訓(xùn)機(jī)構(gòu)課時(shí)費(fèi)管理制度
- 江濱公園日常管理制度
- 2025年四川省德陽(yáng)市中考英語(yǔ)真題(解析版)
- 月餅成品包裝管理制度
- DB4201∕T 645-2021 房地產(chǎn)經(jīng)紀(jì)服務(wù)規(guī)范
- 撥叉綜合課程設(shè)計(jì)
- 壓鑄件QC工程圖
- pH 值對(duì)檸檬酸緩凝效果影響的研究
- 學(xué)校物業(yè)服務(wù)監(jiān)督及處罰辦法
- 1104基礎(chǔ)報(bào)表填報(bào)說(shuō)明(最新)
- 老舊小區(qū)改造技術(shù)標(biāo)-
- 705型試驗(yàn)臺(tái)技術(shù)條件及說(shuō)明書
- 天麻、豬苓種植技術(shù)教學(xué)大綱
- 漢字的起源與演變過程.ppt
- 2011年吉林省初中生物會(huì)考試題
評(píng)論
0/150
提交評(píng)論