对于使用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. Go运算操作符全解与实战:编写更高效的代码!

    本文全面探讨了Go语言中的各类运算操作符,从基础的数学和位运算到逻辑和特殊运算符.文章旨在深入解析每一种运算操作符的工作原理.应用场景和注意事项,以帮助开发者编写更高效.健壮和可读的Go代码. 简介 ...

  2. 当你使用Taro时,你需要了解的一些事儿

    2017 年 1 月 9 日凌晨,万众期待的微信小程序正式上线,前有跳一跳等爆圈小游戏的带动,后有特殊时期下各类健康码小程序的加持,小程序成为了国内技术圈独树一帜的存在.但随着小程序的迅猛发展,其实在 ...

  3. java类序列化和反序列化

    参考:https://zhuanlan.zhihu.com/p/144535172?utm_id=0 https://blog.csdn.net/qq_42617455/article/details ...

  4. Appilot发布:打造面向DevOps场景的开源AI助手

    今日,数澈软件Seal (以下简称"Seal")宣布推出面向 DevOps 场景的 AI 助手 Appilot,这款产品将充分利用 AI 大语言模型的能力为用户提供变革性的部署和应 ...

  5. 485modbus转profinet网关连接威纶通与三菱变频器modbus通讯

    485modbus转profinet网关连三菱变频器modbus通讯触摸屏监控 本案例介绍了如何通过485modbus转profinet网关连接威纶通与三菱变频器进行modbus通讯.485modbu ...

  6. 兴达易控Modbus转Profinet网关连接三菱A800变频器配置案例

    兴达易控Modbus转Profinet网关连接1200Profinet转modbus接三菱A800变频器 下面介绍A800 变频器通过兴达易控modbus转profinet网关,使1200plc无需编 ...

  7. modbus转profinet网关连接ABB变频器在博图程序案例

    modbus转profinet网关连接ABB变频器在博图程序案例 在博图里PLC无需编程利用兴达易控modbus转Profinet网关将ABB变频器接入到西门子网络中,用到设备为西门子1200PLC, ...

  8. VisionPro学习笔记(4)——PatInspect

    如果需要了解其他图像处理的文章,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice ...

  9. android 中service的简单事例

    源码 public class ServiceDemoActivity extends Activity { private static final String TAG = "Servi ...

  10. 基于AI模型的验证码安全识别(B站,知乎等)

      bilibili 汉字识别顺序验证码 实现基本思路:    先利用Selenium模拟登录,当然在这之前做好请求伪装,get方法使边框最大化,并且将系统的windows窗口缩放比例设置为100%, ...