代码语言:javascript复制
import cv2
o=cv2.imread("C:/Users/xpp/Desktop/Lena.png")#原始图像
r=cv2.bilateralFilter(o,25,100,100)#双边滤波
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
算法:双边滤波是综合考虑空间信息和色彩信息的滤波方式,在滤波过程中有效地保护图像内的边缘信息。双边滤波在计算某一个像素点的值时,不仅考虑距离信息(距离越远,权重越小),还考虑色彩信息(色彩差别越大,权重越小)。双边滤波综合考虑距离和色彩的权重,既能够有效地去除噪声,又能够较好地保护边缘信息。在双边滤波中,与当前点色彩相近的像素点(颜色距离很近)会被给予较大的权重值;与当前色彩差别较大的像素点(颜色距离很远)会被给予较小的权重值(极端情况下权重可能为0,直接忽略该点),这样就保护了边缘信息。
- 图(a)是原始图像
- 图(b)是进行均值滤波后的结果。缺点:在进行均值滤波时,只考虑空间信息,此时左右两侧的像素的处理结果是综合考虑周边元素像素值,并对它们取均值得到的结果
- 图(c)是进行双边滤波后的结果
dst=cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)
- dst表示返回值,表示进行双边滤波后的结果
- src表示输入图像,图像深度是CV_8U、CV_16U、CV_16S、CV_32F、CV_64F
- d表示滤波时选取的空间距离参数,表示以当前像素点为中心点的直径
- sigmaColor表示滤波时选取的颜色差值范围
- sigmaSpace表示坐标空间中的sigma值
- borderType表示边界样式,可选参数
注意:d值为非正数,则会自动从sigmaSpace中计算得到。如果滤波空间较大(d>5),则计算速度慢。一般推荐d=5,对于较大噪声的离线滤波,推荐d=9。当d>0时,无论sigmaSpace的值如何,d都指定邻域大小,否则,d与sigmaSpace的值成正比。在滤波处理中,与当前像素值差值小于sigmaColor的像素点,能够参与当前的滤波。sigmaColor的值越大,说明周围越多的像素点参与到运算中。当sigmaColor的值为0时,滤波没有意义;当sigmaColor的值为255时,指定直径内的所有点都能够参与运算。为了方便起见,可以将sigmaColor和sigmaSpace的值设置一样。