CV12 Canny边缘检测原理

简介: 高级卷积核。Sobel算子是高斯平滑加微分运算的联合运算,因此它更抗噪声。可以指定要采用的导数方向,垂直或水平(分别通过参数yorder和xorder)。还可以通过参数ksize指定内核的大小。如果ksize = -1 ,则使用3x3 Scharr滤波器,比3x3 Sobel滤波器具有更好的结果。

国内Python库的镜像网站


清华https://pypi.tuna.tsinghua.edu.cn/simple

阿里云:http://mirrors.aliyun.com/pypi/simple/

中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

华中理工大学:http://pypi.hustunique.com/

山东理工大学:http://pypi.sdutlinux.org/

豆瓣:http://pypi.douban.com/simple/

边缘检测原理


实现图像的边缘检测,就是要用离散化梯度逼近函数根据二维灰度矩阵梯度向量来寻找图像灰度矩阵的灰度跃变位置,然后在图像中将这些位置的点连起来就构成了所谓的图像边缘(图像边缘在这里是一个统称,包括了二维图像上的边缘、角点、纹理等基元图)


图像梯度


Sobel 和 Scharr 算子


高级卷积核。Sobel算子是高斯平滑加微分运算的联合运算,因此它更抗噪声。可以指定要采用的导数方向,垂直或水平(分别通过参数yorder和xorder)。还可以通过参数ksize指定内核的大小。如果ksize = -1 ,则使用3x3 Scharr滤波器,比3x3 Sobel滤波器具有更好的结果。


边缘检测具体步骤


1.滤波:边缘检测的算法主要是基于图像强度的一阶导数和二阶导数。OpenCV提供了许多边缘搜索滤波器(包括Laplacian,Sobel和Scharr),这些滤波器将非边缘的区域变为黑色,将边缘区域变为白色,但它们容易把噪点误认为边缘。所以为了消除噪点对我们边缘检测的效果,我们需要对图像进行滤波。


2.增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在具体编程实现时,可通过计算梯度幅值来确定


3.检测:经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定的应用中,这些点并不是我们要找的边缘点,所以应该采用某种方法来对这些点进行取舍。实际工程中,常用的方法是通过阈值化方法来检测。


基于Canny的边缘检测


.1.高斯滤波去除图像噪声


 CV10 图像模糊(均值、高斯、中值、双边滤波)


.2.计算梯度


用一阶偏导的有限差分来计算梯度的幅值和方向


理论先让我求教大佬之后再贴上去了,这部分我都看睡着了。。。😴😴😴


.3.在边缘上应用非极大值抑制


图像梯度幅值矩阵的元素值越大,说明图像中该点的梯度越大。但不能说明这个点是边缘点。在Canny算法中,我们 要进行非极大值抑制,寻找像素点局部点的最大值,将非极大值点对应的灰度值置为0,从而达到剔除大部分非边缘 的点


7ae4fc2c1f5869aff909f80f36facce4.png


梯度方向垂直于边缘方向。


假设在梯度方向上有A、B、C三个像素点的梯度值,我们可以比较A/B/C的大小,找出最大梯度值的点(上图假设为 A),其余灰度值都置0,这样我们就可以得到一个白点。


多次在梯度方向上寻找比较,找出多个点,并连线,最后得到的结果是带有“细边”的二进制图像


.4.将双阈值应用于所有检测到的边缘,淘汰所有假正例结果


(最小阈值(threshold1)最大阈值(threshold2))


.5.分析所有边缘及其之间的连接,保留真正的边缘,并丢弃弱边缘

高阈值先把边缘链接成轮廓,当达到轮廓的端点时,该算法会自动寻找满足低阈值的点,再根据此点收集新的边缘, 直至整个图像闭合


找到Canny边缘后,我们可以对边缘进行轮廓检测。


cv2.Canny()函数


功能:Canny边缘检测


输入参数:


1.图像名(img)

2.最小阈值(threshold1)

3.最大阈值(threshold2)


注意:最大阈值用来检测图像中较明显的边缘,但其检测的边缘是断断续续的,所以这时候用最小阈值将这些断断续续的边缘连接起来


参考资料:Canny边缘检测算法原理及其VC实现详解(一)


程序代码


import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('love.jpg',0)
img = cv2.Canny(img,700,800)
cv2.imshow("canny",img)
cv2.waitKey()
cv2.destroyAllWindows()


效果图


3c1a2365f05cb1a886018909593facdf.png


39bf37a2847d114e169069d98c8f2c34.png

相关文章
|
算法 Python
随机生成迷宫-深度优先搜索算法
在计算机科学中,迷宫生成是一个经典的问题,广泛应用于游戏设计、路径规划等领域。本文将介绍一种常见的迷宫生成算法——深度优先搜索算法(Depth-First Search, DFS),通过随机选择路径进行探索和回溯,最终生成一个随机且有趣的迷宫。
1424 1
|
Dubbo Java 应用服务中间件
项目中引进这玩意,排查日志又快又准
随着微服务盛行,很多公司都把系统按照业务边界拆成了很多微服务,在排错查日志的时候,因为业务链路贯穿着很多微服务节点,导致定位某个请求的日志以及上下游业务的日志会变得有些困难。
|
存储 运维 安全
阿里云发布SaaS数据本地化服务,助力企业跨国扩展与合规
阿里云SaaS数据本地化服务(Alibaba Cloud InCountry Service,简称ACIS) 由阿里云和 InCountry合作推出,为使用海外SaaS或者应用的企业客户提供了一种将受管制数据在境内存储和处理,以实现合规的SaaS服务。
2052 0
阿里云发布SaaS数据本地化服务,助力企业跨国扩展与合规
|
算法 Shell 测试技术
Monkey 常用命令详解含高级参数应用
Monkey 常用命令详解含高级参数应用
Monkey 常用命令详解含高级参数应用
|
8月前
|
人工智能 自然语言处理 安全
氛围编程陷阱:为什么AI生成代码正在制造大量"伪开发者"
AI兴起催生“氛围编程”——用自然语言生成代码,看似高效实则陷阱。它让人跳过编程基本功,沦为只会提示、不懂原理的“中间商”。真实案例显示,此类项目易崩溃、难维护,安全漏洞频出。AI是技能倍增器,非替代品;真正强大的开发者,永远是那些基础扎实、能独立解决问题的人。
998 12
氛围编程陷阱:为什么AI生成代码正在制造大量"伪开发者"
|
3月前
|
人工智能 前端开发 架构师
从 MVP 到千万级并发:AI 在前后端开发中的差异化落地指南
本文探讨AI在前后端开发中的差异化应用:后端因逻辑确定、验证闭环短,AI可高效生成高质代码并自动测试修复;前端受主观审美、交互复杂等制约,AI生成代码需大量人工精修。文章基于DAU分层(低/中/高)提供实证策略与代码对比,并给出AI介入决策矩阵,助力团队科学落地AI辅助开发。(239字)
449 1
从 MVP 到千万级并发:AI 在前后端开发中的差异化落地指南
|
7月前
|
Java 编译器 API
告别样板代码:探索Java Record的简洁之力
告别样板代码:探索Java Record的简洁之力
300 113
|
6月前
|
人工智能 边缘计算 算法
教学机器人技术深度解析与主流产品选型指南
教育机器人正从“电子教具”迈向“认知伙伴”,深度融入教学、科研、心理辅导等场景。依托神经符号融合引擎、多模态感知、边缘计算等核心技术,实现精准答疑、情感交互与数据安全。猎户星空、优必选、科大讯飞、大疆等企业各具优势,推动教育智能化向纵深发展。(238字)
|
6月前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中描述对象间消息传递时间顺序的交互图。横轴为对象,纵轴为时间,通过生命线、控制焦点和消息等元素,直观展现系统动态协作过程,强调交互的时间顺序与并发行为,常用于分析和设计系统逻辑。
|
存储 SQL 分布式计算
19章构建企业级大数据平台:从架构设计到数据治理的完整链路
开源社区: 贡献者路径:从提交Issue到成为Committer 会议演讲:通过DataWorks Summit提升影响力 标准制定: 白皮书撰写:通过DAMA数据治理框架认证 专利布局:通过架构设计专利构建技术壁垒