OpenCv基本滤波算法小结

一.分类与作用

a>线性滤波:

1.方框滤波:模糊图像

2.均值滤波:模糊图像

3.高斯滤波:信号的平滑处理,去除符合正太分布的噪声

b>非线性滤波

1.中值滤波:去除椒盐噪声

2.双边滤波:保边去噪

二.OpenCv中的函数调用

1.方框滤波:

API:void boxFilter(源图像,目的图像,int 输出图像的深度,Size 邻域算子的大小,Point 锚点,bool 归一化标志,int 边界模式)

扫描二维码关注公众号,回复: 161840 查看本文章

说明: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);

参数详解如下:
    src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
    dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
    ksize,高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数(并不能理解)。或者,它们可以是零的,它们都是由sigma计算而来。
    sigmaX,表示高斯核函数在X方向的的标准偏差。
    sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
    为了结果的正确性着想,最好是把第三个参数Size,第四个参数sigmaX和第五个参数sigmaY全部指定到。
    borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。
例:GaussianBlur(srcImage, gaussian_Image, Size(3, 3), 0, 0,BORDER_DEFAULT);  
4.中值滤波

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<opencv2/opencv.hpp>
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;
}

五.运行效果图




猜你喜欢

转载自blog.csdn.net/fzhykx/article/details/79546549