双边滤波opencv-python

双边滤波——非线性滤波

文章目录

  • 前言
  • 一、双边滤波是什么?
  • 二、cv.bilateralFilter()函数
    • 1.函数原型
    • 2.函数使用
  • 参考


前言

虽然中值滤波作为典型的低通滤波器,可以在去除噪声的同时能够保护图像边缘。但是当中值滤波也会随着滤波模板的增大,使得图像变得模糊。为了更好的解决既要求去除噪音又要保证图像的清晰度的问题,引入非线性滤波中的双边滤波。双边滤波是一种保证图像清晰度又可以去除噪音的滤波算法。


一、双边滤波是什么?

双边滤波可以保持细节信息又可以去噪,之所以达到这个效果,是因为双边滤波是由两个函数共同组成,一个函数可以通过几何空间距离决定滤波的空域参数,而另一个函数可以通过像素的差决定滤波的值域参数。这两个函数提供了空域滤波以及值域滤波,也因为有这两个滤波使得双边滤波器既能够保留图像边缘又可以实现噪音的去除。双边滤波利用空域滤波,即高斯低通滤波器,以及值域滤波,即α-截尾均值滤波器:去掉百分率为α的最小值和最大之后剩下像素的均值作为滤波器,对图像边缘附近的像素进行滤波时,距离边缘较远的像素不会对边缘上的像素影响太大,从而保证了图像边缘的清晰度。

二、cv.bilateralFilter()函数

1.函数原型

代码如下(示例):

dst = cv.bilateralFilter(src,
						 d,
						 sigmaColor
						 sigmaSpace
						 [,dst
						 [,borderType
#src:待双边滤波的栓如图像
#d:滤波模板的大小
#sigmaColor:颜色空间的滤波的标准差
#sigmaSpace:空间坐标的滤波的标准差
#borderType:像素边界外推法标志

函数用于图像的双边滤波,并将滤波结果返回。该滤波可以在减少噪音的同时保持边缘细节。src参数只能接收单通道的灰度图,三通道的彩色图,并且数据类型只接受uint8、uint32、uint64.
当滤波器的d大于5时,系统运行速度会下降,是因为系统需要实时使用这个参数,在离线处理含有大量噪音的图像时建议设置d为9.当滤波器的直径为非正数时,函数会根据sigmacolor计算滤波器的直径。当sigmacolor越大,像素领域内有越多的颜色被混合到一起,会产生较大的颜色混合区域。当sigmaspace越大表明越远的像素会互相影响,从而使得更大的领域有足够相似的像素获取相同的颜色,但是当d大于0时,领域由d确定,d小于等于0时,领域正比于这个参数。
为了简单点,将sigmacolor和sigmaspace设置成相同,当他们小于10时,滤波器对图像的滤波作用较弱,大于150时,滤波会比较强烈,使得图像具有卡通效果。
同时,只要我们参数设定较为妥当,双边滤波可以达到美颜的效果。

2.函数使用

双边滤波的直径大小对于滤波的效果非常重要,d越大,滤波效果越加明显,同时,d相等,标准差越大,效果也越加明显。参数设定下,双边滤波对于人脸能够起到美颜效果。

result1 = cv.biateralFilter(img,9,50,25/2)
result2 = cv.biateralFilter(img,9,200,200)

参考

冯振 陈亚萌 基于python的opencv4详解 [M]

你可能感兴趣的:(opencv,python,opencv,python,计算机视觉)