参考文献:《OpenCV轻松入门》
均值滤波
用当前像素点周围N*N个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。
函数语法
dst = cv2.blur(src, ksize, anchor, borderType)
- ksize:滤波核的大小,
- anchor:锚点,使用默认值即可
- borderType:边界样式,该值决定了以何种方式处理边界,使用默认值即可
cv2.blur()一般形式为:
dst = cv2.blur(src, ksize)
方框滤波
在方框滤波中,可以自由选择是是否对均值滤波的结果进行归一化,即可以自由选择滤波结果是邻域像素之和的平均值,还是邻域像素值之和。
函数语法
dst = cv2.boxFilter(src, ddepth, ksize, anchor, normalize, borderType)
- ddepth:处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度
- normalize:表示在滤波时是否进行归一化(将计算结果规范化为当前像素值范围内的值),为一个逻辑值,真(1)或假(0),通常情况下使用默认值为1
cv2.boxFilter()一般形式为:
dst = cv2.boxFilter(src, ddepth, ksize)
高斯滤波
将中心点的权重值加大,远离中心点的权重值减小。运算规则为将该点邻域内的像素点按照不同的权重计算和。
在高斯滤波中,卷积核中的值不再都是1。卷积核的宽度和高度可以不同,但都必须是奇数。
函数语法
dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY, borderType)
- sigmaX:卷积核在X轴方向上的标准差
- sigmaY:卷积核在Y轴方向上的标准差
在实际处理中,可以指定sigmaX和sigmaY的值均为0
cv2.GaussianBlur()一般形式为:
dst = cv2.GaussianBlur(src, ksize, 0, 0)
中值滤波
用邻域内所有的像素值的中间值来代替当前像素点的像素值
函数语法
dst = cv2.medianBlur(src, ksize)
- ksize:滤波核的大小。是指在滤波处理中其邻域图像的高度和宽度。
双边滤波
综合考虑空间信息和色彩信息,能够有效地保护图像内的边缘信息
函数语法
dst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, borderType)
- d:空间距离参数。以当前像素点为中心的直径。推荐d=5,若噪声过大,可以d=9
- sigmaColor:选取的颜色差值范围,该值决定了周围那些像素点能够参与到滤波中来
- sigmaSpace:是坐标中的sigma值。
可以将两个sigma值设置为相同。
2D卷积
自定义卷积核实现卷积操作
函数语法
dst = cv2.filter2D(src, ddepth, kernel, anchor, delta, borderType)
- kernel:是卷积核,是一个单通道得数组。如果想在处理彩色图像时,让每个通道使用不同的核,则必须将彩色图像分解后使用不同的核进行操作。
cv2.filter2D()一般形式为:
dst = cv2.filter2D(src, ddepth, kernel)
img = cv2.imread("Lunna.jpg")
kernel = np.ones((9, 9), np.float32)/81
r = cv2.filter2D(img, -1, kernel)
cv2.imshow("img_compare", np.hstack((img, r)))
cv2.waitKey(0)