【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、将分离的通道重新合并在一起并输出为图像

posted @ 2023-11-29 21:05  VanGoghpeng  阅读(131)  评论(0编辑  收藏  举报