OPenCV的中cvErode和cvDilate腐蚀和膨胀函数

   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) 次. 对彩色图像,每个彩色通道单独处理。 

   下面的程序将演示这两个函数,腐蚀和膨胀的过程


   
   

  1. <code class=“language-cpp”>#include “cv.h”  
  2. #include “cxcore.h”  
  3. #include “highgui.h”  
  4. int main(int argc,char** argv)  
  5. {  
  6.     if(argc<2)  
  7.         return 0;  
  8.     int a=1;  
  9.     int eIter=1,dIter=1,exitFlag=1;  
  10.     IplImage *image,*image1,*image2;  
  11.     image = cvLoadImage(argv[1]);  
  12.     image1 = cvCreateImage(cvSize(image->width,image->height),8,1);  
  13.     image2 = cvCreateImage(cvSize(image->width,image->height),8,1);  
  14.       
  15.     cvCvtColor(image,image1,CV_RGB2GRAY);  
  16.     cvCvtColor(image,image2,CV_RGB2GRAY);  
  17.     cvNamedWindow(”image”,1);  
  18.     cvShowImage(”image”,image);  
  19.   
  20.     cvNamedWindow(”Select”,1);  
  21.     cvCreateTrackbar(”eIterations”,“Select”,&eIter,20,0);  
  22.     cvCreateTrackbar(”dIterations”,“Select”,&dIter,20,0);  
  23.     cvNamedWindow(”Erode”,1);  
  24.     cvNamedWindow(”Dilate”,1);  
  25.     cvShowImage(”Erode”,image1);  
  26.     cvShowImage(”Dilate”,image2);  
  27.     cvWaitKey(0);  
  28.       
  29.    while(1)  
  30.    {  
  31.        //腐蚀,消除细小物质  
  32.     cvErode(image1,image1,0,2);  
  33.       
  34.     cvShowImage(”Erode”,image1);  
  35.     std::cout<<”Erode”<<std::endl;  
  36.   
  37.     a=cvWaitKey(0);  
  38.     if((char) a == ‘q’)  
  39.         break;  
  40.    }  
  41.    
  42.    cvCopy(image1,image2);  
  43.    a=1;  
  44.    while(1)  
  45.    {  
  46.     //腐蚀,填充物体内细小物质  
  47.     cvDilate(image2,image2,0,1);  
  48.   
  49.     cvShowImage(”Dilate”,image2);  
  50.         std::cout<<”Dilate”<<std::endl;  
  51.   
  52.         a=cvWaitKey(0);  
  53.   
  54.     if((char) a == ‘q’)  
  55.         break;  
  56.    }  
  57.     return 0;  
  58. }</code>  

    
    
  1. #include "cv.h"
  2. #include "cxcore.h"
  3. #include "highgui.h"
  4. int main(int argc,char** argv)
  5. {
  6. if(argc< 2)
  7. return 0;
  8. int a= 1;
  9. int eIter= 1,dIter= 1,exitFlag= 1;
  10. IplImage *image,*image1,*image2;
  11. image = cvLoadImage(argv[ 1]);
  12. image1 = cvCreateImage(cvSize(image->width,image->height), 8, 1);
  13. image2 = cvCreateImage(cvSize(image->width,image->height), 8, 1);
  14. cvCvtColor(image,image1,CV_RGB2GRAY);
  15. cvCvtColor(image,image2,CV_RGB2GRAY);
  16. cvNamedWindow( "image", 1);
  17. cvShowImage( "image",image);
  18. cvNamedWindow( "Select", 1);
  19. cvCreateTrackbar( "eIterations", "Select",&eIter, 20, 0);
  20. cvCreateTrackbar( "dIterations", "Select",&dIter, 20, 0);
  21. cvNamedWindow( "Erode", 1);
  22. cvNamedWindow( "Dilate", 1);
  23. cvShowImage( "Erode",image1);
  24. cvShowImage( "Dilate",image2);
  25. cvWaitKey( 0);
  26. while( 1)
  27. {
  28. //腐蚀,消除细小物质
  29. cvErode(image1,image1, 0, 2);
  30. cvShowImage( "Erode",image1);
  31. std:: cout<< "Erode"<< std:: endl;
  32. a=cvWaitKey( 0);
  33. if(( char) a == 'q')
  34. break;
  35. }
  36. cvCopy(image1,image2);
  37. a= 1;
  38. while( 1)
  39. {
  40. //腐蚀,填充物体内细小物质
  41. cvDilate(image2,image2, 0, 1);
  42. cvShowImage( "Dilate",image2);
  43. std:: cout<< "Dilate"<< std:: endl;
  44. a=cvWaitKey( 0);
  45. if(( char) a == 'q')
  46. break;
  47. }
  48. return 0;
  49. }


这个程序可以选择迭代次数为1,然后不断循环(可以作为迭代次数),观察每次迭代后的效果。


效果:

下面是实验效果(原图是在车辆跟踪中用帧间差分法得到的二值化图像),可以发现通过先腐蚀Erode多次,后膨胀Dilate多次,图像的噪音消除,物体内细小物质也被填充。


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



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



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

转载自:https://blog.csdn.net/futurewu/article/details/10047409

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值