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

【Python】【OpenCV】边缘检测和创建自定义核的更多相关文章

  1. python+opencv模拟生成运动模糊核

    Mark:https://www.cnblogs.com/wyh1993/p/7118559.html 效果非常的好

  2. 【Python | opencv+PIL】常见操作(创建、添加帧、绘图、读取等)的效率对比及其优化

    一.背景 本人准备用python做图像和视频编辑的操作,却发现opencv和PIL的效率并不是很理想,并且同样的需求有多种不同的写法并有着不同的效率.见全网并无较完整的效率对比文档,遂决定自己丰衣足食 ...

  3. [OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    http://blog.csdn.net/poem_qianmo/article/details/25560901 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...

  4. 在 Windows Azure 网站上使用 Django、Python 和 MySQL:创建博客应用程序

    编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 撰写. 根据您编写的应用程序,Windows Azure 网站上的基本Python 堆 ...

  5. Python+OpenCV图像处理(一)

    Python+OpenCV图像处理(一): 读取,写入和展示图片 调用摄像头拍照 调用摄像头录制视频 1. 读取.写入和展示图片 图像读入:cv2.imread() 使用函数cv2.imread() ...

  6. VSCode创建自定义代码段

    上一篇:PyCharm创建自定义代码段(JetBrains系列通用) 设置方法 很简单,快速过一下,F1,然后输入snippets 然后选择对应语言 Python案例 内容和使用: { // pref ...

  7. tensorflow创建自定义 Estimator

    https://www.tensorflow.org/guide/custom_estimators?hl=zh-cn 创建自定义 Estimator 本文档介绍了自定义 Estimator.具体而言 ...

  8. Python+OpenCV图像处理(一)——读取显示一张图片

    先在此处先声明,后面学习python+opencv图像处理时均参考这位博主的博文https://blog.csdn.net/u011321546/article/category/7495016/2? ...

  9. 【python+opencv】直线检测+圆检测

     Python+OpenCV图像处理—— 直线检测 直线检测理论知识: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进 ...

  10. ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务

    ROS Indigo beginner_Tutorials-11 创建自定义的ROS消息和ROS服务 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubunt ...

随机推荐

  1. js监控微信浏览器的自带的返回事件(延迟解决微信返回立即执行popstate事件)

    /** * 浏览器回退事件监听 */ var listenerBackHandler = { param: { isRun: false, //防止微信返回立即执行popstate事件 }, list ...

  2. 「codeforces - 1486F」Pairs of Paths

    link. 还算萌,但是代码有些难写-- 你首先会想要 int n, m, fa[20][300100], pa[300100], dep[300100], cnt[900100]; int ldf[ ...

  3. Modbus转profinet网关连接1200PLC在博图组态与英威腾驱动器通讯程序案例

    Modbus 转 profinet 网关连接 1200PLC 在博图组态与英威腾驱动器通讯程序案例 本案例给大家介绍由兴达易控 modbus 转 profinet 网关连接 1200PLC 在博图软件 ...

  4. 熟练掌握并充分利用CSS3的新特性,更新完毕。

    1.1  尝试新颖的CSS3特性 首先,我们来看一个具体的案例.  https://code.juejin.cn/pen/7277536985772720139   1.2  CSS3新特性简介和浏览 ...

  5. Vite+ts+springboot项目集成2

    项目集成 集成element-plus 官网地址: 安装图标库 pnpm install element-plus @element-plus/icons-vue 入口文件main.ts全局安装ele ...

  6. 【图像处理】如何使用matplotlib 库显示灰度图像为自定义颜色

    项目场景 我这里有一张名为airplane.jpg的灰度图像灰度图像 使用 matplotlib 库读取并显示: import matplotlib.pyplot as plt root=" ...

  7. 为什么 CSS flex 布局中没有 `justify-items` 和 `justify-self`?

    为什么 CSS flex 布局中没有 justify-items 和 justify-self? 为什么在 CSS flex 布局中存在 align-items 和 align-self,却没有 ju ...

  8. P8741 [蓝桥杯 2021 省 B] 填空问题 题解

    P8741 [蓝桥杯 2021 省 B] 填空问题 题解 题目传送门 欢迎大家指出错误并联系这个蒟蒻 更新日志 2023-05-09 23:19 文章完成 2023-05-09 23:20 通过审核 ...

  9. CSS 元素居中方式总结

    作者:WangMin 格言:努力做好自己喜欢的每一件事 在开发过程中,很多网页需求要求我们居中一个div,比如html文档流当中的一块div,比如弹出层内容部分这种脱离了文档流等.不同的情况有不同的居 ...

  10. iOS程序生命周期流程

    盛年不重来,一日难再晨.及时宜自勉,岁月不待人.   iOS系统资源是有限的,合理的去配置应用程序的运行状态以及了解app的生命周期对于大多数开发者来说是很重要的一件事情!在后台进行运行时app会受到 ...