对于使用OpenCV已有的算子,我们还可以自定义卷积核以达到不同的效果。
filters.py
1 import cv2 2 import numpy 3 4 """ 定义滤波器和类 """ 5 6 7 def strokeEdges(src, dst, blurKsize=7, edgeKsize=5): 8 if blurKsize >= 3: 9 blurredSrc = cv2.medianBlur(src, blurKsize) 10 graySrc = cv2.cvtColor(blurredSrc, cv2.COLOR_BGR2GRAY) 11 else: 12 graySrc = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) 13 cv2.Laplacian(graySrc, cv2.CV_8U, graySrc, edgeKsize) 14 normalizedInverseAlpha = (1.0 / 255) * (255 - graySrc) 15 channels = cv2.split(src) 16 for channel in channels: 17 channel[:] = channel * normalizedInverseAlpha 18 cv2.merge(channels, dst) 19 20 21 class VConvolutionFilter: 22 """ 卷积滤波 """ 23 def __init__(self, kernel): 24 self._kernel = kernel 25 26 def apply(self, src, dst): 27 cv2.filter2D(src, -1, self._kernel, dst) 28 29 30 class SharpenFilter(VConvolutionFilter): 31 """ 锐化 """ 32 def __init__(self): 33 kernel = numpy.array( 34 [ 35 [-1, -1, -1], 36 [-1, 9, -1], 37 [-1, -1, -1] 38 ] 39 ) 40 VConvolutionFilter.__init__(self, kernel) 41 42 43 class FindEdgesFilter(VConvolutionFilter): 44 """ 边缘检测 """ 45 def __init__(self): 46 kernel = numpy.array( 47 [ 48 [-1, -1, -1], 49 [-1, 8, -1], 50 [-1, -1, -1] 51 ] 52 ) 53 VConvolutionFilter.__init__(self, kernel) 54 55 56 class BlurFilter(VConvolutionFilter): 57 """ 模糊滤波 """ 58 def __init__(self): 59 kernel = numpy.array( 60 [ 61 [0.04, 0.04, 0.04, 0.04, 0.04], 62 [0.04, 0.04, 0.04, 0.04, 0.04], 63 [0.04, 0.04, 0.04, 0.04, 0.04], 64 [0.04, 0.04, 0.04, 0.04, 0.04], 65 [0.04, 0.04, 0.04, 0.04, 0.04], 66 ] 67 ) 68 VConvolutionFilter.__init__(self, kernel) 69 70 71 class EmbossFilter(VConvolutionFilter): 72 """ 浮雕 """ 73 def __init__(self): 74 kernel = numpy.array( 75 [ 76 [-2, -1, 0], 77 [-1, -1, 1], 78 [0, 1, 2] 79 ] 80 ) 81 VConvolutionFilter.__init__(self, kernel)
将filter.py文件导入cameo,py自行调用
关于卷积核权值总和:
当总和 <1 时,代表图片整体的亮度变暗
当总和 =1 时,代表图片的整体亮度不发生变化
当总和 >1 时,代表图片的整体亮度变亮、
上述总和值,一般都是通过中心点的值做最后的差值,从而达到明暗的变换。