双边滤波其综合了高斯滤波器和α-截尾均值滤波器的特点,同时考虑了空间域与值域的差别,而Gaussian Filter和α均值滤波分别只考虑了空间域和值域差别。高斯滤波器只考虑像素间的欧式距离,其使用的模板系数随着和窗口中心的距离增大而减小;α-截尾均值滤波器则只考虑了像素灰度值之间的差值,去掉α%的最小值和最大值后再计算均值。
cv.bilateralFilter(输入图像, d, sigmaColor, sigmaSpace)
src: 输入图像
d: 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从sigmaSpace计算该值。
sigmaColor: 颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
sigmaSpace: 坐标空间中滤波器的sigma值,如果该值较大,则意味着越远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色.
import cv2 as cv
src = cv.imread("img/chaowei.jpg")
sigmaColor = 0
sigmaSpace = 0
def onChange(index, val):
global sigmaSpace, sigmaColor
if index == 0:
sigmaColor = val
elif index == 1:
sigmaSpace = val
# 双边滤波器
dst = cv.bilateralFilter(src, 10, sigmaColor, sigmaSpace)
cv.imshow("dst", dst)
onChange(0, 0)
cv.createTrackbar("sigmaColor", "dst", 0, 255, lambda x: onChange(0, x))
cv.createTrackbar("sigmaSpace", "dst", 0, 255, lambda x: onChange(1, x))
cv.imshow("src", src)
cv.waitKey()
效果: