首页 > 编程笔记 > Python笔记 阅读:2

OpenCV bilateralFilter():实现双边滤波(附带实例)

双边滤波是一种非线性滤波器,它可以达到保持边缘、降噪平滑的效果。

和其他滤波原理一样,双边滤波也采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高斯分布。

最重要的是,在计算中心像素的时候,双边滤波的权重不仅考虑了像素的欧氏距离(如普通的高斯低通滤波,只考虑了位置对中心像素的影响),还考虑了像素范围域中的辐射差异(如卷积核中像素与中心像素之间的相似程度、颜色强度、深度距离等)。

与高斯滤波相比,双边滤波能够更好地保存图像的边缘信息。其原理为一个与空间距离相关的高斯函数与一个与灰度距离相关的高斯函数相乘。高斯滤波降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。

双边滤波主要是通过 cv2.bilateralFilter() 函数来操作的,它能够在保持边界清晰的情况下有效地去除噪声,但是这种操作比较慢。它拥有美颜的效果。该函数声明如下:
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) -> dst
各个参数的含义如下:
【实例】实现双边滤波。
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
import random
import math

img = cv.imread(r"test.jpg")
img_bilateral = cv.bilateralFilter(img,0,0.2,40)

cv.imshow("img",img)
cv.imshow("img_bilateral",img_bilateral)
cv.waitKey(0)
cv.destroyAllWindows()
运行工程,结果如下图所示:

相关文章