【Python】【OpenCV】边缘检测和创建自定义核
对于使用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 时,代表图片的整体亮度变亮、
上述总和值,一般都是通过中心点的值做最后的差值,从而达到图片整体明暗的变换。
strokeEdges方法解析:
1、先将当前帧转换为灰度图
2、再使用Laplace算子进行边缘提取——边缘既是前景像素,也就是我们感兴趣区域,而其余像素都是背景像素,Laplace会将前景像素灰度级置为接近255,而背景则置为接近0
3、计算反向透明度(Alpha,阈值在0-1之间),先将前景像素使用255进行减法操作,然后再去和归一化因子进行乘积,从而得到每一个像素点的Alpha值
4、分离通道,Alpha和RBG即三个颜色通道是对应的,即每个通道都有Alpha属性,所以需要分离通道后单独操作,进而实现 描边 的效果
5、将分离的通道重新合并在一起并输出为图像