【图像处理】【计算机视觉】线性邻域滤波专场:方框滤波、均值滤波与高斯滤波...
首先注意点:关于OpenCV中的函数,有老的数据结构,还有新的opencv2的数据结构,一般地区别就是IplImage*与Mat的区别,两者大致分别对应着C和C++内的两个功能一样,但是函数名称有别。所以,在使用中最好的办法就是尽量查看OpenCV的手册,因为它对应的C++,C和Python版本等都写了出来,非常好的工具不能忘了。
下面是使一些比较热门的图像滤波操作,对应的是基于C++的Mat数据类型(参考:http://blog.csdn.net/pi9nc/article/details/22977297):
本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作。图像滤波系列文章浅墨准备花两次更新的时间来讲,此为上篇,为大家剖析了“方框滤波“,”均值滤波“和”高斯滤波“三种常见线性邻域滤波操作。而作为非线性滤波的“中值滤波”和“双边滤波”,留待我们下次剖析。
先上一张精彩截图:
浅墨其实很希望把这篇文章写得精简和简明扼要,发现越深入写进去,需要讲的周边内容越多,于是文章越写越长,最后在word中字数统计突破了一万。。。。。。。
因为文章很长,如果详细啃的话,或许会消化不良。在这里给大家一个指引,如果是单单想要掌握这篇文章中讲解的OpenCV线性滤波相关的三个函数:boxFilter,blur和GaussianBlur的使用方法的话,直接看第三部分“浅出”和第四部分“实例”就行。
在以后写的OpenCV系列文章中,浅墨暂且准备将每篇博文中知识点都分成原理、深入、浅出和实例四大部分来讲解,
第一部分为和图像处理中线性滤波相关的理论,第二部分“深入”部分主要深入OpenCV内部,带领大家领略OpenCV的开源魅力,进行OpenCV相关源码的剖析,做到对OpenCV理解深刻,做一个高端大气的OpenCV使用者。 第三部分“浅出”主要教会大家如何快速上手当前文章中介绍的相关OpenCV API函数。而在第四部分,浅墨会为大家准备一个和本篇文章相关的详细注释的综合实例程序。
这样的话呢,文章既不失深度,也不失快速入门的良方。希望浅墨按这样的新思路写出来的文章,无论是新手还是高手,看了都能有所收获。
给出本篇万字文章的结构脉络:
一、理论——相关图像处理概念介绍
二、深入——OpenCV源码讲解
三、浅出——API函数讲解
四、实例——详细注释的博文配套程序
OK,我们开始吧。
一、理论与概念讲解
<1>关于平滑处理
<2>图像滤波与滤波器
- 方框滤波——boxblur函数
- 均值滤波(邻域平均滤波)——blur函数
- 高斯滤波——GaussianBlur函数
- 中值滤波——medianBlur函数
- 双边滤波——bilateralFilter函数
今天我们要讲解的是作为线性滤波的方框滤波,均值滤波和高斯滤波。两种非线性滤波操作——中值滤波和双边滤波,我们留待下次讲解。
<3>对线性滤波器的简介
线性滤波器:线性滤波器经常用于剔除输入信号中不想要的频率或者从许多频率中选择一个想要的频率。
- 允许低频率通过的低通滤波器。
- 允许高频率通过的高通滤波器。
- 允许一定范围频率通过的带通滤波器。
- 阻止一定范围频率通过并且允许其它频率通过的带阻滤波器。
- 允许所有频率通过、仅仅改变相位关系的全通滤波器。
- 阻止一个狭窄频率范围通过的特殊带阻滤波器,陷波滤波器(Band-stop filter)。
<4>关于滤波和模糊
关于滤波和模糊,大家往往在初次接触的时候会弄混淆,“一会儿说滤波,一会儿又说模糊,什么玩意儿啊”。
我们上文已经提到过,滤波是将信号中特定波段频率滤除的操作,是抑制和防止干扰的一项重要措施。
<5>邻域算子与线性邻域滤波
邻域算子(局部算子)是利用给定像素周围的像素值的决定此像素的最终输出值的一种算子。而线性邻域滤波是一种常用的邻域算子,像素的输出值取决于输入像素的加权和,具体过程如下图。
图注:邻域滤波(卷积):左边图像与中间图像的卷积产生右边图像。目标图像中蓝色标记的像素是利用原图像中红色标记的像素计算得到的。
其中的加权和为 ,我们称其为“核”,滤波器的加权系数,即滤波器的“滤波系数”。
方框滤波——boxblur函数
均值滤波——blur函数
高斯滤波——GaussianBlur函数
下面我们来对他们进行一一介绍。
<6>方框滤波(box Filter)
方框滤波(box Filter)被封装在一个名为boxblur的函数中,即boxblur函数的作用是使用方框滤波器(box filter)来模糊一张图片,从src输入,从dst输出。
参数详解:
- 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
- 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
- 第三个参数,int类型的ddepth,输出图像的深度,-1代表使用原图深度,即src.depth()。
- 第四个参数,Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
- 第五个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
- 第六个参数,bool类型的normalize,默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了。
- 第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。
boxFilter()函数方框滤波所用的核为:
其中:
其中f表示原图,h表示核,g表示目标图,当normalize=true的时候,方框滤波就变成了我们熟悉的均值滤波。也就是说,均值滤波是方框滤波归一化(normalized)后的特殊情况。其中,归一化就是把要处理的量都缩放到一个范围内,比如(0,1),以便统一处理和直观量化。
而非归一化(Unnormalized)的方框滤波用于计算每个像素邻域内的积分特性,比如密集光流算法(dense optical flow algorithms)中用到的图像倒数的协方差矩阵(covariance matrices of image derivatives)
如果我们要在可变的窗口中计算像素总和,可以使用integral()函数。
<7>均值滤波
均值滤波,是最简单的一种滤波操作,输出图像的每一个像素是核窗口内输入图像对应像素的像素的平均值( 所有像素加权系数相等),其实说白了它就是归一化后的方框滤波。
我们在下文进行源码剖析时会发现,blur函数内部中其实就是调用了一下boxFilter。
1)均值滤波的理论简析
2)均值滤波的缺陷
均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
3)在OpenCV中使用均值滤波——blur函数
blur函数的作用是,对输入的图像src进行均值滤波后用dst输出。
这个内核一看就明了,就是在求均值,即blur函数封装的就是均值滤波。
[cpp] view plaincopy
- C++: void blur(InputArray src, OutputArraydst, 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,我们一般不去管它。
<8>高斯滤波
1)高斯滤波的理论简析
大家常常说高斯滤波最有用的滤波操作,虽然它用起来,效率往往不是最高的。
图像与圆形方框模糊做卷积将会生成更加精确的焦外成像效果。由于高斯函数的傅立叶变换是另外一个高斯函数,所以高斯模糊对于图像来说就是一个低通滤波操作。
高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。一维零均值高斯函数为:
其中,高斯分布参数Sigma决定了高斯函数的宽度。对于图像处理来说,常用二维零均值离散高斯函数作平滑滤波器。
二维高斯函数为:
2)在OpenCV中使用高斯滤波——GaussianBlur函数
- 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
- 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
- 第三个参数,Size类型的ksize高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数。或者,它们可以是零的,它们都是由sigma计算而来。
- 第四个参数,double类型的sigmaX,表示高斯核函数在X方向的的标准偏差。
- 第五个参数,double类型的sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
- 为了结果的正确性着想,最好是把第三个参数Size,第四个参数sigmaX和第五个参数sigmaY全部指定到。
- 第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。
嗯,第一部分的理论介绍大概就是这些了,我们接着进入第二部分,OpenCV的源码剖析。
二、深入——OpenCV源码剖析
这样,我们就可以对 OpenCV有一个更加深刻的理解,成为一个高端大气的OpenCV使用者。
<1>OpenCV中boxFilter函数源码解析
转载于:https://www.cnblogs.com/huty/p/8518168.html
【图像处理】【计算机视觉】线性邻域滤波专场:方框滤波、均值滤波与高斯滤波...相关推荐
- 《OpenCV3编程入门》学习笔记6 图像处理(一)线性滤波:方框滤波、均值滤波、高斯滤波
第6章 图像处理 6.1 线性滤波:方框滤波.均值滤波.高斯滤波 6.1.1 图像滤波与滤波器 1.图像滤波:在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制 目的: (1)抽出对象的特征作为图 ...
- 【OpenCV】5种图像滤波辨析:方框、均值、高斯、中值、双边
from:http://www.07net01.com/2015/12/1003192.html 图像滤波 什么是图像滤波 图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预 ...
- matlab 均值滤波_数字图像处理基础 — 高斯滤波
高斯滤波,本文主要讲其如何通过C语言实现.不太擅长写理论性质的文章,这里仅仅阐述自己怎么实现以及简单的优化过程. 通常我们对获取的图像进行进一步处理时,往往需要先进行一次降噪,而通常我们选择的是高斯滤 ...
- 图像处理:高斯滤波算法
目录 前言 概念介绍 基本原理 卷积核的大小 卷积核的形状和权重比 卷积核的归一化 结论 Opencv实现高斯滤波 Python手写实现高斯滤波 参考文章 前言 在此之前,我曾在此篇中推导过图像处理: ...
- 图像处理---高斯滤波
//GaussianBlur(); IplImage* iplImage; cvSmooth(plDestImage, plDestImage, CV_GAUSSIAN, 3, 3, 3 , 3);/ ...
- 高斯滤波的理解与学习
高斯滤波的理解与学习 微信公众号:幼儿园的学霸 目录 文章目录 高斯滤波的理解与学习 目录 前言 高斯函数 一维高斯函数 二维高斯函数 高斯滤波过程 高斯核求解 利用高斯核滤波 高斯滤波步骤 高斯滤波 ...
- gaussian用法 matlab_matlab做gaussian高斯滤波
原文链接:https://blog.csdn.net/humanking7/article/details/46826105 核心提示 在Matlab中高斯滤波非常方便,主要涉及到下面两个函数: 函数 ...
- 图像滤波之高斯滤波介绍
1 高斯滤波简介 了解高斯滤波之前,我们首先熟悉一下高斯噪声.高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声.如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的, ...
- 直方图均衡化高斯滤波
直方图均衡化高斯滤波 直方图 原理 py实现 均衡化 原理 py实现 高斯滤波 原理 py实现 直方图 原理 直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹 ...
最新文章
- linux mysql 2003错误代码,如何解决linux mysql2003错误
- Rocksdb的事务(二):完整事务体系的 详细实现
- 研究生论文“盲审”“查重”再加码!毕业或将变的更加困难
- 为您解析大数据的未来趋势
- Nature:越运动越聪明!躺平小鼠这样做,长出更多脑细胞
- Android系统将内置滤镜功能
- Android开发入门经典实例
- struts配置通配符*来匹配方法,实现动态调用
- python 闭包中引用的变量值变更问题
- JS/PHP中,数组与字符串的转换,这次总算是记住了
- org.apache.struts2.json.JSONWriter can not access a member of class
- apache开源项目--PDFBox
- 连线杂志:史上最强的恶意软件Stuxnet揭秘
- SQL server 2008 T-sql 总结
- Java编程:查找算法——顺序查找、二分查找、插值查找、斐波那契查找
- 高中计算机会考操作题程序设计,高中信息技术算法与程序设计题库(含答案)
- Fedora14源代码获取方法----直接到官网去下载
- 史玉柱正式退休:把互联网留给年轻人
- HDU 4417 Super Mario(划分树)
- 手把手教你搭建一个直播服务器(Nginx+Rtsp)
热门文章
- asp.net服务器控件与html服务器控件的区别
- js bool true false 真假比较
- Clojure入门指南(Getting Started)
- 封装一个类搞定90%安卓客户端与服务器端交互
- UART0串口编程(六):串口(UART0)之UC/OS(二)UC/OS下的串口接收任务编程
- Jar/War/Ear等包的作用与区别详解
- rabbitmq一:基本概念
- redis client 2.0.0 pipeline 的list的rpop bug
- 不用vim-airline/lightline.vim, 如何使用纯手工制作一个漂亮的 vim 状态栏
- 马哥2013年运维视频笔记 day02 Linux系统常识