【Opencv实战】高手勿入,Python使用Opencv+Canny实现边缘检测以及轮廓检测(详细步骤+源码分享)

news2024/11/22 22:23:19

前言

 有温度 有深度 有广度 就等你来关注哦~

所有文章完整的素材+源码都在👇👇

粉丝白嫖源码福利,请移步至CSDN社区或文末公众hao即可免费。

在这次的案例实战中,我们将使用Python 3和OpenCV。我们将使用OpenCV,因为它是一个

著名的开源计算机视觉库,其中提供了许多处理图像和视频的功能。在本次案例中,我们将使

用OpenCV、Canny来进行边缘检测与轮廓检测。

——边缘检测Canny

边缘检测器是一种被广泛使用的算法,并被认为是边缘检测最优的算法,该方法使用了比高斯

差分算法更复杂的技巧,如多向灰度梯度和滞后阈值化。

小科普就先到这里了撒!下面我们正式开始今天的案例吧。

​正文

下面文章开始前进行详细的介绍吧!

一、什么是边缘检测?

边缘检测是计算机视觉中一个非常古老的问题,它涉及到检测图像中的边缘来确定目标的边

界,从而分离感兴趣的目标。最流行的边缘检测技术之一是Canny边缘检测,它已经成为大多

数计算机视觉研究人员和实践者的首选方法。让我们快速看一下Canny边缘检测。

二、Canny边缘检测算法

1983年,John Canny在麻省理工学院发明了Canny边缘检测。它将边缘检测视为一个信号处

理问题。其核心思想是,如果你观察图像中每个像素的强度变化,它在边缘的时候非常高。

在下面这张简单的图片中,强度变化只发生在边界上。所以,你可以很容易地通过观察像素强

度的变化来识别边缘。

现在,看下这张图片。强度不是恒定的,但强度的变化率在边缘处最高。(微积分复习:变化率可以用一阶导数(梯度)来计算。)

Canny边缘检测器通过4步来识别边缘:

1.去噪:因为这种方法依赖于强度的突然变化,如果图像有很多随机噪声,那么会将噪声作为

边缘。所以,使用5×5的高斯滤波器平滑你的图像是一个非常好的主意。

2.梯度计算:下一步,我们计算图像中每个像素的强度的梯度(强度变化率)。我们也计算梯度的

方向。

梯度方向垂直于边缘,它被映射到四个方向中的一个(水平、垂直和两个对角线方向)。

3.非极大值抑制:现在,我们想删除不是边缘的像素(设置它们的值为0)。你可能会说,我们可

以简单地选取梯度值最高的像素,这些就是我们的边。然而,在真实的图像中,梯度不是简单

地在只一个像素处达到峰值,而是在临近边缘的像素处都非常高。因此我们在梯度方向上取

3×3附近的局部最大值。

4.迟滞阈值化:在下一步中,我们需要决定一个梯度的阈值,低于这个阈值所有的像素都将被

抑制(设置为0)。而Canny边缘检测器则采用迟滞阈值法。迟滞阈值法是一种非常简单而有效的

方法。我们使用两个阈值来代替只用一个阈值:

高阈值 = 选择一个非常高的值,这样任何梯度值高于这个值的像素都肯定是一个边缘。

低阈值 = 选择一个非常低的值,任何梯度值低于该值的像素绝对不是边缘。

在这两个阈值之间有梯度的像素会被检查,如果它们和边缘相连,就会留下,否则就会去掉。

三、案例思考

1)Canny边缘检测器算法基本步骤:
 

平滑图像:通过使用合适的模糊半径执行高斯模糊来减少图像内的噪声。

计算图像的梯度:这里计算图像的梯度,并将梯度分类为垂直、水平和斜对角。这一步的输出用于在下一步中计算真正的边缘。

非最大值抑制:利用上一步计算出来的梯度方向,检测某一像素在梯度的正方向和负方向上是否是局部最大值,如果是,则抑制该像素(像素不属于边缘)。这是一种边缘细化技术,用最急剧的变换选出边缘点。

用滞后阈值化选择边缘:最后一步,检查某一条边缘是否明显到足以作为最终输出,最后去除所有不明显的边缘。

2)环境配置 

运行环境: Python 3 、Pycharm、cv2。其他内置模块,安装好python环境就可以了。

 如果需要安装第三方库的话✅下面可以找我拿资料的哈! 

(win + R 输入cmd 输入安装命令 pip install 模块名 (如果你觉得安 装速度比较慢, 你可 以切 换国内镜像源)

第三方库的安装: +python安装包 安装教程视频 anaconda5.2.0等等

安装包 +pycharm 社区版 专业版 及 激活码免费 (可以找我免费领取的)

pip install + 模块名 或者 带镜像源 pip install -i pypi.douban.com/simple/ +模块名

四、代码展示

1)Canny函数的原型为:

轮廓检测;轮廓检测主要由cv2.findContours函数实现的。

函数的原型为函数参数:

第一个参数是寻找轮廓的图像;

第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):cv2.RETR_EXTERNAL表示只检测外轮廓。

cv2.RETR_LIST检测的轮廓不建立等级关系。

cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。cv2.RETR_TREE建立一个等级树结构的轮廓。

第三个参数:method为轮廓的逼近方法cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1。 cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。 cv2.CHAIN_APPROX_TC89_L1和cv2.CHAIN_APPROX_TC89_KCOS都是使用teh-Chinl chain近似算法。 返回值 如:image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) image:是原图像 contours:图像的轮廓,以列表的形式表示,每个元素都是图像中的一个轮廓。 

hier:相应轮廓之间的关系。这是一个ndarray,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

2)主程序

import cv2

import numpy as np

img = cv2.imread("hammer.jpg", 0)

cv2.imwrite("canny.jpg", cv2.Canny(img, 200, 300))

cv2.imshow("canny", cv2.imread("canny.jpg"))

cv2.waitKey()

cv2.destroyAllWindows()

五、效果展示

1)原图——

2)运行效果图一

3)效果运行图二

4)效果运行图三

5)效果运行图四

6)效果运行图五

六、Canny 边缘检测的问题

由于Canny边缘检测器只关注局部变化,没有语义(理解图像的内容)理解,精度有限(很多时候

是这样)。

Canny边缘检测器在这种情况下会失败,因为没有理解图像的上下文

语义理解对于边缘检测是至关重要的,这就是为什么使用机器学习或深度学习的基于学习的检

测器比canny边缘检测器产生更好的结果。

总结

好啦,本文写到这里就正式结束了哈!有想学习的小伙伴儿可以来找我一起学习哦~

✨完整的素材源码等:可以滴滴我吖!或者点击文末hao自取免费拿的哈~

 🔨推荐往期文章——

项目0.1【Opencv实战】素描,要画出感觉,比如像这样画:画啥啥都好看(建议保存)

项目0.2项目0.3 【Opencv实战】美颜模式,开启:美颜功能都这么强大了嘛?(群魔乱舞.jpg)

项目0.4 
【Opencv实战】刷爆朋友圈的特效“人物动漫化”是什么鬼?今天教你涨姿势—网友狂喜:我要学习,不许拦我

项目0.2【Opencv实战】废片变宝,怎样将照片调出烟雨油画的效果?试试这个特效,超赞

项目0.8  【超简单】利用Python去除图片水印,太神奇了叭,你还不会嘛?(附三种方法)

🎁文章汇总——

Python文章合集 | (入门到实战、游戏、Turtle、案例等)

(文章汇总还有更多你案例等你来学习啦~源码找我即可免费!) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷歌牛人发布小说式《算法图解》,竟被人扒下来,在GitHub开源了

今天给大家带来了一本算法方向的好书:巴尔加瓦(Aditya Bhargava)老师 著,袁国忠老师译的 《算法图解:像小说一样有趣的算法入门书》,网上有没有开源版本我不知道,我就看他内容不错所以推荐给大家…

蓄电池建模、分析与优化(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

[附源码]Python计算机毕业设计Django校园运动会管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

数据存储,详细讲解

✨数据存储,详细讲解💜数据类型的介绍:💙整形的内存存储大小端介绍:💛浮点数的存储💜数据类型的介绍: 1.内置类型: char //字符数据类型(1&#xff…

SpringBoot 之 AOP

前言: Spring 三大核心思想是啥,还记得不?IOC(控制反转),DI(依赖注入),AOP(面向切面编程)。回顾一下这三个东西: IOC:不考…

Dash初探:如何将Label和Dropdown放在一行

Use Dash! How to display html.Lable and dcc.Dropdown on the same line? 1、目标 下图展示了我想要实现的效果。 数据筛选部分包含了三个筛选条件:日期区间选择器;区域选择器;地市选择器。其中,地市选择器的取值和已选区域…

【1805. 字符串中不同整数的数目】

来源:力扣(LeetCode) 描述: 给你一个字符串 word ,该字符串由数字和小写英文字母组成。 请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34" 将会变成 " 123 34 8 34" 。注意…

[附源码]JAVA毕业设计砂石矿山管理系统(系统+LW)

[附源码]JAVA毕业设计砂石矿山管理系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术…

如何将Word转成PDF格式?这三种方法总有一个适合你

如何把Word文档转换成PDF文件格式呢?大家在传输文件的时候,相信很多小伙伴都喜欢不使用PDF文件格式,因为它非常的稳定,在浏览文件的时候格式不会乱,但我们都是先做好Word文档,然后再把它转成PDF格式&#x…

诗人贺伟陪你看世界杯

国内三大拥有转播权的主流平台(央视、中国移动咪咕和抖音)都已经公布了解说阵容 CCTV解说阵容 贺炜、刘嘉远、朱晓雨、曾侃、李晨明、孙思辰、邵圣懿。 此次央视世界杯采取了“单口”解说的模式,这多少还是会让球迷们感到错愕。以往的足球盛…

ubuntu+Docker双容器docker-compose部署Django+Vue项目(2-Django)

文章目录部署Django后端接口下载Python环境及一些尝试pip包管理运行项目容器报错1(查询容器IP解决)报错2(pvsite_uwsgi.ini文件配置socket还是http)报错3(用http先)用python manage.py runserver运行项目先报错4(下载cryptography库)回到用uwsgidjango运行成功先在uwsgidjango中…

FT2004(D2000)开发实战之PBF配置

一 PBF概述 PBF英文全称Phytium Base Firmware,PBF主要作用: 初始化PLL设置CPU主频初始化DDR4初始化PCIe控制器初始化全局中断和定时器跳转到U-boot 飞腾FT2004芯片BIOS固件由两部分构成,PBF+U-boot或者PBF+UEFI,最终的BIOS烧写⽂件由PBF固件包中的脚本程序⽣成,当然在生…

为什么消费返利模式层出不穷?这个消费返利玩法值得你借鉴

大家好,我是林工,不知道大家听说过消费返利没有?消费返利是互联网常见的一个商业模式,是指互联网平台将自己所销售的商品和服务让渡给消费者并获得一定比例的报酬,消费者通过平台享受到的佣金和消费总额(金…

正则表达式简介

一、介绍 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。 正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字…

观察|数字营销正当时,企业如何玩转短视频?

​​双十二购物狂欢节即将来临,从手机APP的开屏广告到线下随处可见的广告屏,铺天盖地的短视频成为各大品牌宣传造势的重头戏。凭借具有强烈视觉冲击力的画面和魔性的配音配乐,短视频已然超越传统图文广告,迅速成长为占领受众心智的…

Java数据结构与Java算法学习Day05---二叉树(简略笔记记录)

目录 一、二叉树 79 1.1树的基本定义79 1.2数的相关术语 80 1.3二叉树的基本定义 81 1.4二叉查找树的创建 82 1.4.1二叉树查找树创建---插入方法(put) 83 1.4.2二叉树查找树创建---获取方法(get)84 1.4.3二叉树查找树创建…

大数据学习:进程管理(2)

文章目录一、系统资源监控1、free命令2、uname命令3、uptime命令4、netstat命令5、vmstat命令二、任务管理1、前台进程2、后台进程3、操作案例一、系统资源监控 1、free命令 观察内存(memory)使用情况 2、uname命令 查阅系统与核心相关信息 3、up…

JavaEE技术点:MySQL目录及基本命令介绍

1.MySQL目录介绍 (1)首先来看MySQL的安装目录,如图1-1所示: 图1-1 MySQL的安装目录 (2)图1-1中的bin目录中存放的是二进制的可执行文件,如图1-2所示: 图1-2 bin目录结构 (3)图1-2中的mysqld.exe是服务器程序,必须先…

山东:推进自然资源确权登记 助力自然资源保护发展

2019年,自然资源统一确权登记工作启动以来,山东省认真贯彻生态文明思想,坚决扛牢政治责任,按照国家统一部署,担当作为、加压奋进,在探索推进自然资源确权登记法治化、规范化、标准化、信息化等方面取得了积…

用亚马逊自养号进行测评的好处

自养号顾名思义就是自己用真实环境养出来的买家账号。通过真实的邮箱、手机号码和注册地当地真实收货地址,包括IP等等,但是也有很多卖家没有完全认清自养号的好处,下面就看看用亚马逊自养号进行测评的好处 对于卖家来说,使用自养号…