【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、将分离的通道重新合并在一起并输出为图像
【Python】【OpenCV】边缘检测和创建自定义核的更多相关文章
- python+opencv模拟生成运动模糊核
Mark:https://www.cnblogs.com/wyh1993/p/7118559.html 效果非常的好
- 【Python | opencv+PIL】常见操作(创建、添加帧、绘图、读取等)的效率对比及其优化
一.背景 本人准备用python做图像和视频编辑的操作,却发现opencv和PIL的效率并不是很理想,并且同样的需求有多种不同的写法并有着不同的效率.见全网并无较完整的效率对比文档,遂决定自己丰衣足食 ...
- [OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
http://blog.csdn.net/poem_qianmo/article/details/25560901 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...
- 在 Windows Azure 网站上使用 Django、Python 和 MySQL:创建博客应用程序
编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 撰写. 根据您编写的应用程序,Windows Azure 网站上的基本Python 堆 ...
- Python+OpenCV图像处理(一)
Python+OpenCV图像处理(一): 读取,写入和展示图片 调用摄像头拍照 调用摄像头录制视频 1. 读取.写入和展示图片 图像读入:cv2.imread() 使用函数cv2.imread() ...
- VSCode创建自定义代码段
上一篇:PyCharm创建自定义代码段(JetBrains系列通用) 设置方法 很简单,快速过一下,F1,然后输入snippets 然后选择对应语言 Python案例 内容和使用: { // pref ...
- tensorflow创建自定义 Estimator
https://www.tensorflow.org/guide/custom_estimators?hl=zh-cn 创建自定义 Estimator 本文档介绍了自定义 Estimator.具体而言 ...
- Python+OpenCV图像处理(一)——读取显示一张图片
先在此处先声明,后面学习python+opencv图像处理时均参考这位博主的博文https://blog.csdn.net/u011321546/article/category/7495016/2? ...
- 【python+opencv】直线检测+圆检测
Python+OpenCV图像处理—— 直线检测 直线检测理论知识: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进 ...
- ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务
ROS Indigo beginner_Tutorials-11 创建自定义的ROS消息和ROS服务 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubunt ...
随机推荐
- gitlab与LDAP 联调
gitlab整理 目录 gitlab整理 1.安装Gitlab依赖包 2.下载,安装 3.配置,访问域名及邮箱 4.初始化,启动 5.访问,以及邮箱测试 5.1汉化 6.问题总结处理 6.1安装时出现 ...
- VB快速上手文档教程
前言 本来我想可能不会接触到这个语言, 不过在用excel时需要用到VBA. 这就不得不专门去学习一番. 入了个门, 专门写个文档留着. 万一以后用得到呢- 论VB, 我还是初学者. 如有弄错了的地方 ...
- Spring中事务的传播行为有哪些?
Spring中事务的传播行为有哪些? 现在我们来谈一个场景,再来引出事务传播行为这个概念.现在有methodA( ) 和 methodB( ),而且两个方法都显示的开启了事务,那么methodB( ) ...
- [知识管理] Obsidian + Remotely Save插件 + 第三方存储/OSS(七牛云)的同步方案
0 序言 在几经选择.对比之后,我选择:Obsidian + Remotely Save插件 + 第三方存储/OSS(七牛云) 的方案来搭建自己的[知识管理系统]. 对比分析知识管理工具的过程,详情参 ...
- Python基础合集
入门介绍 01.python由来与发展介绍 02.WEB项目开发流程 第一篇 markdown编辑器 01.markdown基本语法 02.Typora简介与安装 03.Windows上gitee+T ...
- Oracle11g安装教程(带安装包)
找了半天没在官网上找到Oracle11g的安装包下载,又找了半天,终于在网上的一个教程里找到安装包的网盘链接.现在在这记一下防止以后重新找麻烦. 网盘链接 百度云盘链接:[https://pan.ba ...
- [最优化DP]决策单调性
决策单调性的概念&证明工具: 决策单调性,是在最优化dp中的可能出现的一种性质,利用它我们可以降低转移的复杂度. 首先dp中会有转移,每个状态都由若干个状态转移而来,最优化dp比较特殊,只能由 ...
- 一个基于Vue模型的表单生成器
哈喽,我是老鱼,一名致力于在技术道路上的终身学习者.实践者.分享者! Vuetify Form Base是一个基于模型的表单生成器,目的是提供一个工具,以便以较少的努力从任何模型数据生成可编辑的表单, ...
- Isito 入门(九):安全认证
本教程已加入 Istio 系列:https://istio.whuanle.cn 目录 7,认证 Peer Authentication PeerAuthentication 的定义 实验 Reque ...
- 数据结构与算法 | 动态规划算法(Dynamic Programming)
上一篇文末已经提到了记忆化搜索是动态规划(Dynamic Programming)的一种形式,是一种自顶向下(Top-Down)的思考方式,通常采用递归的编码形式:既然动态规划有自顶向下(Top-Do ...