本文首发于“小白学视觉”微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!


经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

方框滤波是均值滤波的一般形式,在均值滤波中,将滤波器中所有的像素值求和后的平均值作为滤波后结果,方框滤波也是求滤波器内所有像素值的之和,但是方框滤波可以选择不进行归一化,就是将所有像素值的和作为滤波结果,而不是所有像素值的平均值。

OpenCV 4中提供了boxFilter()函数实现方框滤波,该函数的函数原型在代码清单5-10中给出。

代码清单5-10 boxFilter()函数原型
1.  void cv::boxFilter(InputArray  src,
2.                         OutputArray  dst,
3.                         int  ddepth,
4.                         Size  ksize,
5.                         Point  anchor = Point(-1,-1),
6.                         bool  normalize = true,
7.                         int  borderType = BORDER_DEFAULT
8.                         )
  • src:输入图像。
  • dst:输出图像,与输入图像具有相同的尺寸和通道数。
  • ddepth:输出图像的数据类型(深度),根据输入图像的数据类型不同拥有不同的取值范围,具体的取值范围在表5-1给出,当赋值为-1时,输出图像的数据类型自动选择。
  • ksize:卷积核尺寸。
  • anchor:内核的基准点(锚点),其默认值为(-1,-1)代表内核基准点位于kernel的中心位置。基准点即卷积核中与进行处理的像素点重合的点,其位置必须在卷积核的内部。
  • normalize:是否将卷积核进行归一化的标志,默认参数为true,表示进行归一化。
  • borderType:像素外推法选择标志,取值范围在表3-5中给出,默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。

该函数的使用方式与均值滤波函数blur()几乎一样,但是该函数可以选择输出图像的数据类型,除此之外,该函数的第六个参数表示是否对滤波器内所有的数值进行归一化操作,参数默认状态下需要对滤波器内所有的数值进行归一化。此时,在不考虑数据类型的情况下,框滤波函数boxFilter()和均值滤波函数blur()会具有相同的滤波结果。

除了对滤波器内每个像素值直接求和外,OpenCV 4还提供了sqrBoxFilter()函数实现对滤波器内每个像数值的平方求和,之后根据输入参数选择是否进行归一化操作,该函数的函数原型在代码清单5-11中给出。

代码清单5-11 sqrBoxFilter()函数原型
1.  void cv::sqrBoxFilter(InputArray  src,
2.                            OutputArray  dst,
3.                            int  ddepth,
4.                            Size  ksize,
5.                            Point  anchor = Point(-1, -1),
6.                            bool  normalize = true,
7.                            int  borderType = BORDER_DEFAULT
8.                            )

该函数是在boxFilter()函数功能基础上进行扩展功能,因此两者具有相同的输入参数需求,这里对函数的参数不再进行逐一解释。CV_8U数据类型的图像像素值从0到255,计算平方后数据会变得更大,即使归一化操作也不能保证像素值不会超过最大值,但是CV_32F数据类型的图像像素值是从0到1之间的小数,在0到1之间的数计算平方会变得更小,但是始终保持在0到1之间。因此该函数在处理图像滤波的任务时主要针对的是CV_32数据类型的图像,而且根据计算关系可知,在归一化后图像在变模糊的同时亮度也会变暗。

为了更加了解方框滤波的计算原理,清楚归一化操作和未归一化操作对滤波结果的影响,在代码清单5-12中给出了分别利用方框滤波处理矩阵数据和图像的示例程序。程序中我们创建了一个Mat类型的数据,之后用sqrBoxFilter()函数进行方框滤波,并在图5-13给出归一化后和未归一化后的结果,同时使用boxFilter()函数和sqrBoxFilter()对图像进行方框滤波操作,处理结果如图5-12中所示。

代码清单5-12 myBoxFilter.cpp图像方框滤波
1.  #include <opencv2\opencv.hpp>
2.  #include <iostream>
3.
4.  using namespace cv;
5.  using namespace std;
6.
7.  int main()
8.  {9.      Mat equalLena = imread("equalLena.png", IMREAD_ANYDEPTH);  //用于方框滤波的图像
10.     if (equalLena.empty())
11.     {12.         cout << "请确认图像文件名称是否正确" << endl;
13.         return -1;
14.     }
15.     //验证方框滤波算法的数据矩阵
16.     float points[25] = { 1,2,3,4,5,
17.         6,7,8,9,10,
18.         11,12,13,14,15,
19.         16,17,18,19,20,
20.         21,22,23,24,25 };
21.     Mat data(5, 5, CV_32FC1, points);
22.     //将CV_8U类型转换成CV_32F类型
23.     Mat equalLena_32F;
24.     equalLena.convertTo(equalLena_32F, CV_32F, 1.0 / 255);
25.     Mat resultNorm, result, dataSqrNorm, dataSqr, equalLena_32FSqr;
26.     //方框滤波boxFilter()和sqrBoxFilter()
27.     boxFilter(equalLena, resultNorm, -1, Size(3,3), Point(-1, -1), true);  //进行归一化
28.     boxFilter(equalLena, result, -1, Size(3, 3), Point(-1, -1), false);  //不进行归一化
29.     sqrBoxFilter(data, dataSqrNorm, -1, Size(3, 3), Point(-1, -1),
30.         true, BORDER_CONSTANT);  //进行归一化
31.     sqrBoxFilter(data, dataSqr, -1, Size(3, 3), Point(-1, -1),
32.         false, BORDER_CONSTANT);  //不进行归一化
33.     sqrBoxFilter(equalLena_32F, equalLena_32FSqr, -1, Size(3, 3), Point(-1, -1),
34.         true, BORDER_CONSTANT);
35.     //显示处理结果
36.     imshow("resultNorm", resultNorm);
37.     imshow("result", result);
38.     imshow("equalLena_32FSqr", equalLena_32FSqr);
39.     waitKey(0);
40.     return 0;
41. }

图5-13 myBoxFilter.cpp程序中矩阵数据方框滤波结果 图5-14 myBoxFilter.cpp程序中图像方框滤波结果

OpenCV 4开发详解
往期推荐
【OpenCV 4开发详解】4种读取Mat类元素的的方法
【OpenCV 4开发详解】图像的读取与显示
【OpenCV 4开发详解】视频加载与摄像头调用
【OpenCV 4开发详解】图像与视频的保存
【OpenCV 4开发详解】保存和读取XML和YMAL文件
【OpenCV 4开发详解】颜色模型与转换
【OpenCV 4开发详解】多通道分离与合并
【OpenCV 4开发详解】图像像素统计
【OpenCV 4开发详解】两图像间的像素操作
【OpenCV 4开发详解】图像二值化
【OpenCV 4开发详解】图像LUT查找表
【OpenCV 4开发详解】图像连接
【OpenCV 4开发详解】图像仿射变换
【OpenCV 4开发详解】图像透视变换
【OpenCV 4开发详解】图像极坐标变换
【OpenCV 4开发详解】图像上绘制几何图形
【OpenCV 4开发详解】图像金字塔
【OpenCV 4开发详解】窗口交互操作
【OpenCV 4开发详解】图像直方图绘制
【OpenCV 4开发详解】直方图操作
【OpenCV 4开发详解】直方图应用
【OpenCV 4开发详解】图像模板匹配
【OpenCV 4开发详解】图像卷积
【OpenCV 4开发详解】图像噪声的种类与生成
【OpenCV 4开发详解】均值滤波
经过几个月的努力,市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》将春节后由人民邮电出版社发行。如果小伙伴觉得内容有帮助,希望到时候多多支持!
关注小白的小伙伴可以提前看到书中的内容,我们创建了学习交流群,欢迎各位小伙伴添加小白微信加入交流群,添加小白时请备注“学习OpenCV 4”。

【OpenCV 4开发详解】方框滤波相关推荐

  1. 【OpenCV 4开发详解】中值滤波

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  2. 【OpenCV 4开发详解】可分离滤波

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  3. 【OpenCV 4开发详解】高斯滤波

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  4. 【OpenCV 4开发详解】均值滤波

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  5. 【OpenCV 4开发详解】分割图像——分水岭法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  6. 【OpenCV 4开发详解】深度神经网络应用实例

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  7. 【OpenCV 4开发详解】图像修复

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  8. 【OpenCV 4开发详解】分割图像——Mean-Shift分割算法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  9. 【OpenCV 4开发详解】分割图像——Grabcut图像分割

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

最新文章

  1. [luoguP2618] 数字工程(DP)
  2. React Nativi 参考文章
  3. 美容院会籍管理,看着简单,其实很复杂
  4. 【福利】微信小程序130个精选Demo合集
  5. 如何解决头文件重复包含和宏的重复定义问题:用#ifndef 、#define、#endif
  6. 转载:MFC 获得各类指针、句柄的方法
  7. ad20如何画出pcb板大小_多层pcb板是如何抄板的?
  8. php查询mysql返回大量数据结果集导致内存溢出的解决方法
  9. getelementsbyname谷歌浏览器兼容_常用的浏览器内核有哪些?常用浏览器及其内核介绍...
  10. 目前项目wordpress插件记录
  11. php 查看session 时间,php中session过期时间设置及session回收机制介绍
  12. CS231n——机器学习算法——线性分类(上: 线性分类器)
  13. 创建Allegro差分对
  14. SCAR:Scalable Consensus Algorithm 一种可伸缩共识算法
  15. 用计算机信息术语感恩老师,赞美老师锦旗用语大全 感恩老师的句子
  16. 使用python绘制图形入门教程
  17. DataWhale天池-金融风控贷款违约预测-Task01赛题理解
  18. TypeScript 2
  19. 设计模式学习系列6 原型模式(prototype)
  20. zzd 的割草机(Lawnmower)

热门文章

  1. 华南理工大学院长涉嫌篡改8名研究生成绩,4人已停职
  2. 火爆GitHub的《机器学习100天》,有人把它翻译成了中文版
  3. 国行版HomePod售价2799元,本周五发售
  4. 印度小哥“神剑”:PDF提取表格so easy!
  5. 从Storm到Flink:大数据处理的开源系统及编程模型(文末福利)
  6. AI入侵机械设计,苦逼的“机械狗”还有未来吗?
  7. 基于 Redis 实现分布式锁思考
  8. 超级全面的 SpringBoot 注解介绍,每一个用途都应该清晰
  9. 使用IntelliJ IDEA查看类图,内容极度舒适
  10. Spring Boot 最流行的 16 条实践解读,值得收藏!