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 迁…

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

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

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能够从图像或视频中快速准确地识别和提取车辆的关键信息,如车辆型号、品牌、颜色等。对于开发者而言,…

【深度学习】最强算法之:人工神经网络(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二、原因及解…

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

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

路由引入实验(思科)

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

抽样方法你真的懂么?

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

精通C++ STL(二):string类的模拟实现

目录 string类各函数接口总览 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载函数 析构函数 迭代器相关函数 begin和end 容量和大小相关函数 size和capacity reserve和resize empty 修改字符串相关函数 push_back append operator insert erase clear swap c_str 访…

跨平台之用VisualStudio开发APK嵌入OpenCV(一)

序 本篇是杂谈以及准备工作(此处应无掌声) 暂时不管iOS(因为开发hello world都要年费) 软件: Visual Studio 2019(含Android SDK和NDK编译器等) OpenCV 这是一个女仆级的系列文章&#xf…

探索数据结构:单链表的实践和应用

🔑🔑博客主页:阿客不是客 🍓🍓系列专栏:渐入佳境之数据结构与算法 欢迎来到泊舟小课堂 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 ​ 一、前言 前面我们学习了数据结构中的顺序表&…

扭蛋机小程序开发,数字化发展对行业带来的优势

随着科技的不断进步和大众对娱乐消费需求的提高,线上扭蛋机得到了快速发展,市场规模不断扩大。线上扭蛋机是基于淘宝的小程序,它以电商的模式让消费者进行虚拟扭蛋,获得各类商品,扭蛋机小程序中的商品包括玩具、IP周边…

线段(线性dp)

题目链接:[TJOI2007] 线段 - 洛谷 思路: f[i][0]表示走完第i行且停在第i行的左端点最少用的步数 f[i][1]同理,停在右端点的最少步数。 那么转移就很简单了,走完当前行且停到左端点,那么一定是从右端点过来的&#x…

算法课程笔记——高斯消元

算法课程笔记——高斯消元 先乘后除&#xff0c;精度 #include<bist/stdc.h>usingnamespacestd; #definemaxn 2800intn,m,x,ans; bitset<N>a[N]; voidgauss(){ intcnt0; for(inti1;i<n;i){ intmaxxcnt1; for(intji1;j<n;j){ …