OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)

简介: OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)

需要源码和图片请点赞关注收藏后评论区留言私信~~~

一、Canny边缘检测

Canny边缘检测算法是一个多级边缘检测算法,该算法根据像素梯度变化寻找图像边缘,最终可以绘制十分精细的二值边缘图像

opencv将canny边缘检测算法封装在canny方法中 语法如下

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

image 检测的原始图像

threshold1 计算过程中使用的第一个阈值 通常用来设置最小阈值

threshold2 第二个阈值 通常用来设置最大阈值

apertureSize 可选参数 Sobel算子的孔径大小

edges 计算后得出的边缘图像 是一个二值灰度图像

下面使用Canny算法检测花朵边缘

不同最小和最大阈值显示的效果不一样

部分代码如下

import cv2
img = cv2.imread("flower.png")  # 读取原图
r1 = cv2.Canny(img, 10, 50);  # 使用不同的阈值进行边缘检测
r2 = cv2.Canny(img, 100, 200);
r3 = cv2.Canny(img, 400, 600);
cv2.imshow("img", img)  # 显示原图
cv2.imshow("r1", r1)  # 显示边缘检测结果
cv2.imshow("r2", r2)
cv2.imshow("r3", r3)
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

二、霍夫变换

霍夫变换是一种特征检测,通过算法识别图像的特征,从而判断图像中的特殊形状

1:直线检测

霍夫直线变换是通过霍夫坐标系的直线与笛卡尔坐标系的点之间的映射关系来判断图像中的点是否构成直线。opencv将此封装成两个方法,分别是HoughLines和HoughLinesP,前者用来检测无限延长的线段,后者用于检测线段 下面介绍后者

该方法只能检测二值灰度图像,也就是只有两种像素值的黑白像素,该方法最后把找出的所有线段的两个端点坐标保存成一个数组 语法如下

lines=cv2.HoughLinesP(image,rho,theta,threshold,minLineLength,maxLineGap)

rho 检测直线使用的半径步长 值为1表示检测所有可能的半径步长

theta 搜索直线的角度

threshole 阈值 该值越小 检测出的直线就越多

minLineLength 线段的最小长度 小于该长度的线段不记录到结果中

下面检测笔图像中出现的直线

部分代码如下

import cv2
import numpy as np
img = cvimread("pen.jpg")  # 读取原图
o = img.copy()  # 复制原图
o = cv2.mianBlur(o, 5)  # 使用中值滤波进行降噪
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)  # 从彩色图像变成单通道灰度图像
binary = c.Canny(o, 50, 150)  # 绘制边缘图像
# 检线,精度为1,全角度,阈值为15,线段最短100,最小间隔为18
lines = cv2.HoughLinesP(binary, 1, np.pi / 180, 15, minLineLength=100, maxLineGap=18)
for line in lines:  # 遍历所有直线
    x1, , x2, y2 = line[0]  # 读取直线两个端点的坐标
    cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)  # 在原始图像上绘制直线
cv2.imshow("canny", binary)  # 显示二值化边缘图案
cv2.imsw("img", img)  # 显示绘制结果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

2:圆环检测

霍夫变换的原理与霍夫直线类似,opencv提供的HoughCircles方法用于检测图像中的圆环,该方法 在检测过程中进行两轮筛选,第一轮筛选找出可能是圆的圆心坐标,第二轮筛选计算这些圆心坐标可能对应的半径长度,该方法最后将圆心坐标和半径封装成一个浮点型数组

下面检测硬币图像中出现的圆环

可见检测结果十分精确

部分代码如下

import cv2
import numpy as np
img = cv2.imread("coin.jpg")  # 读取原图
o = img.copy()  # 复制原图
o = cv2.medianBlur(o, 5)  # 使用中值滤波进行降噪
gr = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)  # 从彩色图像变成单通道灰度图像
# 检测圆环,圆心最小间距为70,Canny最大阈值为100,投票数超过25。最小半径为10,最大半径为50
circles cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 70, param1=100, param2=25, madius=10, maxRadius=50)
circles = np.uint(np.around(circles))  # 将数组元素四舍五入成整数
for c in circles[0]:  # 遍历圆环结果
    x, y, r = c  # 圆心横坐标、纵坐标和圆半径
    cv2.rcle(img, (x, y), r, (0, 0, 255), 3)  # 绘制圆环
    cv2.circle(img, (x, y), 2, (0, 0, 255), 3)  # 绘制圆心
cv2.imshimg", img)  # 显示绘制结果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

三、总结

图像轮廓指的是将图像的边缘连接起来形成的一个整体,它是图像的一个重要的特征信息,通过对图像的轮廓进行操作,能够得到这幅图像的大小、位置和方向等信息,用于后续的计算。为此,OpenCV提供了findContours()方法,通过计算图像的梯度,判断图像的轮廓。为了绘制图像的轮廓,OpenCV又提供了drawContours()方法。但需要注意的是,Canny()方法虽然能够检测出图像的边缘,但这个边缘是不连续的

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
6天前
|
数据库 Python
Python 应用
Python 应用。
25 4
|
15天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
59 6
|
16天前
|
数据采集 数据安全/隐私保护 开发者
非阻塞 I/O:异步编程提升 Python 应用速度
非阻塞 I/O:异步编程提升 Python 应用速度
|
6天前
|
机器学习/深度学习 数据采集 数据可视化
Python在数据科学中的应用:从入门到实践
本文旨在为读者提供一个Python在数据科学领域应用的全面概览。我们将从Python的基础语法开始,逐步深入到数据处理、分析和可视化的高级技术。文章不仅涵盖了Python中常用的数据科学库,如NumPy、Pandas和Matplotlib,还探讨了机器学习库Scikit-learn的使用。通过实际案例分析,本文将展示如何利用Python进行数据清洗、特征工程、模型训练和结果评估。此外,我们还将探讨Python在大数据处理中的应用,以及如何通过集成学习和深度学习技术来提升数据分析的准确性和效率。
|
8天前
|
机器学习/深度学习 JSON API
Python编程实战:构建一个简单的天气预报应用
Python编程实战:构建一个简单的天气预报应用
19 1
|
16天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
59 7
|
16天前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
39 4
|
3天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
3天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
3天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!