Python|双边过滤
双边滤波器用于平滑图像和减少噪声,同时保留边缘。本文介绍了一种使用平均滤波器的方法,而本文提供了一种使用中值滤波器的方法。然而,这些卷积通常会导致重要边缘信息的丢失,因为它们模糊了所有内容,无论它是噪声还是边缘。为了解决这个问题,引入了非线性双边滤波器。
高斯模糊
高斯模糊可以表述如下:
这里, 是像素p的结果,RHS 本质上是高斯函数加权的所有像素q的总和。 是像素q处的强度。
双边过滤器:附加边缘项
双边滤波器可以表示如下:
这里,归一化因子和范围权重是添加到前面等式的新项。 表示内核的空间范围,即邻域的大小,并且表示边缘的最小幅度。它确保只有那些强度值与中心像素相似的像素才被考虑进行模糊处理,同时保持剧烈的强度变化。的值越小 ,边缘越锐利。作为趋于无穷大,方程趋于高斯模糊。
OpenCV 有一个名为lateralFilter()的函数,其参数如下:
- d:每个像素邻域的直径。
- sigmaColor:值在色彩空间中。值越大,相距较远的颜色将开始混合。
- sigmaSpace:的值在坐标空间。它的值越大,混合在一起的像素就越多,因为它们的颜色在 sigmaColor 范围内。
代码 :
输入:嘈杂的图像。
代码:实现双边过滤
Python
import cv2
# Read the image.
img = cv2.imread('taj.jpg')
# Apply bilateral filter with d = 15,
# sigmaColor = sigmaSpace = 75.
bilateral = cv2.bilateralFilter(img, 15, 75, 75)
# Save the output.
cv2.imwrite('taj_bilateral.jpg', bilateral)
双边滤波器输出
与平均和中值过滤器的比较
下面是平均滤波器的输出 (cv2.blur(img, (5, 5)))。
下面是中值滤波器的输出(cv2.medianBlur(img, 5))。
下面是高斯滤波器的输出(cv2.GaussianBlur(img, (5, 5), 0))。
很容易注意到,所有这些去噪滤波器都会弄脏边缘,而双边滤波则保留了它们。