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

来源:互联网 发布:vps怎么传数据 编辑:程序博客网 时间:2024/04/29 15:10
图像滤波在计算机视觉中占很大比重,是大部分计算机视觉应用的基础。对图像滤波应该在应用之前完成。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多次,图像的噪音消除,物体内细小物质也被填充。


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



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

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





      0 0