python-opencv 边缘检测、直线检测、圆检测

文章目录

    • Canny算法
    • 霍夫变换-直线检测
    • 霍夫变换-圆形检测

Canny算法

除了将目标与背景分离开来,边缘检测也同样是一种图像分割方法,从分割结果来看,adaptiveThreshold函数显然就采取了类似边缘检测的划分方案。

Canny在1986年提出了一种边缘检测算法,因其卓越的性能和准确性而广泛应用于各种图像分析领域。opencv中提供了这种算法,其操作步骤如下

  1. 高斯滤波:采用 5 × 5 5\times5 5×5的高斯滤波,对图像进行平滑,以降低灰度波动,使边缘更加明显。
  2. 梯度计算:用Sobel核函数对图像滤波,得到两个方向的一阶导数 G x , G y G_x, G_y Gx,Gy,从而得到图像的梯度 G x 2 + G y 2 \sqrt{G_x^2+G_y^2} Gx2+Gy2 以及辐角 tan ⁡ − 1 G y G x \tan^{-1}\frac{G_y}{G_x} tan1GxGy
  3. 非极大值抑制:即抑制那些不是局部最大值的梯度值,即一个像素点,只有其梯度幅度大于周围像素点时,才被认为是边缘点。
  4. 双阈值处理:通过高阈值 t 2 t_2 t2和低阈值 t 1 t_1 t1来进一步判断边缘,某点若梯度幅度大于 t 2 t_2 t2,则被认为是边缘点;若处于 t 2 t_2 t2 t 1 t_1 t1之间,则被认为是潜在的边缘点。
  5. 边缘跟踪和连接:最后,算法跟踪由边缘像素点组成的线,并连接它们以形成完整的边缘。

t 1 = 100 , t 2 = 200 t_1=100,t_2=200 t1=100,t2=200,则Canny算法的边缘检测结果如下

在这里插入图片描述

实现代码如下。

imgs = {}
imgs['Original'] = ascent().astype(np.uint8)
imgs['edges'] = cv2.Canny(img,100,200)for i,key in enumerate(imgs, 1):plt.subplot(1,2,i)plt.imshow(imgs[key],cmap = 'gray')plt.title(key)plt.axis('off')plt.show()

【Canny】即为Canny边缘检测函数,其输入参数分别是待检测图像和阈值 t 1 , t 2 t_1, t_2 t1,t2

霍夫变换-直线检测

在获取图像边缘后,可能会对边缘的形状产生兴趣。1962年,Hough提出一种直线和圆的识别方案,思路是将图像中的点映射到一个参数空间,这个空间中涵盖了某个几何形状的所有参数,这个变换便被称作霍夫变换(Hough Transform, HT)。

Python中提供了基于HT的直线检测函数,可实现如下效果。

在这里插入图片描述

代码为

img = ascent().astype(np.uint8)
m, n = img.shapeedges = cv2.Canny(img, 50, 150, apertureSize = 3)
lines = cv2.HoughLines(edges,1.1,np.pi/180,200)

【HoughLines】就是HT直线检测函数,其输入的四个参数分别是待检测图像、以像素为单位的距离精度 p r p_r pr、以弧度为单位的角度精度 p θ p_\theta pθ以及累加平面的阈值参数。 p r , p θ p_r, p_\theta pr,pθ这两个值设得越大,则会检查出越多的直线。

其检测检测结果由 ( ρ , θ ) (\rho, \theta) (ρ,θ)来表示,其中 ρ \rho ρ表示直线与坐标原点 ( 0 , 0 ) (0,0) (0,0)的距离, θ \theta θ是直线的垂线与 x x x轴的夹角。从而直线方程可表示为点法式

x cos ⁡ θ + y sin ⁡ θ − ρ = 0 x\cos\theta+y\sin\theta-\rho=0 xcosθ+ysinθρ=0

对于尺寸为 m m m n n n列的图像来说,四个边框分别是 x = 0 , x = n , y = 0 , y = m x=0, x=n, y=0, y=m x=0,x=n,y=0,y=m,记 c = cos ⁡ θ , s = sin ⁡ θ c=\cos\theta, s=\sin\theta c=cosθ,s=sinθ,则直线与四个边框的交点分别为

( 0 , ρ s ) ( n , ρ − n c s ) ( ρ c , 0 ) ( ρ − m s c , m ) \begin{matrix} (0, \frac{\rho}{s})&(n, \frac{\rho-nc}{s})\\ (\frac{\rho}{c}, 0)&(\frac{\rho-ms}{c}, m)\\ \end{matrix} (0,sρ)(cρ,0)(n,sρnc)(cρms,m)

从而绘图代码如下

fig, ax = plt.subplots(1,2)ax[0].imshow(img, cmap='gray')
for line in lines:rho,theta = line[0]c = np.cos(theta)s = np.sin(theta)xs = [0, n, rho/c, (rho-m*s)/c]ys = [rho/s, (rho-n*c)/s, 0, m]i1, i2 = np.argsort(xs)[1:3]ax[0].plot([xs[i1], xs[i2]], [ys[i1], ys[i2]], ls='--')ax[1].plot([xs[i1], xs[i2]], [ys[i1], ys[i2]], ls='--')plt.grid()
plt.show()

霍夫变换-圆形检测

opencv中提供了基于霍夫变换的圆形检测方法,可实现下图所示的检测结果。

在这里插入图片描述

其实现代码如下。

path = 'coins.png'coins = {}
img = cv2.imread(path, cv2.IMREAD_COLOR)
gray = cv2.cv2tColor(img, cv2.COLOR_BGR2GRAY)coins['gray'] = cv2.medianBlur(gray, 25)
coins['edge'] = cv2.Canny(coins['gray'],100,200)rows = gray.shape[0]
circles = cv2.HoughCircles(coins['gray'], cv2.HOUGH_GRADIENT,1, 150, param1=100, param2=30,minRadius=1, maxRadius=300)

【HoughCircles】是opencv提供的基于霍夫变换的圆形检测工具。

函数参数说明:

  • image: 待检测灰度图像。
  • method: 检测圆的方法。
  • dp: 霍夫变换的分辨率,值越大,检测的圆越少,但越准确。
  • minDist: 圆心之间的最小距离。
  • param1: 边缘检测时使用Canny算子的高阈值,低阈值是高阈值的一半。
  • param2: 用于圆心检测的参数。
  • minRadius, maxRadius: 圆半径的最小值和最大值。

其中,opencv通提供了四种检测圆的方法,其method参数可选值如下

  • 【cv2.HOUGH_GRADIENT】霍夫梯度法,通过计算图像中的梯度来确定圆心的可能位置,然后对这些位置进行投票,以确定真实的圆心。这种方法的问题是对噪声敏感。
  • 【cv2.HOUGH_GRADIENT_ALT】霍夫梯度法的另一种实现。
  • 【cv2.HOUGH_PROBABILISTIC】概率霍夫变换,与霍夫梯度法的区别是,并不通过全局投票来确定圆心,而检查一些候选点是否符合圆的方程,它通常会产生较少的假阳性结果,但可能检测不到某些圆。
  • 【cv2.HOUGH_MULTI_SCALE】多尺度霍夫变换,将在不同尺度上应用霍夫变换,对缩放、旋转和倾斜变化具有更好的鲁棒性。和其他方法相比,该方法可能会检测到更多的圆,但也更吃计算资源。

绘图代码如下。

coins['circles'] = img
for i,key in enumerate(coins,1):ax = plt.subplot(1,3,i)plt.title(key)plt.imshow(coins[key])plt.axis('off')th = np.deg2rad(np.arange(361))
for x,y,r in circles[0]:xs = x + r*np.cos(th)ys = y + r*np.sin(th)plt.scatter(x, y, marker='*', color='red')plt.plot(xs, ys, color='red')plt.show()

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

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

相关文章

【源码】2024完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城

后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 前端UNIAPP 后端PHP 一键部署版本 获取方式: 微:uucodes

代码随想录算法训练营第四十一天|动态规划理论基础、509. 斐波那契数列、70. 爬楼梯、746. 使用最小花费爬楼梯

动态规划理论基础 什么是动态规划 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就…

X2Doris使用指南:界面化数据迁移工具 - 轻松实现整库迁移至Doris

什么是X2Doris X2Doris 是 SelectDB 团队开发的,专门用于将各种离线数据迁移到 Apache Doris 中的核心工具,该工具集 自动建 Doris 表 和 数据迁移 为一体,目前支持了 Apache Doris/Hive/Kudu/StarRocks 数据库往 Doris 或 SelectDB Cloud 迁…

Oracle AVDF(审计保险库和数据库防火墙)常见问题

此文是AVDF FAQ的翻译注解(斜体) 通用问题 审计库和数据库防火墙的最新版本是什么? Oracle Audit Vault 和 Database Firewall (AVDF) 的最新版本是版本更新 11 (AVDF 20.11)。请阅读公告博客和发行说明以了解更多详细信息。 Oracle Audit …

一屏万象,场景无限:蓝牙墨水屏标签多功能多场景应用带您领略未来

在数字化浪潮汹涌澎湃的今天,智能科技产品层出不穷,它们不仅极大地改变了我们的生活方式,更在无形中拓宽了我们的视野。而今,一款融合了创新技术与实用性于一体的蓝牙墨水屏标签,正以其多功能多场景应用的特性&#xf…

在GoDaddy网站托管上托管Next.js , npm项目步骤

要在GoDaddy网站托管上托管一个使用Next.js构建的npm项目,步骤: 1. 准备Next.js项目 确保Next.js项目已经准备好,并且可以在本地运行。可以使用以下命令来启动项目: npm install npm run build npm start2. 设置GoDaddy主机 登…

strstr的使⽤和模拟实现

strstr(function) Returnsa pointer to the irst occurrence of str2 in str1, or a null pointer if str2 is not part of str1. (函数返回字符串str2在字符串str1中第⼀次出现的位置)。 The matchingprocess doesnot include t…

无线麦克风什么品牌好?一文读懂无线领夹麦克风哪个品牌音质最好

​当我们谈论到演讲、表演或者录制视频时,一个高质量的无线麦克风能够使得整个体验提升至一个全新的水平。它不仅能够保证声音的清晰度和真实度,还能够让使用者在演讲或者表演时更加自信和舒适。基于对市场的深入研究和用户体验的考量,我挑选…

在微信公众号怎么添加留言板功能

在如今信息爆炸的时代,微信公众号已成为企业与用户互动的重要桥梁。如何在这个平台上脱颖而出,吸引用户的眼球,提升用户黏性,成为每一个公众号运营者都需要思考的问题。今天,我们就来聊聊如何在微信公众号中巧妙添加留…

车辆相关识别API优化您的车辆系统

车辆相关识别API是开发者们所需的重要工具,它们基于先进的计算机视觉和深度学习技术,提供了强大的车辆识别和分类能力。这些API能够从图像或视频中快速准确地识别和提取车辆的关键信息,如车辆型号、品牌、颜色等。对于开发者而言,…

1251. 平均售价

1251. 平均售价 题目链接:1251. 平均售价 代码如下: # Write your MySQL query statement below select p.product_id,round(ifnull(sum(units*price)/sum(units),0),2) as average_price from Prices as p left join UnitsSold as u on p.product_id…

机器学习:探索数据的魔法世界

课程链接:AI小天才:让你轻松掌握机器学习 引言: 在当今数字化的时代,数据无处不在,而机器学习则是解析、理解和利用这些数据的魔法钥匙。从自动驾驶到智能推荐系统,机器学习的应用无所不在,给我…

k8s问题

文章目录 本地搭K8s集群 bilibili什么是声明式API?kubectl apply Etcd数据库有什么特性,为什么K8S选用了Etcd数据库?K8S中一个node的生命周期是怎样的?服务发现机制介绍docker的实现原理介绍如果只是使用Linux命名空间进行分离&am…

【深度学习】最强算法之:人工神经网络(ANN)

人工神经网络ANN 1、引言2、人工神经网络(ANN)2.1 定义2.1.1 定义2.1.2 应用场景 2.2 核心原理2.3 实现方式2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝:鱼哥,看新闻没? 小鱼:新闻天天看,啥事大惊小怪的。 小屌…

Python数据分析-心脏病(随机森林预测分析)

本次案例分析用心脏病数据集来做随机森林模型预测 导入基本的数据分析包 import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score…

【Python】【报错解决】【无法安装socket库】No matching distribution found for socket

一、问题描述 如下图,笔者在做一个安全相关的项目时,遇到如下报错: No matching distribution found for socket 在尝试安装socket(套接字)库时报错,报错代码: pip install socket二、原因及解…

【信息论系列2】蜂窝通信得基本概念和信道容量等相关计算

基本概念 已经看到,为了确保完全的区域覆盖而没有死点,可以使用一系列正多边形。 出于经济原因,通常采用六边形(六边形的设计比正方形或三角形更有效)。基于简单几何,相邻六边形之间的中心到中心的距离 x x x由 3 R \sqrt{3}R

【Lexus.4】Executive Sedan——Dismantling Follow-up

文章目录 碰撞测试前后防撞钢梁偏置碰撞A/B/C柱,边梁抗拉、屈服强度 底盘发动机轮上马力零部件供应商 来自2021《懂车大爆炸》——是一档为汽车爱好者、购车者和对汽车结构感兴趣的人提供的专业、生动的教学视频。它通过全拆散的方式,让观众更直观地了解…

路由引入实验(思科)

华为设备参考:路由引入实验(华为) 技术简介 路由引入技术在网络通信中起着重要的作用,能够实现不同路由协议之间的路由传递,并在路由引入时部署路由控制,实现路径或策略的控制 实验目的 不同的路由协议之…

抽样方法你真的懂么?

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:抽样方法的魅力与挑战 二、有放回抽样与无放回抽样的比较 1. 有放回抽…