在图像处理领域中,滤波是图像增强的一项非常重要的手段,其基本原理就是将图像中的每个点与其相邻的几个像素点的像素值作邻域运算,即进行加权平均卷积运算。很显然,当图像中存在明显的边缘信息时,通常的邻域运算必然会导致图像中边缘点的像素值发生变化,使图像的边缘变得模糊不清。为了改善这一现象,提出了双边滤波的方法,双边滤波器模板的卷积权值的选取不仅取决于普通低通滤波的像素邻域位置关系,同时还由相邻像素的亮度信息所决定。用模板对图像的边缘进行平滑处理,在有效去除噪声的同时,还能很大程度地保持并加强边缘信息。
双边滤波方法(Bilateral filtering)是基于Gauss 滤波方法提出的,主要是针对Gauss 滤波中将Gauss 权系数直接与图像信息作卷积运算进行图像滤波的原理,将滤波权系数优化成Gauss 函数和图像亮度信息的乘积,优化后的权系数再与图像信息作卷积运算,这样就能在滤波的同时考虑到图像信息中的图像边缘信息,使图像在正常Gauss 滤波后很模糊的边缘信息得以保持清晰,并且图像边缘更加平滑。此方法对于彩色和灰度图像的滤波均适用,具有很强的实用性。
此算法能有效自动增强色阶亮、暗皆有分布的高反差图像,无论处理灰度图像还是彩色图像,结合图像亮度信息作为滤波权系数的双边滤波方法都可以使得滤波后的图像中的边缘信息得到相应的加强,同时在对噪声的去除方面有明显的改进。在达到对图像进行平滑去噪的目的同时,还可以很大程度上保持图像的边缘信息,具有很强的实用性。
OPENCV图像平滑
各种方法的图像平滑
void cvSmooth( const CvArr* src, CvArr* dst, int smoothtype=CV_GAUSSIAN, int param1=3, int param2=0, double param3=0 );
-
src
- 输入图像. dst
- 输出图像. smoothtype
-
平滑方法:
- CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素领域
param1
×param2
求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。 - CV_BLUR (simple blur) - 对每个象素邻域
param1
×param2
求和并做尺度变换 1/(param1
•param2
). - CV_GAUSSIAN (gaussian blur) - 对图像进行核大小为
param1
×param2
的高斯卷积 - CV_MEDIAN (median blur) - 发现邻域
param1
×param1
的中值 (i.e. 邻域是方的). - CV_BILATERAL (双滤波) - 应用双向 3x3 滤波,彩色 sigma=
param1
,空间 sigma=param2
. 关于双向滤波,可参考 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Filtering.html
param1
- CV_BLUR_NO_SCALE (简单不带尺度变换的模糊) - 对每个象素领域
- 平滑操作的第一个参数. param2
-
平滑操作的第二个参数.
param2
为零对应简单的尺度变换和高斯模糊。
param3
-
对应高斯参数的 Gaussian sigma (标准差). 如果为零,这由下面的核尺寸计算:
sigma = (n/2 - 1)*0.3 + 0.8, 其中 n=param1 对应水平核, n=param2 对应垂直核.
对小的卷积核 (3×3 to 7×7) 使用标准 sigma 速度会快。如果param3
不为零,而param1
和param2
为零,则核大小有 sigma 计算 (以保证足够精确的操作).
函数 cvSmooth 可使用上面任何一种方法平滑图像。每一种方法都有自己的特点以及局限。
没有缩放的图像平滑仅支持单通道图像,并且支持8位、16位、32位和32位浮点格式。
简单模糊和高斯模糊支持 1- 或 3-通道, 8-比特 和 32-比特 浮点图像。这两种方法可以(in-place)方式处理图像。
中值和双向滤波工作于 1- 或 3-通道, 8-位图像,但是不能以 in-place 方式处理图像.