很多滤波都是用周围的像素点(即卷积核)的加权平均值来计算,他会导致如果这个核的一部分和另一部分如果色差比较大,一个是黑色 一个是白色,灰度值差255,这样子会导致边缘模糊。我写一段代码测试一下:
import numpy as np
import cv2
black_betw_white = np.zeros([300,300],dtype = np.uint8)
black_betw_white[0:150,0:300] = 255
gauss = cv2.GaussianBlur(black_betw_white,ksize = (5,5),sigmaX = 0 ,sigmaY = 0)
cv2.imshow("original",black_betw_white)
cv2.imshow("gaus",gauss)
cv2.waitKey()
cv2.destroyAllWindows()
可以明显观察到第二张图画蓝色圈的部分边缘出现了模糊。说明对轮廓产生了影响。
双边滤波把色彩差异较大的点的权值设为0,避免了轮廓模糊的情况产生
语法如下:
dst = cv2.bilateralFilter(原始图像src,当前像素点为中心的直径d,sigmaColor与当前像素点色差为多少以内的点能参与到计算中来,sigmaSpace他的值越大越有跟多的点参与,只要d大于0,他就无效,否则d与其成比例,边界样式borderType一般不用)
我们在下面这个案例用高斯和双边滤波的结果进行一个比较,这下充分证明了双边滤波在处理色差和轮廓的优势
import numpy as np
import cv2
black_betw_white = np.zeros([300,300],dtype = np.uint8)
black_betw_white[0:150,0:300] = 255
gauss = cv2.GaussianBlur(black_betw_white,ksize = (5,5),sigmaX = 0 ,sigmaY = 0)
double =cv2.bilateralFilter(black_betw_white,25,100,100)
cv2.imshow("original",black_betw_white)
cv2.imshow("gaus",gauss)
cv2.imshow("dob",double)
cv2.waitKey()
cv2.destroyAllWindows()