【拜小白opencv】28-平滑处理1线性滤波之——盒式滤波(方框滤波)

来源:互联网 发布:自适应pid控制算法 编辑:程序博客网 时间:2024/04/29 10:47

常言道“温故而知新”,写此文章就是对自己目前学习内容的小小的总结与记录。

本文力求用最简洁的语言,详细的代码将此部分内容讲解清楚,但由于博主同样是刚刚接触OpenCV,或许表达上有些瑕疵,还望读者能够指教探讨,大家共同进步。

博主机器配置为:VS2013+opencv2.4.13+Win-64bit。

若本文能给读者带来一点点启示与帮助,我就很开心了。

===========================分割线========================


1-盒式滤波(方框滤波)

  • 盒式滤波(方框滤波)是一种线性滤波技术,它的实现借鉴了积分图像的原理思想,在快速积分图像求解中,将计算某个矩阵像素间的和值运算,转化为求矩阵对应边角点的求和差值运算。
  • 盒式滤波的实现最关键的步骤就是初始化数组S,数组S的每个值是存放像素邻域内的像素和值,在求解某矩形块中的像素和时,只需要索引对应区域的位置存放的和值就可以完成计算。


原理:

先给出内核,用内核各点的值与对应的图像像素值相乘:



可以才看出通过盒式滤波后,图片的边缘信息会丢失。

=======================分割线=========================

2-boxFilter()函数——盒式滤波

OpenCV将盒式滤波封装在boxFilter()函数中,作用是输入一副图像对其进行盒式滤波。感兴趣的同学可以看看其源代码。下面来看下boxFilter()函数的定义:
void boxFilter( InputArray src, OutputArray dst, int ddepth,                             Size ksize, Point anchor=Point(-1,-1),                             bool normalize=true,                             int borderType=BORDER_DEFAULT );

参数说明
  • 参数1:输入要处理的图像。
  • 参数2:得到处理后的的输出图像。
  • 参数3:图像的深度。-1代表使用原图深度,即src.depth()。
  • 参数4:内核的大小。一般用Size(w,h)来表示内核大小,其中w为像素宽度,h为像素高度,正奇数或0。例:Size(3,3)就代表3×3的核大小。
  • 参数5:表示锚点,即被平滑的那个点。如果这个点坐标是负值的话,就表示取核的中心点为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
  • 参数6:默认值为true,一个标识符,表示内核是否被其区域归一化了,具体见下面介绍。
  • 参数7:用于推断图像外部像素的某种边界模式,有默认值BORDER_DEFAULT,我们一般不用管它。

boxFilter()函数盒式滤波所用的核表示如下:


对参数6具体解释:
  • 当normalize = true 时,盒式滤波就变成了均值滤波。也就是说,均值滤波是盒式滤波归一化(normalized)后的特殊情况。其中,归一化就是把要处理的量都缩放到一个范围内,比如(0,1),以便统一处理和直观量化。
  • 当normalize = false时,为非归一化的盒式滤波,用于计算每个像素邻域内的积分特性,比如密集光流算法(dense optical flow algorithms)中用到的图像倒数的协方差矩阵(covariance matrices of image derivatives)。

=========================分割线====================

3-代码演示

/*盒式滤波(方框滤波)*/#include <opencv2/core/core.hpp>                #include <opencv2/highgui/highgui.hpp>    #include <opencv2/imgproc/imgproc.hpp>#include <iostream>   using namespace std;using namespace cv;int main(){//------------【1】读取源图像并检查图像是否读取成功------------   Mat srcImage = imread("D:\\OutPutResult\\ImageTest\\boat1.jpg");if (!srcImage.data){cout << "读取图片错误,请重新输入正确路径!\n";system("pause");return -1;}imshow("【源图像】", srcImage);//------------【2】对图像进行盒式滤波(方框滤波)处理------------   Mat dstImage;boxFilter(srcImage, dstImage, -1, Size(5, 5), Point(-1, -1), false); //false为非归一化情况imshow("【盒式滤波/方框滤波】", dstImage);waitKey(0);}

=======================分割线=====================

4-显示结果

非归一化情况如下


归一化情况如下


=======================分割线================

5-程序说明

可以发现,非归一化的时候,得到图像就是一片白色,对源图像毁坏太大,根本无法使用。

而归一化的时候,得到图像是一种模糊的效果,此时与均值滤波一样。

下一节我们将了解均值滤波的时候方法。


=====================END==============

阅读全文
0 0