OpenCV入门(十九)快速学会OpenCV 18 圆环检测

这篇具有很好参考价值的文章主要介绍了OpenCV入门(十九)快速学会OpenCV 18 圆环检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:Xiou

1.霍夫圆环变换概述

霍夫变换除了用来检测直线外,也能用来检测其他几何对象。实际上,只要是能够用一个参数方程表示的对象,都适合用霍夫变换来检测。用霍夫圆变换来检测图像中的圆,与使用霍夫直线变换检测直线的原理类似。

在霍夫圆变换中,需要考虑圆半径和圆心(x坐标、y坐标)共3个参数。在OpenCV中,采用的策略是两轮筛选。第1轮筛选找出可能存在圆的位置(圆心);第2轮再根据第1轮的结果筛选出半径大小。

与用来决定是否接受直线的两个参数“接受直线的最小长度(minLineLength)”和“接受直线时允许的最大像素点间距(MaxLineGap)”类似,霍夫圆变换也有几个用于决定是否接受圆的参数:圆心间的最小距离、圆的最小半径、圆的最大半径。

在OpenCV中,实现霍夫圆变换的是函数cv2.HoughCircles(),该函数将Canny边缘检测和霍夫变换结合。其语法格式为:

        circles=cv2.HoughCircles(image,
        method,
        dp,
        minDist,
        param1,
        param2,
        minRadius,
        maxRadius)

● image:输入图像,即源图像,类型为8位的单通道灰度图像。
● method:检测方法。截止到OpenCV 4.0.0-pre版本,HOUGH_GRADIENT是唯一可用的参数值。该参数代表的是霍夫圆检测中两轮检测所使用的方法。
● dp:累计器分辨率,它是一个分割比率,用来指定图像分辨率与圆心累加器分辨率的比例。例如,如果dp=1,则输入图像和累加器具有相同的分辨率。
● minDist:圆心间的最小间距。该值被作为阈值使用,如果存在圆心间距离小于该值的多个圆,则仅有一个会被检测出来。因此,如果该值太小,则会有多个临近的圆被检测出来;如果该值太大,则可能会在检测时漏掉一些圆。
● param1:该参数是缺省的,在缺省时默认值为100。它对应的是Canny边缘检测器的高阈值(低阈值是高阈值的二分之一)。
● param2:圆心位置必须收到的投票数。只有在第1轮筛选过程中,投票数超过该值的圆,才有资格进入第2轮的筛选。因此,该值越大,检测到的圆越少;该值越小,检测到的圆越多。这个参数是缺省的,在缺省时具有默认值100。
● minRadius:圆半径的最小值,小于该值的圆不会被检测出来。该参数是缺省的,在缺省时具有默认值0,此时该参数不起作用。
● maxRadius:圆半径的最大值,大于该值的圆不会被检测出来。该参数是缺省的,在缺省时具有默认值0,此时该参数不起作用。
● circles:返回值,由圆心坐标和半径构成的numpy.ndarray。

2.代码实现

霍夫圆变换 (Hough Circle Transform) 的原理和霍夫直线变换类似. 对于一条直线, 我们可以用参数 (r, θ) 表示, 对于圆我们需要三个参数 (x, y, r), 分别代表三个参数 x 圆心, y 圆心, r, 半径。

因为霍夫圆检测对噪声比较敏感, 所以首先要对图像做中值滤波。

基于效率考虑, Opencv 中实现的霍夫变换圆检测是基于图像梯度实现, 分为两步:

1.检测变换, 发现可能的圆心;
2.基于第一步的基础上从候选圆心开始计算最佳半径大小。

代码一:

import numpy as np
import cv2

# 读取图片
image = cv2.imread("aodi.jpg")
image_gray=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image_gray=cv2.medianBlur(image_gray,5)

# 均值迁移滤波
#filter = cv2.pyrMeanShiftFiltering(image, 10, 100)

# 转换成灰度图
#filter_gray = cv2.cvtColor(filter, cv2.COLOR_BGR2GRAY)

# 霍夫曼圆圈检测
circles = cv2.HoughCircles(image_gray, cv2.HOUGH_GRADIENT, 1, 120, param1=100, param2=30, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))

# 遍历
for circle in circles[0, :]:
    cv2.circle(image, (circle[0], circle[1]), circle[2], (0, 0, 255), 2)
    cv2.circle(image, (circle[0], circle[1]), 2, (255, 0, 0), 2)
cv2.imwrite('img_circles.jpg', image)
cv2.imshow('HoughCircles', image)
cv2.waitKey()
cv2.destoryALLWindows()


输出结果:

opencv检测圆,OpenCV,opencv,计算机视觉,人工智能

代码二:

import numpy as np
import cv2
from matplotlib import pyplot as plt

# 读取图片
image = cv2.imread("aodi.jpg")
image_copy = image.copy()

# 均值迁移滤波
filter = cv2.pyrMeanShiftFiltering(image, 10, 100)

# 转换成灰度图
filter_gray = cv2.cvtColor(filter, cv2.COLOR_BGR2GRAY)

# 霍夫曼圆圈检测
circles = cv2.HoughCircles(filter_gray, cv2.HOUGH_GRADIENT, 1, 20, param1=100, param2=50, minRadius=0, maxRadius=0)
circles = np.uint16(np.around(circles))

# 遍历
for circle in circles[0, :]:
    cv2.circle(image_copy, (circle[0], circle[1]), circle[2], (0, 0, 255), 2)
    cv2.circle(image_copy, (circle[0], circle[1]), 2, (255, 0, 0), 2)

# 图片展示
f, ax = plt.subplots(2, 2, figsize=(12, 12))

# 子图
ax[0, 0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
ax[0, 1].imshow(cv2.cvtColor(filter, cv2.COLOR_BGR2RGB))
ax[1, 0].imshow(filter_gray, "gray")
ax[1, 1].imshow(cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB))

# 标题
ax[0, 0].set_title("original")
ax[0, 1].set_title("image filter")
ax[1, 0].set_title("image gray")
ax[1, 1].set_title("image circle")

plt.show()

# 保存结果
cv2.imwrite("map_result.jpg", image_copy)

输出结果:

opencv检测圆,OpenCV,opencv,计算机视觉,人工智能
opencv检测圆,OpenCV,opencv,计算机视觉,人工智能文章来源地址https://www.toymoban.com/news/detail-598848.html

到了这里,关于OpenCV入门(十九)快速学会OpenCV 18 圆环检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV快速入门:目标检测——轮廓检测、轮廓的距、点集拟合和二维码检测

    在当今数字化时代,计算机视觉的崛起使得目标检测成为科技领域中的一项关键技术。本文将带您快速入门OpenCV中的目标检测,深入探讨轮廓检测、轮廓的距、点集拟合以及二维码检测等核心概念。 OpenCV,作为一种强大的开源计算机视觉库,为开发者提供了丰富的工具和算法

    2024年01月16日
    浏览(41)
  • 【OpenCV】第十九章: 视频操作入门

    第十九章: 视频操作入门 一段视频是由很多张静态图片组成的,很多个静态图像组成一段视频。 一个静态图像我们称为一帧,每一帧都是一张静止图像。帧可以以固定的时间间隔从视频中提取,然后对其使用图像处理的方法进行处理,就达到了处理视频的目的。 帧数指每秒

    2024年02月03日
    浏览(37)
  • OpenCV-Python实战(14)——人脸检测详解(仅需6行代码学会4种人脸检测方法)

    人脸处理是人工智能中的一个热门话题,人脸处理可以使用计算机视觉算法从人脸中自动提取大量信息,例如身份、意图和情感。人脸在视觉交流中起着重要作用,这是由于人脸中包含大量非语言信息,因此人脸处理一直以来对于计算机视觉学习者来说都是非常有趣的话题,

    2024年02月06日
    浏览(83)
  • 数字图像处理(实践篇)二十九 OpenCV-Python在图像中检测矩形、正方形和三角形的实践

    目录 1 方案 2 实践 1 方案 ①检测矩形和正方形 ⒈检测图像中的所有轮廓。 ⒉循环检查所有检测到的轮廓。 ⒊为每个轮廓找到近似的轮廓。如果近似轮廓中的顶点数为4,则计算 宽高比 用来区分 矩形 和 正方形 。如果宽高比在0.9到1.1之间,则认为为正方形,否则的话,则为

    2024年01月25日
    浏览(38)
  • OpenCV官方教程中文版 —— Hough 圆环变换

    目标 • 学习使用霍夫变换在图像中找圆形(环) • 学习函数:cv2.HoughCircles() opencv_logo.png :

    2024年02月06日
    浏览(31)
  • 快速通过pycharm搭建python+opencv实现人脸检测

      首先导入opencv 1代码实现效果,在界面下显示所要显示的图片 在同一目录下存放显示的图片 img = cv.imread(\\\'face1.jpg\\\')函数字符串变量填写存放照片的名字 为了让人眼看到照片所以使用cv.waitKey(0),起到delay的作用 2代码实现效果对图片进行灰度转换 灰度转换可以让计算机更轻易对

    2024年02月16日
    浏览(25)
  • OpenCV快速入门:窗口交互

    OpenCV是一种强大的计算机视觉库,广泛用于图像处理和计算机视觉应用。本文将介绍OpenCV中的窗口交互功能,重点关注鼠标和键盘的操作,以及如何添加窗口控件来实现更丰富的用户体验。 OpenCV提供了丰富的鼠标交互功能,包括但不限于: 获取鼠标的坐标位置 监听鼠标点击

    2024年02月04日
    浏览(30)
  • opencv快速入门【python]

    1.读入图像 使用cv2.imread()读取图像 2.显示图像 使用函数 cv2.imshow() 显示图像。 3.保存图像 使用函数cv2.imwrite()来保存函数 学习目标: 掌握用opencv绘制出不同几何图形 熟练应用如下函数:cv2.line(),cv2.circle(),cv2.rectangle() ,cv2.ellipse() ,cv2.putText() 等。 绘出几何图形的第一步就

    2024年02月02日
    浏览(27)
  • 快速入门opencv(python版)

    Open Source Computer Vision Library。OpenCV是一个(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法

    2024年02月04日
    浏览(30)
  • OpenCv快速入门(python版)

    OpenCV是一个(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 在学习过程中遇到问题最好

    2024年02月14日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包