【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 ...
随机推荐
- CI框架的base_url localhost [::1]等问题
为什么localhost变成了[::1] [::1]是IP6的地址, 与localhost等价 使用base_url后, 加载不了样式 ci框架需要定义base_url, 未定义就会出现返回local ...
- 【好玩】如何在github主页放一条贪吃蛇
前言 缘由 github放小蛇,就问你烧不烧 起因看到大佬github上有一条贪吃蛇扭来扭去,觉得好玩,遂给大家分享一下本狗的玩蛇历程 成果初展 贪吃蛇 访问地址 https://github.com ...
- [GKCTF 2020]cve版签到
通过题目的提示可知,这是一个CVE(cve-2020-7066)的复现 点击进之后也无回显 看了这个cve之后,知道这个cve就是这个get_headers()会截断URL中空字符后的内容 就根据cv ...
- mybatis-plus使用心得
mybatis-plus是一款基于mybatis的持久层框架,在mybatis上只做增强不做改变.基本使用流程: 导入依赖坐标: <dependency> <groupId>c ...
- 一个简单高效低内存的.NET操作Excel开源框架 - MiniExcel
前言 日常工作中经常与数据打交道的同学肯定会难以避免对Excel的一些数据操作如导入.导出等,但是当对一些大数据量操作Excel时经常会遇到一个常见的问题内存溢出.今天给大家推荐一个简单.高效.低内存 ...
- LooklessControl
Lookless controls vs User Controls. Lookless controls usage patterns(LooklessControl与UserControl的比较. ...
- LAMP配置与应用
LAMP配置与应用 1.1 动态资源和语言 WEB 资源类型: 静态资源:原始形式与响应内容一致,在客户端浏览器执行 动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端 ...
- 【本博客所有关于git文章迭代汇总】git操作(暂存,回退,绑定远程等),看这一篇就够了
1.git常用操作 git 小白操作,无非是clone,然后拉取,提交分支,第一次clone的时候,关联远程分支可能会遇到问题,可以看第四条git关联远程分支 # 在当前目录新建一个Git代码库 $ ...
- Redis常用命令-实战篇
目录 写在前面 连接操作命令 持久化 远程服务控制 对value操作的命令 操作字符串String命令 List Set Hash 写在前面 java 操作 redis 太常见了,基本上有需要的系统, ...
- [Python急救站课程]汇率转换程序
汇率转换程序 i = input("请输入金额用"¥"或"$"结束:") if i[-1] in ['¥']: C = (eval(i[0: ...