【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 ...
随机推荐
- 详细解释一下Spring是如何解决循环依赖问题的
Spring是如何解决循环依赖问题的? 我们都知道,如果在代码中,将两个或多个Bean互相之间持有对方的引用就会发生循环依赖.循环的依赖将会导致注入死循环,这是Spring发生循环依赖的原因 循环依赖 ...
- web应用及微信小程序版本更新检测方案实践
背景: 随着项目体量越来越大,用户群体越来越多,用户的声音也越来越明显:关于应用发版之后用户无感知,导致用户用的是仍然还是老版本功能,除非用户手动刷新,否则体验不到最新的功能:这样的体验非常不好,于是 ...
- RK3568开发笔记(十):开发板buildroot固件移植开发的应用Demo,启动全屏显示
前言 上一篇,移植应用前的通讯接口工作和全屏工作都已经完成了.本篇移植开发的商业应用. 交叉编译好应用 (略),参照<RK3568开发笔记(八):开发板烧写buildroot固件(支 ...
- Solution Set -「CF 1490」
「CF 1490A」Dense Array Link. 显然不满足的 adjacent elements 之间一直加 \(\min\times2,\min\times4,\cdots,\min\tim ...
- 简单的Oracle增删改查笔记
- 【matplotlib 实战】--柱状图
柱状图,是一种使用矩形条,对不同类别进行数值比较的统计图表.在柱状图上,分类变量的每个实体都被表示为一个矩形(通俗讲即为"柱子"),而数值则决定了柱子的高度. 1. 主要元素 柱状 ...
- Capture Data.dmg
苹果apple mac 系统检测 日常分析 软件 https://gigafiles.apple.com/#/download 现有文件可供下载. 备注 Capture Data 9.9.0 Th ...
- 前端CSS五中元素定位类型
元素想通过底部.顶部.左侧.右侧属性定位是必须先设定position的属性值 posistion属性的五个值:static.relative.fixed.absoulte.sticky static定 ...
- 14. 从零开始编写一个wmproxy(代理,内网穿透等), HTTP文件服务器的实现过程及参数
用Rust手把手编写一个wmproxy(代理,内网穿透等), HTTP中的压缩gzip,deflate,brotli算法 项目 ++wmproxy++ gite: https://gitee.com/ ...
- 关于IP我们需要知道的
IP 在这个数字世界中,互联网已成为我们生活的一部分.而在互联网的背后,网络知识如同一张巨大的蜘蛛网,将我们与世界各地的信息紧密联系在一起.其中,IP这个看似平凡的名词,却是支撑这个虚拟世界的重要基石 ...