Python OpenCV -- Canny 边缘检测 (十一)

2024-09-01 05:38

本文主要是介绍Python OpenCV -- Canny 边缘检测 (十一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Canny 边缘检测

原理

  Canny 边缘检测算法 是 John F. Canny 于 1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的 最优算法, 最优边缘检测的三个主要评价标准是:

  低错误率: 标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。
  高定位性: 标识出的边缘要与图像中的实际边缘尽可能接近。
  最小响应: 图像中的边缘只能标识一次。


步骤

 1. 消除噪声。 使用高斯平滑滤波器卷积降噪。 下面显示了一个 size = 5 的高斯内核示例:

                                                K = \dfrac{1}{159}\begin{bmatrix}          2 & 4 & 5 & 4 & 2 \\          4 & 9 & 12 & 9 & 4 \\          5 & 12 & 15 & 12 & 5 \\          4 & 9 & 12 & 9 & 4 \\          2 & 4 & 5 & 4 & 2                  \end{bmatrix}

 2.计算梯度幅值和方向。 此处,按照Sobel滤波器的步骤:

   a. 运用一对卷积阵列 (分别作用于 x 和 y 方向):

                                                            G_{x} = \begin{bmatrix}-1 & 0 & +1  \\-2 & 0 & +2  \\-1 & 0 & +1\end{bmatrix}G_{y} = \begin{bmatrix}-1 & -2 & -1  \\0 & 0 & 0  \\+1 & +2 & +1\end{bmatrix}

   b.使用下列公式计算梯度幅值和方向:

                                                              \begin{array}{l}G = \sqrt{ G_{x}^{2} + G_{y}^{2} } \\\theta = \arctan(\dfrac{ G_{y} }{ G_{x} })\end{array}

        梯度方向近似到四个可能角度之一(一般 0, 45, 90, 135)

 

  3. 非极大值 抑制。 这一步排除非边缘像素, 仅仅保留了一些细线条(候选边缘)。

  4.滞后阈值: 最后一步,Canny 使用了滞后阈值,滞后阈值需要两个阈值(高阈值和低阈值):

     a. 如果某一像素位置的幅值超过 高 阈值, 该像素被保留为边缘像素。
     b. 如果某一像素位置的幅值小于 低 阈值, 该像素被排除。
     c. 如果某一像素位置的幅值在两个阈值之间,该像素仅仅在连接到一个高于 高 阈值的像素时被保留。
     

    Canny 推荐的 高:低 阈值比在 2:1 到3:1之间。


使用

OpenCV Python  中 Canny 函数原型

edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]]) 

edge  --  函数返回 一副二值图(黑白),其中包含检测出来的边缘

image --   需要处理的原图像,该图像必须为单通道的灰度图
threshold1  --  阈值1

threshold2  --  阈值2


  threshold2  是较大的阈值,用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用较小的 threshold1  

(第一个阈值)用于将这些间断的边缘连接起来。


apertureSize  --  Sobel 算子的大小。

L2gradient   --  一个布尔值,如果为 True ,刚使用更精确的 L2 范数进行计算(即两个方向的倒数的平方和再开放), False 将使用L1 范数(直接将两个方向导数

的绝对值相加)。


示例1(静态检测)

#!/usr/bin/env python  
# encoding: utf-8  
import cv2  
import numpy as np img = cv2.imread("2.jpg", 0)  #Canny只能处理灰度图,所以将读取的图像转成灰度图img = cv2.GaussianBlur(img,(3,3),0) #高斯平滑处理原图像降噪 
canny = cv2.Canny(img, 50, 150)     #apertureSize默认为3cv2.imshow('Canny', canny)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

效果图:



示例2(动态检测)

#!/usr/bin/env python  
# encoding: utf-8  
import cv2  
import numpy as np def CannyThreshold(lowThreshold):  detected_edges = cv2.GaussianBlur(gray,(3,3),0)  detected_edges = cv2.Canny(detected_edges,lowThreshold,lowThreshold*ratio,apertureSize = kernel_size)  dst = cv2.bitwise_and(img,img,mask = detected_edges)  # just add some colours to edges from original image.  cv2.imshow('canny demo',dst)  lowThreshold = 0  
max_lowThreshold = 100  
ratio = 3  
kernel_size = 3  img = cv2.imread('2.jpg')  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  cv2.namedWindow('canny demo')  cv2.createTrackbar('Min threshold','canny demo',lowThreshold, max_lowThreshold, CannyThreshold)  CannyThreshold(0)  # initialization  
if cv2.waitKey(0) == 27:  cv2.destroyAllWindows()  







参考和转载:

 程序使用的是 sunny2038 的,最后那个链接就是他的博客

http://wiki.opencv.org.cn/index.php/Canny%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html

http://blog.csdn.net/sunny2038/article/details/9202641

这篇关于Python OpenCV -- Canny 边缘检测 (十一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1126091

相关文章

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地