您的位置:首页 > 运维架构

腐蚀和膨胀在opencv上的学习

2016-05-18 19:48 357 查看
  

简单介绍:

图像处理离不开矩阵卷积,这个也不例外。

膨胀的卷积图:



注意的是,源图像不可与目标图像设为同一个,否则第三行和第四行后四个将全被标记。这在OPENCV的程序中也得到了体现。

上图我的理解是小模板的原点在(0,1)处,然后与源图像进行模板卷积得到了结果。

腐蚀的模板卷积图:



膨胀是在模板卷积的基础上做或运算,腐蚀则是做与运算。如上图,尽在最后涂黑的两个点与模板原点(标十字)的点对齐,然后卷积后才可以得到三个'1',所以与后是1,其他的与运算后都是0。

腐蚀图的结果容易理解。

程序:
可以利用OPENCV默认的模板进行腐蚀和膨胀,当然要自己指定大小和原点位置。

以下程序是闭运算:先膨胀后腐蚀,填充空洞的效果

[cpp] view
plain copy

void Close(IplImage *img)

{

IplImage *temp = cvCreateImage(cvSize(img->width, img->height), img->depth, img->nChannels);

element = cvCreateStructuringElementEx(3,3,1,1,CV_SHAPE_RECT,0);//创建结构元素

cvDilate(img,temp,element,1);//膨胀图像

cvErode(temp,img,element,1);//腐蚀图像

cvReleaseImage(&temp);

}

其中:

[cpp] view
plain copy

cvCreateStructuringElementEx(3,3,1,1,CV_SHAPE_RECT,0);

前两个参数指定模板大小,接着的两个是指定模板上的某个点作为原点,第五个是模板类型,最后一个在用自己提供的模板是才用到。

若想用自己的模板,只需两条语句即可:

[cpp] view
plain copy

intmask[9] = {1, 1, 1, 1, 1, 0, 1, 1, 1};

element=cvCreateStructuringElementEx(3,3,1,1,CV_SHAPE_CUSTOM,mask );

指定模板后,只需要调用膨胀与腐蚀的函数即可

[cpp] view
plain copy

cvDilate(img,temp,element,1);//膨胀图像

cvErode(temp,img,element,1);//腐蚀图像

最后一个参数是指定迭代腐蚀或者膨胀的次数。

详细的讲解:http://wenku.baidu.com/view/1923d18fcc22bcd126ff0ccc.html

腐蚀膨胀是图像形态学比较常见的处理,腐蚀一般可以用来消除噪点,分割出独立的图像元素等。

  一般腐蚀操作对二值图进行处理,腐蚀操作如下图,中心位置的像素点是否与周围领域的像素点颜色一样(即是否是白色点,即值是否为255),若一致,则保留,不一致则该点变为黑色(值即为0)

  


  opencv中的腐蚀操作:

CVAPI(void)  cvErode( const CvArr* src, CvArr* dst,
IplConvKernel* element CV_DEFAULT(NULL),
int iterations CV_DEFAULT(1) );


  前两个参数比较熟悉,第三个参数是用于传递模板的信息,默认是(NULL),即为3*3的模板,第四个参数是迭代的次数(即该腐蚀操作做几次)

  opencv中的膨胀操作其实就是腐蚀的反操作:

CVAPI(void)  cvDilate( const CvArr* src, CvArr* dst,
IplConvKernel* element CV_DEFAULT(NULL),
int iterations CV_DEFAULT(1) );


  测试代码:

  


View
Code

  效果图:

  


  以上都是在模板3*3的情况下处理的,要是我们期望使用自己定义的模板时候,就需要自己做模板。

  

CVAPI(IplConvKernel*)  cvCreateStructuringElementEx(
int cols, int  rows, int  anchor_x, int  anchor_y,
int shape, int* values CV_DEFAULT(NULL) );


前两个参数是定义模板的大小,后两个参数是参考点的坐标(比如默认3*3模板的参考点坐标是2*2),第五个参数是模板的类型(可以是矩形,十字形,椭圆形,甚至是用户自己定义形状),最后一个参数是在使用自自定义形状的时候,通过value传递模板的形状。

模板的类型:



CVAPI(void)  cvReleaseStructuringElement( IplConvKernel** element ); //释放模板所占用的内存


自定义5*5,参考点(3,3)的矩形模板的测试代码:


View
Code

效果图:



参考:学习opencv
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: