腐蚀和膨胀在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
相关文章推荐
- Tomcat的组成(Tomcat独有)
- linux find acm time
- CentOS7 nfs搭建
- 部署JavaWeb应用到Tomcat服务器上
- 配置Nginx来支持php
- Tomcat简介及常见问题
- graphite快速搭建手册
- BitmapFactory.Options
- linux命令之sed, awk, grep, cut
- bash内置命令
- LINUX sed grep awk之间比较整理
- centOS中mysql的常用指令
- [原]VNC client 图形化连接 linux
- linux基础(21)--磁盘阵列RAID--RHEL6.5
- linux之文件批量重命名
- 阿里云服务器centos部署web环境的步骤详解
- Nginx upstream schedule strategy
- 描述三维离散点的ROPS特征
- shell脚本中一些特殊符号
- 探索《How Tomcat Works》心得(三)--容器