opencv提供了cv2.filter2D()函数来对图像进行卷积操作(图像滤波)。
dst = cv.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])
如使用一个5x5的均值滤波器对图像作均值滤波:
import cv2
import numpy as np
img = cv2.imread('a.jpg', 0)
kernel = np.ones((5, 5), np.float32) / 25
res = cv2.filter2D(img, -1, kernel)
cv2.imshow('res', res)
cv2.waitKey()
图像模糊即使用低通滤波器对图像作卷积,可以有效地消除噪声。
均值滤波即直接取核中每个像素的均值,由cv2.blur()实现。
dst = cv.blur(src, ksize[, dst[, anchor[, borderType]]])
res = cv2.blur(img, (5, 5))
cv2.GaussianBlur()根据像素距离使用高斯函数生成权重进行滤波。
dst = cv.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])
若只给了一个sigma则同时视为两轴的sigma,若均为0则根据尺寸自动生成。
res = cv2.GaussianBlur(img, (5, 5), 0)
cv2.medianBlur()取核中每个像素的中值作为该像素的值。
dst = cv.medianBlur(src, ksize[, dst])
res = cv2.medianBlur(img, 5)
cv2.bilateralFilter()双边滤波在高斯滤波的基础上增加了灰度值的影响,可以有效地在保持边缘清晰的情况下去除噪声,但速度较慢。
dst = cv.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]])
res = cv2.bilateralFilter(img, 9, 75, 75)