图像滤波是计算机视觉的重要部分。OpenCV支持很多内置的图像滤波方法。下面是我在后面的文章中将要介绍的过滤方法(OpenCV 2.4.8 C++)

本篇文章中使用C风格的OpenCV2.1解释如下图像滤波方法:

  • 腐蚀
  • 膨胀
  • 反转

下面是要处理的原始图像

OpenCV图像滤波-程序旅途

腐蚀(Eroding)

腐蚀是图像滤波的一种简单形式,下面的代码演示了图像的腐蚀操作

//
//  main.c
//  ImageFiltering
//
//  Created by mingceng on 14-4-2.
//  Copyright (c) 2014年 Bob. All rights reserved.
//

#include <stdio.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>

int main(int argc, const char * argv[])
{

    IplImage *img=cvLoadImage("/Users/mingceng/Pictures/eroding.jpg",CV_LOAD_IMAGE_UNCHANGED);
    cvNamedWindow("MyWindow",CV_WINDOW_AUTOSIZE);
    cvShowImage("MyWindow", img);

    cvErode(img, img, 0, 2);
    cvNamedWindow("Eroded", CV_WINDOW_AUTOSIZE);
    cvShowImage("Eroded", img);

    cvWaitKey(0);

    cvDestroyWindow("MyWindow");
    cvDestroyWindow("Eroded");
    cvReleaseImage(&img);

    return 0;
}

效果:

OpenCV图像滤波-程序旅途
cvErode(img, img, 0, 2)
  • 第1个参数是原始图像
  • 第2个参数是腐蚀之后的目标图像
  • 第3个参数是用于腐蚀的结构元素(structuring element)。如果是0,则使用3×3的矩形结构元素。
  • 第4个参数腐蚀应用的次数。

这个函数可以在原地处理图像,也就是说第1个和第2个参数可以使用相同的变量。

膨胀(Dilating)

膨胀是与腐蚀相反的图像操作。下面是OpenCV代码

//
//  main.c
//  ImageFiltering
//
//  Created by mingceng on 14-4-2.
//  Copyright (c) 2014年 Bob. All rights reserved.
//

#include <stdio.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>

int main(int argc, const char * argv[])
{

    IplImage *img=cvLoadImage("/Users/mingceng/Pictures/eroding.jpg",CV_LOAD_IMAGE_UNCHANGED);
    cvNamedWindow("MyWindow",CV_WINDOW_AUTOSIZE);
    cvShowImage("MyWindow", img);

    cvDilate(img, img, 0, 2);
    cvNamedWindow("Dilated", CV_WINDOW_AUTOSIZE);
    cvShowImage("Dilated", img);

    cvWaitKey(0);

    cvDestroyWindow("MyWindow");
    cvDestroyWindow("Dilated");
    cvReleaseImage(&img);

    return 0;
}

效果:

OpenCV图像滤波-程序旅途
cvDilate(img, img, 0, 2)

cvDilate的参数和cvEroding的参数是一样的。

反转(Inverting)

这里的反转不是图像位置的反转,而是颜色的反转。下面是OpenCV实现的代码:

//
//  main.c
//  ImageFiltering
//
//  Created by mingceng on 14-4-2.
//  Copyright (c) 2014年 Bob. All rights reserved.
//

#include <stdio.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>

int main(int argc, const char * argv[])
{

    IplImage *img=cvLoadImage("/Users/mingceng/Pictures/eroding.jpg",CV_LOAD_IMAGE_UNCHANGED);
    cvNamedWindow("MyWindow",CV_WINDOW_AUTOSIZE);
    cvShowImage("MyWindow", img);

    cvNot(img, img);
    cvNamedWindow("Inverted", CV_WINDOW_AUTOSIZE);
    cvShowImage("Inverted", img);

    cvWaitKey(0);

    cvDestroyWindow("MyWindow");
    cvDestroyWindow("Inverted");
    cvReleaseImage(&img);

    return 0;
}

效果:

OpenCV图像滤波-程序旅途
cvNot(img, img)

这个函数反转第1个参数中的图像的每个元素的每个比特值,并将结果放到第2个参数的图像中。这个函数也可以原地处理图像,也就是说第1个参数和第2个参数可以是相同的变量。

举个例子:

对于8bit的图像,0反转为(255-0)=255,46反转为(255-46)=209

对于16bit的图像,0反转为(65535-0)=65535,46反转为(65535-46)=65489