基础学习笔记之连通域处理函数(DOC)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

前言

在图像处理过程中,经常会遇到这样一部分图像,图像的整体部分如果人来看的话一眼就能看出,但是它的内部由于有各种小缺口,导致断开了,这样在计算机“眼”里就被认为是断开的,为了使图像达到适应人眼的感觉,需要将这些缺口和断开的口给连接上去,这就需要用到计算机图形学中的连通域处理技术。本文给出一个简单的连通域处理函数,当然这个函数是来自OpenCV著名教程Learning OpenCV中,只不过它的接口是基于c版本的OpenCV,而到目前为止,基于C++接口的OpenCV已经是主流,所以我将其接口改成了c++版的,但是其内部一些代码基本没有动它。

开发环境:OpenCV2.4.3+QtCreator2.5.1

实验基础

首先来看这个连通域处理函数的形式:

void ConnectedComponents(Mat &mask_process, int poly1_hull0, float perimScale, int number = 0, Rect &bounding_box = Rect(), Point

&contour_centers = Point(-1, -1));

参数mask表示的是需要进行连通域处理二值图像。

参数poly1_hull0表示轮廓边缘是否采用多边形拟合,如果该参数为1,则表示采用多边形拟合,否则采用凸包拟合。

参数perimScale是用来将那些小的轮廓去掉,那些小的轮廓时指它的周长小于(mask长+宽)/perimScale。当然你在其内部代码也可以该为面积来判断。

参数num表示实际需要处理最多的轮廓的个数(如果输入的mask有多个轮廓的话),这里的处理是指计算出这些轮廓的外接矩形和中心点。默认值为0,表示函数内部不需要处理这些外接矩形和中心点。

参数bbs表示的是处理完后对应轮廓的外接矩形,默认值为Rect(),表示不需要返回这些外接矩形。

参数centers表示处理完后对应轮廓的中心点坐标,默认值为Point(-1, -1),表示不需要返回这些中心点。

C/C++知识点总结:

如果一些函数需要默认值的话,可以直接在函数定义的时候指定,该指定并不一定是具体的某个值,也可以是空值等等。另外在函数内部实现时,有时候要注意默认值的特殊性。

实验结果

所需处理原始图像的灰度图:

其对应的mask图像:

使用多项式拟合的连通域处理后图像:

使用凸包集拟合的连通域处理后的图像:

实验代码及注释(附录有工程code下载地址):

main.cpp:

#include

#include

using namespace cv;using namespace std;

//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句代码是为了兼容原函数接口,即内部使用的是c风格,但是其

接口是c++风格的*/

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;

//CLEAN UP RAW MASK

//开运算作用:平滑轮廓,去掉细节,断开缺口

cvMorphologyEx( mask, mask, NULL, NULL, CV_MOP_OPEN, 1);//对输入mask进行开操作,CVCLOSE_ITR为开操作的次数,输出为mask

图像

//闭运算作用:平滑轮廓,连接缺口

cvMorphologyEx( mask, mask, NULL, NULL, CV_MOP_CLOSE, 1);//对输入mask进行闭操作,CVCLOSE_ITR为闭操作的次数,输出为mask

图像

//FIND CONTOURS AROUND ONLY BIGGER REGIONS

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;

int numCont = 0;

//该while内部只针对比较大的轮廓曲线进行替换处理

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

相关文档
最新文档