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


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

高斯噪声是一种常见的噪声,图像采集的众多过程中都容易引入高斯噪声,因此针对高斯噪声的高斯滤波也广泛应用于图像去噪领域。高斯滤波器考虑了像素离滤波器中心距离的影响,以滤波器中心位置为高斯分布的均值,根据高斯分布公式和每个像素离中心位置的距离计算出滤波器内每个位置的数值,从而形成一个形如图5-15所示的高斯滤波器。之后将高斯滤波器与图像之间进行滤波操作,进而实现对图像的高斯滤波。

图5-15 高斯滤波器空间构型

OpenCV 4提供了对图像进行高斯滤波操作的GaussianBlur()函数,该函数的函数原型在代码清单5-13中给出。

代码清单5-13 GaussianBlur()函数原型
1.  void cv::GaussianBlur(InputArray  src,
2.                             OutputArray  dst,
3.                             Size  ksize,
4.                             double  sigmaX,
5.                             double  sigmaY = 0,
6.                             int  borderType = BORDER_DEFAULT
7.                             )
  • src:待高斯滤波图像,图像可以具有任意的通道数目,但是数据类型必须为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。
  • dst:输出图像,与输入图像src具有相同的尺寸、通道数和数据类型。
  • ksize:高斯滤波器的尺寸,滤波器可以不为正方形,但是必须是正奇数。如果尺寸为0,则由标准偏差计算尺寸。
  • sigmaX:X方向的高斯滤波器标准偏差。
  • sigmaY:Y方向的高斯滤波器标准偏差; 如果输入量为0,则将其设置为等于sigmaX,如果两个轴的标准差均为0,则根据输入的高斯滤波器尺寸计算标准偏差。
  • borderType:像素外推法选择标志,取值范围在表3-5中给出,默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。

该函数能够根据输入参数自动生成高斯滤波器,实现对图像的高斯滤波,函数的前两个参数与前面介绍的滤波函数的参数含义相同。该函数第三个参数是高斯滤波器的尺寸,与前面函数不同的是,该函数除了必须是正奇数以外,还允许输入尺寸为0,当输入的尺寸为0时,会根据输入的标准偏差计算滤波器的尺寸。函数第四个和第五个参数为X方向和Y方向的标准偏差,当Y方向参数为0时表示Y方向的标准偏差与X方向相同,当两个参数都为0时,则根据输入的滤波器尺寸计算两个方向的标准偏差数值。但是为了能够使计算结果符合自己的预期,建议将第三个参数、第四个参数和第五个参数都明确的给出。

高斯滤波器的尺寸和标准偏差存在着一定的互相转换关系,OpenCV 4提供了输入滤波器单一方向尺寸和标准偏差生成单一方向高斯滤波器的getGaussianKernel()函数,在函数的定义中给出了滤波器尺寸和标准偏差存在的关系,这个关系不是数学中存在的关系,而是OpenCV 4为了方便而自己设定的关系。在了解这个关系之前,我们首先了解以下getGaussianKernel()函数,该函数的函数原型在代码清单5-14中给出。

代码清单5-14 getGaussianKernel()函数原型
9.  Mat cv::getGaussianKernel(int  ksize,
10.                                double  sigma,
11.                                int  ktype = CV_64F
12.                                )
  • ksize:高斯滤波器的尺寸。
  • sigma:高斯滤波的标测差。
  • ktype:滤波器系数的数据类型,可以是CV_32F或者CV_64F,默认数据类型为CV_64F。

该函数用于生成指定尺寸的高斯滤波器,需要注意的是该函数生成的是一个ksize×1的Mat类矩阵。函数第一个参数是高斯滤波器的尺寸,这个参数必须是一个正奇数。第二个参数表示高斯滤波的标准差,这个参数如果是一个负数,则调用程序中默认的高斯滤波器尺寸与标准差的公式,其计算公式如式(5.4)所示。
sigma=0.3∗((ksize−1)∗0.5−1+0.8)(5.4){\rm{sigma}} = 0.3*(({\rm{ksize}} - 1)*0.5 - 1 + 0.8)\tag{5.4}sigma=0.3∗((ksize−1)∗0.5−1+0.8)(5.4)

生成一个二维的高斯滤波器需要调用两次getGaussianKernel()函数,将X方向的一维高斯滤波器和Y方向的一维高斯滤波器相乘,得到最终的二维高斯滤波器。例如计算的X方向的一维滤波器和Y方向的一维滤波器均如式(5.5)所示。
Gauss=[0.27410.45190.2741](5.5){\rm{Gauss}} = {\begin{bmatrix} {0.2741}&{0.4519}&{0.2741} \end{bmatrix}} \tag{5.5}Gauss=[0.2741​0.4519​0.2741​](5.5)

最终二维高斯滤波器计算过程和结果如式(5.6)所示。
Gauss2D=[0.27410.45190.2741][0.27410.45190.2741]=[0.075110.12380.075110.12380.20420.12380.075110.12380.07511](5.6){\rm{Gauss2D}} = {\begin{bmatrix} {0.2741}&{0.4519}&{0.2741} \end{bmatrix}} {\begin{bmatrix} {0.2741}\\ {0.4519}\\ {0.2741} \end{bmatrix}} = {\begin{bmatrix} {0.07511}&{0.1238}&{0.07511}\\ {0.1238}&{0.2042}&{0.1238}\\ {0.07511}&{0.1238}&{0.07511} \end{bmatrix}} \tag{5.6}Gauss2D=[0.2741​0.4519​0.2741​]⎣⎡​0.27410.45190.2741​⎦⎤​=⎣⎡​0.075110.12380.07511​0.12380.20420.1238​0.075110.12380.07511​⎦⎤​(5.6)

为了了解高斯滤波对不同噪声的去除效果,在代码清单5-15中利用高斯滤波分别处理不含有噪声的图像、含有椒盐噪声的图像和含有高斯噪声的图像,处理结果在图5-16、图5-17、图5-18中给出。通过结果可以发现,高斯滤波对高斯噪声去除效果较好,但是同样会对图像造成模糊,并且滤波器的尺寸越大,滤波后图像变得越模糊。

代码清单5-15 myGaussianBlur.cpp图像高斯滤波
13. #include <opencv2\opencv.hpp>
14. #include <iostream>
15.
16. using namespace cv;
17. using namespace std;
18.
19. int main()
20. {21.     Mat equalLena = imread("equalLena.png", IMREAD_ANYDEPTH);
22.     Mat equalLena_gauss = imread("equalLena_gauss.png", IMREAD_ANYDEPTH);
23.     Mat equalLena_salt = imread("equalLena_salt.png", IMREAD_ANYDEPTH);
24.     if (equalLena.empty()||equalLena_gauss.empty()||equalLena_salt.empty())
25.     {26.         cout << "请确认图像文件名称是否正确" << endl;
27.         return -1;
28.     }
29.     Mat result_5, result_9;  //存放不含噪声滤波结果,后面数字代表滤波器尺寸
30.     Mat result_5gauss, result_9gauss;  //存放含有高斯噪声滤波结果,后面数字代表滤波器尺寸
31.     Mat result_5salt, result_9salt;  存放含有椒盐噪声滤波结果,后面数字代表滤波器尺寸
32.     //调用均值滤波函数blur()进行滤波
33.     GaussianBlur(equalLena, result_5, Size(5, 5), 10, 20);
34.     GaussianBlur(equalLena, result_9, Size(9, 9), 10, 20);
35.     GaussianBlur(equalLena_gauss, result_5gauss, Size(5, 5), 10, 20);
36.     GaussianBlur(equalLena_gauss, result_9gauss, Size(9, 9), 10, 20);
37.     GaussianBlur(equalLena_salt, result_5salt, Size(5, 5), 10, 20);
38.     GaussianBlur(equalLena_salt, result_9salt, Size(9, 9), 10, 20);
39.     //显示不含噪声图像
40.     imshow("equalLena ", equalLena);
41.     imshow("result_5", result_5);
42.     imshow("result_9", result_9);
43.     //显示含有高斯噪声图像
44.     imshow("equalLena_gauss", equalLena_gauss);
45.     imshow("result_5gauss", result_5gauss);
46.     imshow("result_9gauss", result_9gauss);
47.     //显示含有椒盐噪声图像
48.     imshow("equalLena_salt", equalLena_salt);
49.     imshow("result_5salt", result_5salt);
50.     imshow("result_9salt", result_9salt);
51.     waitKey(0);
52.     return 0;
53. }

图5-16 myGaussianBlur.cpp程序中不含噪声图像高斯滤波结果 图5-17 myGaussianBlur.cpp程序中含椒盐噪声图像高斯滤波结果 图5-18 myGaussianBlur.cpp程序中含高斯噪声图像高斯滤波结果

OpenCV 4开发详解
往期推荐
【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”。

【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. oracle有一百个人围一圈报数,案例:Oracle创建表时报session超过最大值 ORA-00018 证明递归ses...
  2. 巧用Eclipse Java编辑器调试
  3. JZOJ 1277. 最高的奶牛
  4. windbg分析dmp蓝屏文件_手把手教你分析漏洞 : CVE-2018-8120
  5. CString Management (关于CString的所有操作)
  6. python运行input不出结果_Python中print和input调用了Python中底层的什么方法
  7. 量化策略回测DCCV2
  8. Anbox之android OpenGLES模拟器设计(八)
  9. 雷达的工作原理示意图_平板吊袋离心机工作原理及结构示意图
  10. Oracle备份还原实践
  11. java实现爬虫_手把手教你从零开始用Java写爬虫
  12. 走出国门,在安防赛道海外本地化部署已成必然
  13. 17岁少年攻击航司系统获刑,网络攻击猖獗如何破?
  14. 22牛客多校day1 J - Serval and Essay 启发式合并
  15. pyecharts制作地图显示的数据总是经纬度
  16. azkaban任务状态一直在Preparing状态不能更新的解决办法
  17. python绘制五子棋棋盘_4.Python画一个五子棋棋盘
  18. 1学习react 第一章创建react项目
  19. ofo抵押单车获17.7亿元融资;董明珠回应与雷军赌局;亚马逊Alexa全球性“罢工”丨价值早报
  20. 基于谷歌油猴脚本观看视频

热门文章

  1. 出身清华,大神朱俊彦再出GauGAN:AI让你变身神笔马良
  2. 访问量最高超7百万的Stack Overflow问题竟然是...
  3. 25,000,000行的代码就问你敢不敢动?!
  4. 亏本也要抢市场!谷歌亚马逊一路死磕到CES,争夺语音入口之路,谁都不是吃素的
  5. AI一分钟 | 妈呀!连地铁都开始无人驾驶了,飞机还远吗;北京无人驾驶新规出台,终于知道李彦宏该不该被罚了(12月19日)
  6. 天哪,路由器都能跑Docker了!
  7. 还在用Spring Security?推荐你一款使用简单、功能强大的权限认证框架
  8. 超详细解析 | 一致性协议算法-2PC、3PC、Paxos、Raft、ZAB、NWR
  9. 拥抱并行流,提高程序执行速度
  10. 为什么 SQL 语句不要过多的 join?