图像滤波是计算机视觉的重要部分。OpenCV支持很多内置的图像滤波方法。下面是我在后面的文章中将要介绍的过滤方法(OpenCV 2.4.8 C++)
- 改变图像或视频的亮度
- 改变图像或视频的对比度
- 灰色或彩色图像的直方图均衡化
- 平滑/模糊图像
本篇文章中使用C风格的OpenCV2.1解释如下图像滤波方法:
- 腐蚀
- 膨胀
- 反转
下面是要处理的原始图像
腐蚀(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; }
效果:
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; }
效果:
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; }
效果:
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