Python+Opencv实现无参数、全自动的Canny算法
目录
- 一、什么是Canny边缘检测算法?
- 二、最优边缘准则是什么?
- 三、Canny算法实现步骤
- 四、Canny算法在使用中的问题?
- 五、无参数、自动化Canny算法代码实现
- 六、改进算法效果展示
- 七、问题探讨
- 参考资料
- 注意事项
一、什么是Canny边缘检测算法?
Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论(Computational theory of edge detection)解释这项技术如何工作。
通常情况下边缘检测的目的是在保留原有图像属性的情况下,显著减少图像的数据规模。目前有多种算法可以进行边缘检测,虽然Canny算法年代久远,但可以说它是边缘检测的一种标准算法,而且仍在研究中广泛使用。其效果如下图所示:
二、最优边缘准则是什么?
- 最优检测:算法能够尽可能多地标识出图像中的实际边缘,漏检真实边缘的概率和误检非边缘的概率都尽可能小;
- 最优定位准则:检测到的边缘点的位置距离实际边缘点的位置最近,或者是由于噪声影响引起检测出的边缘偏离物体的真实边缘的程度最小;
- 检测点与边缘点一一对应:算子检测的边缘点与实际边缘点应该是一一对应。为了满足这些要求 Canny 使用了变分法(calculus of variations),这是一种寻找优化特定功能的函数的方法。最优检测使用四个指数函数项表示,但是它非常近似于高斯函数的一阶导数
三、Canny算法实现步骤
- 应用高斯滤波来平滑图像,目的是去除噪声;
- 计算图像的强度梯度(intensity gradients);
- 应用非最大抑制(non-maximum suppression)技术来消除边误检(本来不是但检测出来是);
- 应用双阈值的方法来决定可能的(潜在的)边界;
- 利用滞后技术来跟踪边界。
具体的实现细节可以查看该链接。
四、Canny算法在使用中的问题?
Canny算法的检测效果很好,得到了广泛的应用。它经常出现在一些算法的预处理阶段,除此之外,很多计算机视觉库中都集成了Canny算,代表性的包括Opencv,cv2.canny(image, lower, upper)是Opencv中的Canny算法的调用接口。**但是大家在调用的过程中都会遇到一个难题-lower和upper参数如何来设置呢?**很多人采取的方法是减少范围不断的去尝试直到找到一个合适的阈值,但是这种方法费时费力,而且鲁棒性较差。**你经常会发现,这个参数适用于这张图片但是当你输入另外一张图片时效果就不好啦!**本文的主要目的就是来解决这个问题的!
五、无参数、自动化Canny算法代码实现
# -*- coding: utf-8 -*-
# 导入一些python包
import numpy as np
import argparse
import glob
import cv2
import os# 定义auto_canny函数
def auto_canny(image, sigma=0.33):# 计算单通道像素强度的中位数v = np.median(image)# 选择合适的lower和upper值,然后应用它们lower = int(max(0, (1.0 - sigma) * v))upper = int(min(255, (1.0 + sigma) * v))edged = cv2.Canny(image, lower, upper)return edged# 设置一些需要修改的参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--images", required=True, help="path to input dataset of images")
args = vars(ap.parse_args())# 创建可视化文件夹
file_dir = "vis/"
if not os.path.isdir(file_dir):os.makedirs(file_dir)# 遍历文件夹中的每一张图片
i = 0
img_names = glob.glob(args["images"] + "/*.jpg")
for imagePath in img_names:# 读取图片image = cv2.imread(imagePath)# 灰度化处理gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行高斯模糊去噪blurred = cv2.GaussianBlur(gray, (3, 3), 0)# 分别使用宽阈值、窄阈值和自动确定的阈值进行测试wide = cv2.Canny(blurred, 10, 200)tight = cv2.Canny(blurred, 225, 250)auto = auto_canny(blurred)result = np.hstack([wide, tight, auto])i += 1save_name = "vis/" + str(i) + ".png"# 显示并保存结果cv2.imshow("Original", image)cv2.imshow("Edges", result)cv2.imwrite(save_name, result)cv2.waitKey(0)
运行方法- python auto_canny.py --image 测试文件夹名称
六、改进算法效果展示
上图展示了该算法在多个测试图片上面的检测效果,第1列表示的是原始的输入图片;第2列表示使用宽阈值后的检测效果;第3列表示使用窄阈值后的检测效果;第4列表示使用自适用阈值后的检测效果。我们可以发现,自动阈值的检测效果在宽阈值和窄阈值之间,整体的效果基本满足我们的要求,但是它带来的好处是我们不在需要进行调参工作,哈哈哈。
七、问题探讨
其实本文的思路很简单,主要是应用图片中的统计信息,使用这些统计数据来消除手动调整阈值以进行Canny边缘检测。这个技巧可以节省你的时间参数调整-而且在应用这个功能之后你仍然可以得到一个很好的canny边缘图。具体的实现如下所示:
def auto_canny(image, sigma=0.33):# 计算单通道像素强度的中位数v = np.median(image)# 选择合适的lower和upper值,然后应用它们lower = int(max(0, (1.0 - sigma) * v))upper = int(min(255, (1.0 + sigma) * v))edged = cv2.Canny(image, lower, upper)return edged
参考资料
1、参考链接1
2、参考链接2
注意事项
[1] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家的关注。
[2] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[3] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[4] 本文测试的图片可以通过该链接进行下载。测试图片链接- 提取码:igzo
[5] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊!!!
Python+Opencv实现无参数、全自动的Canny算法相关推荐
- Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示
Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示 第一章:霍夫变换检测圆 ① 实例演示1 ② 实例演示2 ③ 霍夫变换函数解析 第二章:Python + openc ...
- Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection)
Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection) 理论 Feature Detection using FAST Select ...
- 【OpenCV 4开发详解】Canny算法
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- python opencv cv2.rectangle 参数含义
因为做程序图像剪切一直不太明白是怎么切片的,这里就用 cv2.rectangle 这个函数来看一下 opencv 是怎么计量图像的坐标轴的. cv2.rectangle 这个函数的作用是在图像上绘制一 ...
- python中编写无参数decorator
Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数. 使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写 f = de ...
- 【Qt】调用Python函数:无参数、单个参数、多个参数、数组参数
一.链接配置 如果缺少头文件需要安装python3-dev: sudo apt-get install python3-dev 链接libpython3.4库,添加头文件路径,以Qt为例: INCLU ...
- Python+OpenCv 标定相机参数的实现
文章目录 一.制作标定板 二.提取标定板的世界坐标 三.张正友标定相机 (一)原理描述 (二)相机内参数 (三)单应矩阵 (四)内参约束条件 (五)求解内参数 (六)最大似然估计 (七)消除径向畸变 ...
- Python OpenCV学习笔记之:使用Grabcut算法进行图像背景和前景分割
为什么80%的码农都做不了架构师?>>> # -*- coding: utf-8 -*- """ 图像分割 """i ...
- 【Python | opencv+PIL】常见操作(创建、添加帧、绘图、读取等)的效率对比及其优化
一.背景 本人准备用python做图像和视频编辑的操作,却发现opencv和PIL的效率并不是很理想,并且同样的需求有多种不同的写法并有着不同的效率.见全网并无较完整的效率对比文档,遂决定自己丰衣足食 ...
最新文章
- JavaScript 消息框
- The prefix “mvc“ for element “mvc:annotation-driven“ is not bound 异常
- 『mcse 2008基础架构』Chapter 01 IP协议及配置方法 第1课网络连接及配置方法
- find IBASE structure - CRM_IBASE_COMP_FIND_MULTI - IBSP, IBIB
- 【Linux/Ubuntu学习6】unbuntu 下载android源码
- C#LeetCode刷题之#203-删除链表中的节点(Remove Linked List Elements)
- toString和valueOf使得对象访问时显示一个特定格式的字符串,但是可以进行数字运算...
- 1000并发的系统服务器配置,1000人并发服务器配置
- 关于解压软件和压缩软件
- VSCode解决中文乱码问题
- Android仿微信朋友圈10s视频编辑
- 软件-浏览器-GoogleChrome:Google Chrome
- 计算机专业学习目标计划怎么写,制定计算机学习计划范文3篇
- 墨卡托经纬度坐标转换
- linux清华源地址,pip清华镜像源使用方法总结
- deepin 服务器_深度官方并没有提供Deepin服务器版下载,也没有开发计划
- 华为模拟器dhcp中继
- KSO-docker命令大全,基于Linux服务器CentOS7.5 安装docker
- 【程序猿保健】ShaderJoy —— 拉力带教程
- html5网页综合案例制作,网页开发与制作 HTML5页面元素及属性 2-21综合案例(6页)-原创力文档...