一.分类与作用
a>线性滤波:
1.方框滤波:模糊图像
2.均值滤波:模糊图像
3.高斯滤波:信号的平滑处理,去除符合正太分布的噪声
b>非线性滤波
1.中值滤波:去除椒盐噪声
2.双边滤波:保边去噪
二.OpenCv中的函数调用
1.方框滤波:
API:void boxFilter(源图像,目的图像,int 输出图像的深度,Size 邻域算子的大小,Point 锚点,bool 归一化标志,int 边界模式)
说明:1.源图像可以是彩色图或者是灰度图,因为图像处理的时候,通道是分开来处理的
2.目的图像的大小和通道数必须和源图像相同,另外,目的图像的深度由后一个参 数决定
3.输出图像的深度,指定CV_8U....,当为-1的时候,目标图像的深度和源图像的深度相同
4.锚点,指被平滑的那个点位于领域算子矩阵的哪一个位置,从而确定计算时候的像素点的取值,如果是Point(-1,-1),那么自动取值中间的那个点.
5.归一化标志,默认归一化为真,会将目标图像归一化到源图像的取值范围
关于第三个参数图像的深度:有这几种格式:
当需要在不同深度的图像之间转换时,也可以用cvScale()这个函数。这个时候的转换,中间有个截断处理过程。比如IPL_DEPTH_64F到IPL_DEPTH_8U,就会把300转换到255。下面转一段别人总结的深度显示范围。
测试double型:0.0–1.0之间 IPL_DEPTH_64F
测试float型:0.0–1.0之间 IPL_DEPTH_32F
测试long型:0–65535之间 IPL_DEPTH_32S
测试short int型:-32768–32767之间 IPL_DEPTH_16S
测试unsigned short int型:0–65535之间 IPL_DEPTH_16U
测试char型:-128–127之间 IPL_DEPTH_8S
测试unsigned char型:0–255之间 IPL_DEPTH_8U
这个时候如果需要保存图像,请记住要先转换到IPL_DEPTH_8U的深度。
例:boxFilter(srcImage, box_Image, -1, Size(3, 3), Point(-1, -1), false,BORDER_DEFAULT);
2.均值滤波
API:void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )
说明:
第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
第三个参数,Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
第四个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
第五个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。
例:blur(srcImage, blur_Image, Size(3, 3), Point(-1, -1), BORDER_DEFAULT);
3.高斯滤波
API:void GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT);
API:void medianBlur(InputArray src, OutputArray dst, int ksize)
说明:
第一个参数,InputArray类型的src,函数的输入参数,填1、3或者4通道的Mat类型的图像;当ksize为3或者5的时候,图像深度需为CV_8U,CV_16U,或CV_32F其中之一,而对于较大孔径尺寸的图片,它只能是CV_8U。
第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。我们可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
第三个参数,int类型的ksize,孔径的线性尺寸(aperture linear size),注意这个参数必须是大于1的奇数,比如:3,5,7,9 ...
例:medianBlur(srcImage, median_Image, 7);
5.双边滤波
API:void bilateralFilter(InputArray src, OutputArray dst, int d,double sigmaColor,double sigmaSpace,int borderType=BORDER_DEFAULT )
说明:
. InputArray src: 输入图像,可以是Mat类型,图像必须是8位或浮点型单通道、三通道的图像。
. OutputArray dst: 输出图像,和原图像有相同的尺寸和类型。
. int d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
. double sigmaColor: 颜色空间过滤器的sigma值,这个参数的值月大,表明该像素邻域内有月宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
. double sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着颜色相近的较远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace五官,否则d正比于sigmaSpace.
. int borderType=BORDER_DEFAULT: 用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT.
例:bilateralFilter(srcImage, bilateral_Image, 25, 25 * 2, 25 / 2,BORDER_DEFAULT);
三.程序源码
#include
using namespace cv;
using namespace std;
#define WINDOWS_NAME1 "【原图】"
#define WINDOWS_NAME2 "【方框滤波】"
#define WINDOWS_NAME3 "【均值滤波】"
#define WINDOWS_NAME4 "【高斯滤波】"
#define WINDOWS_NAME5 "【中值滤波】"
#define WINDOWS_NAME6 "【双边滤波】"
int main()
{
system("color 5E");//把dos框背景颜色改变,只是看看效果, 默认dos框背景为黑色。
Mat srcImage = imread("qw.jpg");//读入原图
if (!srcImage.data)
{
cout << "读取srcImage错误~!" << endl;//用到了输入输出 流,头文件要加“using namespace std; ”
return false
;
}
//创建5个Mat矩阵用来存放滤波数据,利用clone函数使其大小和原图大小相同
Mat box_Image = srcImage.clone();
Mat blur_Image = srcImage.clone();
Mat gaussian_Image = srcImage.clone();
Mat median_Image = srcImage.clone();
Mat bilateral_Image = srcImage.clone();
//=================显示原图===================
namedWindow(WINDOWS_NAME1, 1); imshow(WINDOWS_NAME1, srcImage);
//=================方框滤波===================
namedWindow(WINDOWS_NAME2, 1);
boxFilter(srcImage, box_Image, -1, Size(3, 3), Point(-1, -1), false,BORDER_DEFAULT);
imshow(WINDOWS_NAME2, box_Image);
//=================均值滤波===================
namedWindow(WINDOWS_NAME3, 1);
blur(srcImage, blur_Image, Size(3, 3), Point(-1, -1), BORDER_DEFAULT);
imshow(WINDOWS_NAME3, blur_Image);
//=================高斯滤波===================
namedWindow(WINDOWS_NAME4, 1);
GaussianBlur(srcImage, gaussian_Image, Size(3, 3), 0, 0,BORDER_DEFAULT);
imshow(WINDOWS_NAME4, gaussian_Image);
//=================中值滤波===================
namedWindow(WINDOWS_NAME5, 1);
medianBlur(srcImage, median_Image, 7);
imshow(WINDOWS_NAME5, median_Image);
//=================双边滤波===================
namedWindow(WINDOWS_NAME6, 1);
bilateralFilter(srcImage, bilateral_Image, 25, 25 * 2, 25 / 2,BORDER_DEFAULT);
imshow(WINDOWS_NAME6, bilateral_Image);
cvWaitKey(0);
return 0;
}
五.运行效果图