OpenCV bilateralFilter():实现双边滤波(附带实例)
双边滤波是一种非线性滤波器,它可以达到保持边缘、降噪平滑的效果。
和其他滤波原理一样,双边滤波也采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高斯分布。
最重要的是,在计算中心像素的时候,双边滤波的权重不仅考虑了像素的欧氏距离(如普通的高斯低通滤波,只考虑了位置对中心像素的影响),还考虑了像素范围域中的辐射差异(如卷积核中像素与中心像素之间的相似程度、颜色强度、深度距离等)。
与高斯滤波相比,双边滤波能够更好地保存图像的边缘信息。其原理为一个与空间距离相关的高斯函数与一个与灰度距离相关的高斯函数相乘。高斯滤波降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。
双边滤波主要是通过 cv2.bilateralFilter() 函数来操作的,它能够在保持边界清晰的情况下有效地去除噪声,但是这种操作比较慢。它拥有美颜的效果。该函数声明如下:
【实例】实现双边滤波。
和其他滤波原理一样,双边滤波也采用加权平均的方法,用周边像素亮度值的加权平均代表某个像素的强度,所用的加权平均基于高斯分布。
最重要的是,在计算中心像素的时候,双边滤波的权重不仅考虑了像素的欧氏距离(如普通的高斯低通滤波,只考虑了位置对中心像素的影响),还考虑了像素范围域中的辐射差异(如卷积核中像素与中心像素之间的相似程度、颜色强度、深度距离等)。
与高斯滤波相比,双边滤波能够更好地保存图像的边缘信息。其原理为一个与空间距离相关的高斯函数与一个与灰度距离相关的高斯函数相乘。高斯滤波降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。
双边滤波主要是通过 cv2.bilateralFilter() 函数来操作的,它能够在保持边界清晰的情况下有效地去除噪声,但是这种操作比较慢。它拥有美颜的效果。该函数声明如下:
cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) -> dst各个参数的含义如下:
- src 表示输入图像;
- d 表示过滤时周围每个像素领域的直径;
- sigmaColor 表示在 color space 中过滤 sigma,参数值越大,临近像素将会在越远的地方混合;
- sigmaSpace 表示在 coordinate space 中过滤 sigma,参数值越大,对足够相近的颜色影响越大。
【实例】实现双边滤波。
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()运行工程,结果如下图所示:
