Erode腐蚀,Dilate膨胀,这两个形态学函数总是成对出现,前者可以消除较小独点如噪音,后者可以使不连通的图像合并成块。
void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 )
void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );
这两个函数的参数相同,是一对“相反”的函数(这里的相反并不是指后一个函数可以将前一个函数处理的图像恢复,而是一个缩小图像团块,一个放大图像的团块)
src
输入图像.
dst
输出图像.
element
用于膨胀的结构元素。若为 NULL, 则使用 3×3 长方形的结构元素
iterations
膨胀的次数
膨胀可以重复进行 (iterations) 次. 对彩色图像,每个彩色通道单独处理。
下面的程序将演示这两个函数,腐蚀和膨胀的过程
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
int main(int argc,char** argv)
{
if(argc<2)
return 0;
int a=1;
int eIter=1,dIter=1,exitFlag=1;
IplImage *image,*image1,*image2;
image = cvLoadImage(argv[1]);
image1 = cvCreateImage(cvSize(image->width,image->height),8,1);
image2 = cvCreateImage(cvSize(image->width,image->height),8,1);
cvCvtColor(image,image1,CV_RGB2GRAY);
cvCvtColor(image,image2,CV_RGB2GRAY);
cvNamedWindow("image",1);
cvShowImage("image",image);
cvNamedWindow("Select",1);
cvCreateTrackbar("eIterations","Select",&eIter,20,0);
cvCreateTrackbar("dIterations","Select",&dIter,20,0);
cvNamedWindow("Erode",1);
cvNamedWindow("Dilate",1);
cvShowImage("Erode",image1);
cvShowImage("Dilate",image2);
cvWaitKey(0);
while(1)
{
//腐蚀,消除细小物质
cvErode(image1,image1,0,2);
cvShowImage("Erode",image1);
std::cout<<"Erode"<
这个程序可以选择迭代次数为1,然后不断循环(可以作为迭代次数),观察每次迭代后的效果。
效果:
下面是实验效果(原图是在车辆跟踪中用帧间差分法得到的二值化图像),可以发现通过先腐蚀Erode多次,后膨胀Dilate多次,图像的噪音消除,物体内细小物质也被填充。
第一幅图右边为原图,左边为腐蚀后消除了噪音点和干扰点的图。
第二幅图右边是和第一幅图一样的原图,但是左边的图像是对第一幅图像左边的图进行了膨胀操作,可以看到, 物体内细小物质被填充。
通过这样的多次迭代腐蚀再膨胀的过程,可以得到效果更好的检测图像,方便后续提取运动目标操作。