当前位置: 首页 > news >正文

opencv-python 霍夫变换圆形检测:HoughCircles

文章目录

    • 简介
    • 代码
    • HoughCircles函数说明

简介

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

在这里插入图片描述

其中,【gray】是经过均值滤波的灰度图,其目的是将目标边缘凸显出来;【edge】是通过Canny边缘检测得到的灰度图像的边缘;【circles】即原始图像和检测到的圆形的叠加图。

代码

其实现代码如下。

import matplotlib.pyplot as plt
import numpy as np
import cv2 as cvpath = 'coins.png'imgs = {}
img = cv.imread(path, cv.IMREAD_COLOR)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)imgs['gray'] = cv.medianBlur(gray, 25)
imgs['edge'] = cv.Canny(imgs['gray'],100,200)rows = gray.shape[0]
circles = cv.HoughCircles(imgs['gray'], cv.HOUGH_GRADIENT,1, rows / 8, param1=100, param2=30,minRadius=1, maxRadius=300)

其中,【circles】就是检测到的圆形参数,其实质是由 x , y , r x,y,r x,y,r组成的三元组的列表。

接下来是绘图,在circles子图中,先绘制了原始图像,然后根据圆形的参数方程 x = r cos ⁡ θ , y = r sin ⁡ θ x=r\cos\theta, y = r\sin\theta x=rcosθ,y=rsinθ,来描绘出圆形的边缘。

imgs['circles'] = img
for i,key in enumerate(imgs,1):ax = plt.subplot(1,3,i)plt.title(key)plt.imshow(imgs[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()

HoughCircles函数说明

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

函数参数说明:

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

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

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

相关文章:

  • 行为型-观察者模式
  • 《ElementPlus 与 ElementUI 差异集合》el-input 和 el-button 属性 size 有变化
  • pxe安装mini centos系统
  • Android studio 性能调试
  • java8特性 stream流中map函数的使用
  • 【Emgu CV教程】9.5、形态学常用操作之形态学梯度
  • 算法笔记之蓝桥杯pat系统备考(2)
  • 基于SpringBoot+Druid实现多数据源:注解+编程式
  • 已解决org.apache.zookeeper.KeeperException.BadVersionException异常的正确解冲方法,亲测有效!!!
  • 数据结构:堆
  • CSS中三栏布局的实现
  • Linux搭建我的世界(MC)整合包服务器,All the Mods 9(ATM9)整合包开服教程
  • 让数据在业务间高效流转,镜舟科技与NineData完成产品兼容互认
  • 2.1HTML5基本结构
  • 设置浏览器显示小于12px以下字体
  • web蓝桥杯真题:成语学习
  • 外包干了5天,技术明显退步。。。。。
  • Vue:自定义消息通知组件
  • 2023 收入最高的十大编程语言
  • Github 2024-03-11 开源项目周报 Top15
  • 【DAY10 软考中级备考笔记】数据结构 图
  • java-ssm-jsp基于java的餐厅点餐系统的设计与实现
  • 蓝桥杯(1):python排序
  • SpringMVC请求、响应和拦截器的使用
  • 基于springboot+layui仓库管理系统设计和实现
  • 【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0+微信小程序+云平台
  • [抽象]工厂模式([Abstract] Factory)——创建型模式
  • QT网络编程之实现UDP广播发送和接收
  • SSL VPN基础原理
  • 深入理解FTP协议:文件传输的桥梁