cvErode和cvDilate腐蚀和膨胀函数————OpenCV笔记(七)

   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多次,图像的噪音消除,物体内细小物质也被填充。


第一幅图右边为原图,左边为腐蚀后消除了噪音点和干扰点的图。

cvErode和cvDilate腐蚀和膨胀函数————OpenCV笔记(七)_第1张图片


第二幅图右边是和第一幅图一样的原图,但是左边的图像是对第一幅图像左边的图进行了膨胀操作,可以看到, 物体内细小物质被填充。

cvErode和cvDilate腐蚀和膨胀函数————OpenCV笔记(七)_第2张图片


通过这样的多次迭代腐蚀再膨胀的过程,可以得到效果更好的检测图像,方便后续提取运动目标操作。


你可能感兴趣的:(OpenCV)