腐蚀:

cvErode

锚点:用于判断的中心点

关心点:为0不关心,为1关心

腐蚀的时候锚点对准图像的像素,这个像素的值取锚点和关心点中的最小值,注意都是和原图像对比,前面因腐蚀变化的点不影响后面腐蚀的点

膨胀:

cvDilate

和腐蚀相反,取锚点和关心点中的最大值

程序:

腐蚀和膨胀_第1张图片

代码:

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include 
int ErodeDilate(int argc,char** argv)
{
IplImage* p_w_picpath=cvLoadImage("e:\\picture\\5.JPG");
cvNamedWindow("src");
cvShowImage("src",p_w_picpath);
//步骤1:创建自定义元素
int cols=4; //定义元素的列数
int rows=4; //定义元素的行数
int anchor_x=2; //定义锚点在这个元素中的x坐标,注意坐标从0开始
int anchor_y=2; //定义锚点的y坐标
int value[]={0,0,0,0,
         0,0,1,0,
 0,1,1,0,
 0,0,0,0
};
IplConvKernel* element=cvCreateStructuringElementEx(cols,rows,anchor_x,anchor_y,CV_SHAPE_CUSTOM,value);
//步骤2:先膨胀,取最大值,去掉黑色(小值)点
IplImage* DilateDst=cvCreateImage(cvGetSize(p_w_picpath),8,3);
cvDilate(p_w_picpath,DilateDst,element,5);
cvNamedWindow("DilateDst");
cvShowImage("DilateDst",DilateDst);
//步骤3:再腐蚀,扩大小值(如黑色部分)
IplImage* ErodeDst=cvCreateImage(cvGetSize(DilateDst),8,3);
cvErode(DilateDst,ErodeDst,element,5);
cvNamedWindow("ErodeDst");
cvShowImage("ErodeDst",ErodeDst);
cvWaitKey(0);
cvDestroyWindow("src");
cvDestroyWindow("DilateDst");
cvDestroyWindow("ErodeDst");
cvReleaseImage(&p_w_picpath);
cvReleaseImage(&DilateDst);
cvReleaseImage(&ErodeDst);
return 0;
}