OpenCV3学习笔记——线性滤波之方框滤波

OpenCV3学习笔记——线性滤波的使用

Whatever is worth doing is worth doing well.
——任何值得做的,就把它做好。

1.为什么需要滤波?

图像滤波是指尽量保存图像细节的情况下对目标图像的噪声进行抑制,它是图像预处理里面不可或缺的一环,处理的好坏将会直接影响后续处理的效果和分析的可靠性
好的,说到这有必要补充一下什么是图像的噪声:
信号或者图像的能量大部分集中在低频和中频段,而在高频段,有用的信息常常会被噪声淹没,因此,为了抑制噪声,改善图像质量,便于更高层次的处理,必须对图像进行去噪预处理。

2. 线性滤波器的使用方法

我们常用的线性滤波有:

  1. 方框滤波
  2. 均值滤波
  3. 高斯滤波

每一种滤波都有自己的优劣,需要大家在实际应用中慢慢体会

线性滤波中,像素的输出值取决于输入像素的加权和
进行滤波就是对于原图像像素矩阵中的每个像素, 计算它周围像素和滤波器矩阵对应位置元素的乘积, 然后把结果相加到一起, 最终得到的值就作为该像素的新值, 这样就完成了一次滤波.
下面是数学公式:
在这里插入图片描述
其中,f (i + k, j + l)是输入像素值,g(i, j)是输出像素值,h(k, l)称为 , 是滤波器的加权系数,
因此,滤波操作是其实就是用一个核去对要处理的图像,下面这张图片形象地描述了滤波过程的操作:

OpenCV3学习笔记——线性滤波之方框滤波_第1张图片
我们可以看到在此图的操作中,核就是下面这个矩阵

    4     0     0
    0     0     0
    0     0    -4

当这个核在原图像上滑动是,第一个位置对应的原图像的像素矩阵为

     0     0     0
     0     1     1
     0     1     2

那么,新图像所得的像素值就是核矩阵与原图像对应位置的像素的加权和
40 + 00 + 00 + 00 + 01 + 01 + 0* 0 + 0*1 + (-4)*2 = -8
通过设计不同的内核处理图片可以得到不同的效果

3.方框滤波的使用 (boxFilter函数)

方框滤波所用到的核是这样的:
OpenCV3学习笔记——线性滤波之方框滤波_第2张图片
方框滤波函数的原型是这样的:

void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )  
  1. 第一个参数:输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
  2. 第二个参数:输出图像,需要和源图片有一样的尺寸和类型。
  3. 第三个参数:int类型的ddepth,输出图像的深度,-1代表使用原图深度,即src.depth()。
  4. 第四个参数:Size类型的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
  5. 第五个参数:Point类型的anchor,表示锚点(即被平滑的那个点),注意它有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心
  6. 第六个参数:bool类型的normalize,默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了

下面我们来看看boxFilter的C++代码

#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;

int main()
{
    Mat scrimage, dstimage;
    scrimage = imread("野花.jpg", 1);   //这里需要将你需要处理的图片放到程序的工程目录下面
    boxFilter(scrimage, dstimage, -1, Size(3, 3), Point(-1, -1));  //调用boxFilter函数,内核大小为3x3
    waitKey(0);
}

下面是效果图(原图,内核大小为3x3,内核大小为5x5)

OpenCV3学习笔记——线性滤波之方框滤波_第3张图片 OpenCV3学习笔记——线性滤波之方框滤波_第4张图片

OpenCV3学习笔记——线性滤波之方框滤波_第5张图片

当然,我们也可以设置一个滑动条,利用回调函数,从而实现方便地调节内核大小
在下一篇博文中,我会把均值滤波和高斯滤波放到一篇文章里面记录

你可能感兴趣的:(Learning,OpenCV3)