卷积滤波器是基于核的滤波器,其实核是一组权重,它决定如何通过邻近像素点来计算新的像素点。核也称为卷积矩阵,它对一个区域的像素做调和或卷积运算。
OpenCV提供了一个非常通用的filter2D()函数,它运用由用户指定的任意核或卷积矩阵。
cv2.filter2D(src, -1, kernel, dst)
第二个参数指定了目标图像每个通道的位深度(比如,位深度cv2.CV_8U表示每个通道为8位),如果为负值,则表示目标图像与源图像有同样的位深度。
下面分别构建一个一般的卷积滤波器、锐化滤波器、边缘检测滤波器、模糊滤波器、模糊锐化滤波器(浮雕效果)。
需要注意的是,如果不想改变图像的亮度,就应该使卷积核的权重之和为1;如果为0,就会得到一个边缘检测核,把边缘转为白色,把非边缘区域转化为黑色。
class VConvolutionFilter(object):
"""A filter that applies a convolution to V (or all of BGR)."""
def __init__(self, kernel):
self._kernel = kernel
def apply(self, src, dst):
"""Apply the filter with a BGR or gray source/destination."""
cv2.filter2D(src, -1, self._kernel, dst)
class SharpenFilter(VConvolutionFilter):
"""A Sharpen filter with a 1-pixel radius."""
def __init__(self):
kernel = np.array([[-1, -1, -1],
[-1, 9, -1],
[-1, -1, -1]])
VConvolutionFilter.__init__(self, kernel)
class FindEdgesFilter(VConvolutionFilter):
"""An edge-finding filter with a 1-pixel radius."""
def __init__(self):
kernel = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]])
VConvolutionFilter.__init__(self, kernel)
class BlurFilter(VConvolutionFilter):
"""A blur filter with a 2-pixel radius."""
def __init__(self):
kernel = np.array([[0.04, 0.04, 0.04, 0.04, 0.04],
[0.04, 0.04, 0.04, 0.04, 0.04],
[0.04, 0.04, 0.04, 0.04, 0.04],
[0.04, 0.04, 0.04, 0.04, 0.04],
[0.04, 0.04, 0.04, 0.04, 0.04]])
VConvolutionFilter.__init__(self, kernel)
class EmbossFilter(VConvolutionFilter):
"""An emboss filter with a 1-pixel radius."""
def __init__(self):
kernel = np.array([[-2, -1, 0],
[-1, 1, 1],
[0, 1, 2]])
VConvolutionFilter.__init__(self, kernel)
想了解更多关于数字图像处理:数字图像处理专栏