【OpenCV_06】图像滤波器Filtering Images-腐蚀函数cvErode 和 膨胀函数cvDilate

原创 2016年05月31日 14:08:34
图像滤波在计算机视觉中占很大比重,是大部分计算机视觉应用的基础。对图像滤波应该在应用之前完成。OpenCV内建了很多图像滤波方法(OpenCV 2.X 及C++ )

  • 改变图像或视频的亮度
  • 改变图像或视频的对比对
  • 灰度图或彩色图像直方图均衡化
  • 平滑/模糊图像


下面就是本篇博文的例子OpenCV 2.1 C语言版本 (注意不是 C++)
  • 侵蚀 Eroding 
  • 扩张 Dilating
  • 反转 Inverting

侵蚀 Eroding 扩张 Dilating,这两个形态学函数总是成对出现,前者可以消除较小的点如噪音,后者可以使不连通的图像合并成块。

下面是我要进行滤波的原始图片,我在老友记中的女神,Rachel Karen Green。


Original Image  


Eroding 侵蚀


///////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <cv.h>
#include <highgui.h>

int main()
{
        //display the original image
        IplImage* img = cvLoadImage("C:/MyPic.jpg");
        cvNamedWindow("MyWindow");
        cvShowImage("MyWindow", img);

        //erode and display the eroded image
        cvErode(img, img, 0, 2);
        cvNamedWindow("Eroded");
        cvShowImage("Eroded", img);
        
        cvWaitKey(0);
        
        //cleaning up
        cvDestroyWindow("MyWindow");
        cvDestroyWindow("Eroded");
        cvReleaseImage(&img);
        
        return 0;
} 
///////////////////////////////////////////////////////////////////////////////////////




Eroded Image

新出现的OpenCV函数

  • cvErode(img, img, 0, 2)

第一个参数是图像源文件

第二个参数是将被侵蚀的目标文件

第三个参数是用于侵蚀的结构元素。如果它是0,则使用3×3的矩形结构元素进行侵蚀。

第四个参数是侵蚀次数。


  • 腐蚀的算法用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作:如果都为1,结果图像的该像素为1。否则为0。 
  • 结           果:使二值图像减小一圈 
  • 主 要 应  用:消除较小的点如噪音


可以看到明显的去除了干扰噪点。
Dilating 膨胀

Dilating 膨胀函数 是侵蚀函数的反操作。

///////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <cv.h>
#include <highgui.h>

int main()
{
        //display the original image
        IplImage* img = cvLoadImage("C:/MyPic.jpg");
        cvNamedWindow("MyWindow");
        cvShowImage("MyWindow", img);

        //dilate and display the dilated image
        cvDilate(img, img, 0, 2);
        cvNamedWindow("Dilated");
        cvShowImage("Dilated", img);

        cvWaitKey(0);
        
        //cleaning up
        cvDestroyWindow("MyWindow");
        cvDestroyWindow("Dilated");
        cvReleaseImage(&img);
        
        return 0;
}
/////////////////////////////////////////////////////////////////////////////////////// 


  • 腐蚀的算法用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作:如果都为0,结果图像的该像素为0。否则为1。 
  • 结           果使二值图像扩大一圈 
  • 主 要 应  用:消除较小的点如噪音


Dilated Image


新出现的OpenCV函数

  • cvDilate(img, img, 0, 2)

第一个参数是图像源文件

第二个参数是将被侵蚀的目标文件

第三个参数是用于侵蚀的结构元素。如果它是0,则使用3×3的矩形结构元素进行膨胀。

第四个参数是膨胀次数。


Inverting 图像反转


///////////////////////////////////////////////////////////////////////////////////////


#include "stdafx.h"
#include <cv.h>
#include <highgui.h>

int main()
{
        //display the original image
        IplImage* img = cvLoadImage("C:/MyPic.jpg");
        cvNamedWindow("MyWindow");
        cvShowImage("MyWindow", img);

        //invert and display the inverted image
        cvNot(img, img);
        cvNamedWindow("Inverted");
        cvShowImage("Inverted", img);

        cvWaitKey(0);
       
        //cleaning up
        cvDestroyWindow("MyWindow");
        cvDestroyWindow("Inverted");
        cvReleaseImage(&img);
       
        return 0;
}


///////////////////////////////////////////////////////////////////////////////////////


Inverted Image



新出现的OpenCV函数

  • cvNot(img, img)


这个函数是反转图像中的每个像素,第一个参数是源图像,第二个参数是目标图像。


e.g - 作为8位图,0的值将被映射为(255-0)=255
                             值46值将被映射为 (255-46)=209

        作为16位图,0的值将被映射为 (65535-0)=65535
                             值46值将被映射为  (65535-46)=65489  

综合应用

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


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



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

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





版权声明:本文为博主原创文章,未经博主允许不得转载。

腐蚀函数cvErode 和 膨胀函数cvDilate

一   引言        数学形态学是一门建立在集论基础上的学科,是几何形态学分析和描述的有力工具。数学形态学的历史可回溯到19世纪。1964年法国的Matheron和Serra在积分几何的研究成果...
  • PINBODEXIAOZHU
  • PINBODEXIAOZHU
  • 2014年12月09日 21:32
  • 7155

cvDilate()膨胀 cvErode()腐蚀函数

void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 );void cv...
  • shandianling
  • shandianling
  • 2011年05月07日 11:14
  • 9349

Emgu 膨胀&腐蚀&阈值分割

Emgu膨胀、腐蚀、阈值分割运算
  • cvMat
  • cvMat
  • 2016年12月17日 14:30
  • 1884

不使用库函数实现形态学处理(腐蚀和膨胀)

自己看着数字图像处理的算法,用c++试着实现以下形态学的基本算法,编写的不是很规范,同时算法还是有点bug,不是非常完美,是我第一次写博客,希望大家见谅。我自己花了些时间寻找bug,但是还是没找出来,...
  • qq_31112205
  • qq_31112205
  • 2016年11月20日 21:20
  • 284

(未实用)opencv3.0 函数学习 9——膨胀与腐蚀

(膨胀与腐蚀需要进行类封装) 以下内容转载自   http://blog.csdn.net/poem_qianmo/article/details/23710721 本篇文章中,我们一起探究...
  • banjiding8023
  • banjiding8023
  • 2016年08月09日 14:58
  • 1128

opencv python 图片腐蚀和膨胀

opencv python 图片腐蚀和膨胀
  • jacke121
  • jacke121
  • 2017年07月18日 23:04
  • 845

cvErode腐蚀 cvDilate膨胀

作用:   Erode腐蚀,Dilate膨胀,这两个形态学函数总是成对出现,            前者可以消除较小独点如噪音,后者可以使不连通的图像合并成块。   函数形式: ...
  • Alinxxl
  • Alinxxl
  • 2016年06月16日 16:19
  • 178

图像的“膨胀”与“腐蚀”

原文请参考 http://blog.csdn.net/poem_qianmo/article/details/23710721 //---------------------------------...
  • yarina
  • yarina
  • 2016年05月09日 16:57
  • 4980

OpenCv:cvDilate()膨胀 cvErode()腐蚀函数

void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL, int iterations=1 ); voi...
  • lvwx369
  • lvwx369
  • 2012年10月31日 13:44
  • 5163

二值图像腐蚀与膨胀操作样例

目录 操作方法简要说明 腐蚀操作 结构元素原点在结构元素内部 原点在结构元素外部 二值图像的膨胀操作 点在结构元素内部 原点在结构元素外部...
  • qq_25847123
  • qq_25847123
  • 2017年06月26日 23:59
  • 4407
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【OpenCV_06】图像滤波器Filtering Images-腐蚀函数cvErode 和 膨胀函数cvDilate
举报原因:
原因补充:

(最多只允许输入30个字)