【Python】【 OpenCV】边缘检测和创建自定义核


风晓
风晓 2023-12-29 10:55:38 65682 赞同 0 反对 0
分类: 资源 标签: AI(人工智能)
对于使用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、将分离的通道重新合并在一起并输出为图像

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
风晓L1
粉丝 1 资源 2038 + 关注 私信
最近热门资源
麒麟系统版本介绍白皮书  509
MiSans 阿拉伯语字体文件  450
解决新版本麒麟系统中微信打开白屏显示  393
麒麟系统进行系统监控,查看进程的运行时间来优化性能  326
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!)  217
统信桌面专业版添加字体  210
统信uos单一程序黑屏,任务栏正常显示解决办法  209
统信uos快捷键文档  181
统信系统双无线网卡设置关闭开启单一网卡  145
分享一个磁盘恢复工具,适用于多平台(包括统信)  119
最近下载排行榜
麒麟系统版本介绍白皮书 0
MiSans 阿拉伯语字体文件 0
解决新版本麒麟系统中微信打开白屏显示 0
麒麟系统进行系统监控,查看进程的运行时间来优化性能 0
临时关闭swap分区与永久关闭swap分区(注意必须确保系统有足够内存运行!) 0
统信桌面专业版添加字体 0
统信uos单一程序黑屏,任务栏正常显示解决办法 0
统信uos快捷键文档 0
统信系统双无线网卡设置关闭开启单一网卡 0
分享一个磁盘恢复工具,适用于多平台(包括统信) 0
作者收入月榜
1

prtyaa 收益399.62元

2

zlj141319 收益236.11元

3

IT-feng 收益219.61元

4

1843880570 收益214.2元

5

风晓 收益208.24元

6

哆啦漫漫喵 收益204.5元

7

777 收益173.07元

8

Fhawking 收益106.6元

9

信创来了 收益106.03元

10

克里斯蒂亚诺诺 收益91.08元

请使用微信扫码

添加我为好友,拉您入交流群!

请使用微信扫一扫!