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、将分离的通道重新合并在一起并输出为图像
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
添加我为好友,拉您入交流群!
请使用微信扫一扫!