Python OpenCV基于霍夫圈变换算法检测图像中的圆形

目录
  • 第一章:霍夫变换检测圆
    • ① 实例演示1
    • ② 实例演示2
    • ③ 霍夫变换函数解析
  • 第二章:Python + opencv 完整检测代码
    • ① 源代码
    • ② 运行效果图

第一章:霍夫变换检测圆

① 实例演示1

这个是设定半径范围 0-50 后的效果。

② 实例演示2

这个是设定半径范围 50-70 后的效果,因为原图稍微大一点,半径也大了一些。

③ 霍夫变换函数解析

cv.HoughCircles() 方法

参数分别为:image、method、dp、minDist、param1、param2、minRadius、maxRadius

其中:

  • image 为灰度图像;
  • method 使用的方法为霍夫梯度法,目前已知的有 HOUGH_GRADIENT 和 HOUGH_GRADIENT_ALT 两种,后者的准确率会更高一点;
  • dp 为累加器分辨率与图片分辨率的反比。
  • minDist 为两个圆中心的最小距离;
  • param1 对于 CV_HOUGH_GRADIENT 表示传入 canny 边缘检测的阈值;
  • param2 对于 CV_HOUGH_GRADIENT 表示检测阶段圆心的累加阈值,值越小能检测出的圆越多,值越大的话就检测出来的少,但是检测出来的圆形相比于没检测出来的会更圆、更完美一些;
  • minRadius 为最小半径;
  • minRadius 为最大半径;

首先通过均值偏移滤波降噪来排除干扰的点,提高识别的准确率,然后进行灰度处理。

# 均值偏移滤波降噪处理
mean_filter_img = cv.pyrMeanShiftFiltering(image, 10, 100)
cv.imshow("mean_filter_img", mean_filter_img)

# 图像灰度处理
gray_img = cv.cvtColor(mean_filter_img, cv.COLOR_BGR2GRAY)

# 霍夫圈变换
# 参数分别为:image, method, dp, minDist, param1, param2, minRadius, maxRadius
# 其中:image为灰度图像,method使用的方法为霍夫梯度法,minDist两个圆中心的最小距离
circles = cv.HoughCircles(gray_img, cv.HOUGH_GRADIENT, 1, 30, param1=50, param2=30, minRadius=0, maxRadius=50)

第二章:Python + opencv 完整检测代码

① 源代码

# -*- coding:utf-8 -*-
# 2021-12-17
# 作者:小蓝枣
# opencv圆形检测

import cv2 as cv
import numpy as np

def detect_circle(image):
    '''
     作用:圆形检测
     参数:需要检测圆的图片
     返回:检测出圆形的信息
    '''
    # 均值偏移滤波降噪处理
    mean_filter_img = cv.pyrMeanShiftFiltering(image, 10, 100)
    cv.imshow("mean_filter_img", mean_filter_img)

    # 图像灰度处理
    gray_img = cv.cvtColor(mean_filter_img, cv.COLOR_BGR2GRAY)

    # 霍夫圈变换
    # 参数分别为:image, method, dp, minDist, param1, param2, minRadius, maxRadius
    # 其中:image为灰度图像,method使用的方法为霍夫梯度法,minDist两个圆中心的最小距离
    circles = cv.HoughCircles(gray_img, cv.HOUGH_GRADIENT, 1, 30, param1=50, param2=30, minRadius=0, maxRadius=50)

    # 对数据进行取整
    print("取整前信息:" + str(circles))
    circles = np.uint16(np.around(circles))
    print("取整后信息:" + str(circles))

    return circles

def draw_circle(img, circles):
    '''
     作用:根据圆形信息在图片中绘制圆
     参数1:原始图片信息
     参数2:圆形坐标信息
     返回:无
    '''
    for i in circles[0, :]:
        # 绘制圆外圈
        # 参数分别为:圆心、半径、颜色、线框宽度
        cv.circle(img, (i[0], i[1]), i[2], (0, 0, 255), 2)
        # 绘制圆心
        cv.circle(img, (i[0], i[1]), 2, (255, 0, 0), 2)
    cv.imshow("draw_circle_img", img)

# 读取图片信息
img = cv.imread("./image/meixi.jpg")

# 设置窗口不可改变大小(参数包含:WINDOW_AUTOSIZE、WINDOW_NORMAL、WINDOW_OPENGL)
cv.namedWindow("original image", cv.WINDOW_AUTOSIZE)
cv.imshow("original image", img)

# 检测圆
circles = detect_circle(img)
#绘制圆
draw_circle(img, circles)

cv.waitKey(0)
cv.destroyAllWindows()

② 运行效果图

原始图片:

降噪后效果:

霍夫变换检测圆处理后效果:

取整后效果图:

到此这篇关于Python OpenCV基于霍夫圈变换算法检测图像中的圆形的文章就介绍到这了,更多相关OpenCV霍夫圈变换算法检测圆形内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python 计算机视觉编程进阶之OpenCV 进行霍夫变换

    目录 前言 (1)读取图像信息 (2)霍夫变换的目的及应用 1. 霍夫变换 2. 霍夫线变换 (1)基本概念 (2)代码实现 3. 霍夫圆变换 (1)基本概念 (2)代码实现 4. 将所有图像绘制到一张图中 5. 总体代码 结束语 参考的一些文章以及论文我都会给大家分享出来 -- 链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就等等,可能正在审核,审核完后就可以下载了.大家一起学习,一起进步!加油!! 前言 (1)读取图像信息 经典操作,不必多说: "&

  • 如何基于OpenCV&Python实现霍夫变换圆形检测

    简述 基于python使用opencv实现在一张图片中检测出圆形,并且根据坐标和半径标记出圆.不涉及理论,只讲应用. 霍夫变换检测圆形的原理 其实检测圆形和检测直线的原理差别不大,只不过直线是在二维空间,因为y=kx+b,只有k和b两个自由度.而圆形的一般性方程表示为(x-a)²+(y-b)²=r².那么就有三个自由度圆心坐标a,b,和半径r.这就意味着需要更多的计算量,而OpenCV中提供的cvHoughCircle()函数里面可以设定半径r的取值范围,相当于有一个先验设定,在每一个r来说,在

  • 详解利用python+opencv识别图片中的圆形(霍夫变换)

    在图片中识别足球 先补充下霍夫圆变换的几个参数知识: dp,用来检测圆心的累加器图像的分辨率于输入图像之比的倒数,且此参数允许创建一个比输入图像分辨率低的累加器.上述文字不好理解的话,来看例子吧.例如,如果dp= 1时,累加器和输入图像具有相同的分辨率.如果dp=2,累加器便有输入图像一半那么大的宽度和高度. minDist,为霍夫变换检测到的圆的圆心之间的最小距离,即让我们的算法能明显区分的两个不同圆之间的最小距离.这个参数如果太小的话,多个相邻的圆可能被错误地检测成了一个重合的圆.反之,这个

  • python+opencv实现霍夫变换检测直线

    本文实例为大家分享了python+opencv实现霍夫变换检测直线的具体代码,供大家参考,具体内容如下 python+opencv实现高斯平滑滤波 python+opencv实现阈值分割 功能: 创建一个滑动条来控制检测直线的长度阈值,即大于该阈值的检测出来,小于该阈值的忽略 注意:这里用的函数是HoughLinesP而不是HoughLines,因为HoughLinesP直接给出了直线的断点,在画出线段的时候可以偷懒 代码: # -*- coding: utf-8 -*- import cv2

  • Python OpenCV基于霍夫圈变换算法检测图像中的圆形

    目录 第一章:霍夫变换检测圆 ① 实例演示1 ② 实例演示2 ③ 霍夫变换函数解析 第二章:Python + opencv 完整检测代码 ① 源代码 ② 运行效果图 第一章:霍夫变换检测圆 ① 实例演示1 这个是设定半径范围 0-50 后的效果. ② 实例演示2 这个是设定半径范围 50-70 后的效果,因为原图稍微大一点,半径也大了一些. ③ 霍夫变换函数解析 cv.HoughCircles() 方法 参数分别为:image.method.dp.minDist.param1.param2.mi

  • python 用opencv实现霍夫线变换

    霍夫变换是一种检测任何形状的流行技术,可以检测形状,即使它被破坏或扭曲一点点. 一条线可以表示成y = mx + c或参数形式,像ρ=xcosθ+ysinθ,其中ρ是从原点到直线的垂直距离,θ角是由这条垂线和水平轴以逆时针的方向形成的(这个方向取决于你如何表示坐标系统,这种表示法在OpenCV中使用) OpenCV中的Hough变换 cv.HoughLines() 第一个参数,输入图像应该是一个二值图像,因此在应用hough变换之前应用阈值或使用Canny边缘检测. 第二和第三个参数分别是ρ和θ

  • Android基于OpenCV实现霍夫直线检测

    目录 霍夫直线检测 点和线的对偶性 极坐标参数方程 API 操作 效果 霍夫直线检测 点和线的对偶性 图像空间中的点,对应霍夫空间中的直线 图像空间中的直线,对应霍夫空间中的点 共点的直线,在霍夫空间中对应的点在一条直线上 共线的点,在霍夫空间中对应的直线交于一点 极坐标参数方程 对于平面中的一条直线,在笛卡尔坐标中,常见的有点斜式,两点式两种表示方法.然而在霍夫变换中,考虑的是另外一种表示方式:使用(r, theta)来表示一条直线.其中r为该直线到原点的距离,theta为该直线的垂线与x轴的

  • Python数字图像处理之霍夫线变换实现详解

    在图片处理中,霍夫变换主要是用来检测图片中的几何形状,包括直线.圆.椭圆等. 在skimage中,霍夫变换是放在tranform模块内,本篇主要讲解霍夫线变换. 对于平面中的一条直线,在笛卡尔坐标系中,可用y=mx+b来表示,其中m为斜率,b为截距.但是如果直线是一条垂直线,则m为无穷大,所有通常我们在另一坐标系中表示直线,即极坐标系下的r=xcos(theta)+ysin(theta).即可用(r,theta)来表示一条直线.其中r为该直线到原点的距离,theta为该直线的垂线与x轴的夹角.如

  • Python实现基于标记的分水岭分割算法

    目录 1. 原理 2.代码实现 2.1 利用OpenCV和c++实现分水岭算法 2.2 Python实现分水岭分割(1) 2.3 Python实现分水岭分割(2) 分水岭技术是一种众所周知的分割算法,特别适用于提取图片中的相邻或重叠对象.使用分水岭方法时,我们必须从用户定义的标记开始.这些标记可以使用点击手动定义,也可以使用阈值或形态学处理方法定义. 分水岭技术将输入图像中的像素视为基于这些标记的局部极小值(称为地形)——该方法从标记向外“淹没”山谷,直到各种标记的山谷相遇.为了产生准确的分水岭

  • Python Opencv基于透视变换的图像矫正

    本文实例为大家分享了Python Opencv基于透视变换的图像矫正,供大家参考,具体内容如下 一.自动获取图像顶点变换(获取图像轮廓顶点矫正) 图像旋转校正思路如下 1.以灰度图读入2.腐蚀膨胀,闭合等操作3.二值化图像4.获取图像顶点5.透视矫正 #(基于透视的图像矫正) import cv2 import math import numpy as np def Img_Outline(input_dir):     original_img = cv2.imread(input_dir)

  • Python OpenCV 基于图像边缘提取的轮廓发现函数

    基础知识铺垫 在图像中,轮廓可以简单的理解为连接具有相同颜色的所有连续点(边界)的曲线,轮廓可用于形状分析和对象检测.识别等领域. 轮廓发现的原理:先通过阈值分割提取目标物体,再通过边缘检测提取目标物体轮廓. 一个轮廓就是一系列的点(像素),这些点构成了一个有序的点集合. 使用 cv2.findContours 函数可以用来检测图像的边缘. 函数原型说明 contours, hierarchy = cv2.findContours(image, mode, method[, contours[,

  • python用opencv将标注提取画框到对应的图像中

    目录 前言 相应的思路 读取前缀列表 找出json结构中对应框坐标位置,画出对应的框 前言 问题需求: 拥有两个文件夹,一个保存图片image,一个保存标签文件,要求把标签文件中的标注提取出来,并在图片中画出来 相应的思路 首先提出各个文件的路径: 然后将解析json文件,将其中的标注文件提取,并将对应的图像读取在图像上将对应的框画出来:由于图像以及标签的文件前缀都是一样的,所以只要一个前缀列表提取出来,然后将图像的路径与其进行拼接(图像路径+前缀+.jpeg)就可以读取对应的图像,而写入的图像

  • C#使用OpenCV剪切图像中的圆形和矩形的示例代码

    前言 本文主要介绍如何使用OpenCV剪切图像中的圆形和矩形. 准备工作 首先创建一个Wpf项目--WpfOpenCV,这里版本使用Framework4.7.2. 然后使用Nuget搜索[Emgu.CV],如下图. 这里的Emgu.CV选择4.3.0.3890版本,然后安装Emgu.CV和Emgu.CV.runtime.windows. 使用OPenCV剪切矩形 现在,我们进入项目,进行OPenCV的调用. 首先引入命名空间,如下: using Emgu.CV; using Emgu.CV.Cv

  • 使用OpenCV检测图像中的矩形

    本文实例为大家分享了OpenCV检测图像中矩形的具体代码,供大家参考,具体内容如下 前言 1.OpenCV没有内置的矩形检测的函数,如果想检测矩形,要自己去实现. 2.我这里使用的OpenCV版本是3.30. 矩形检测 1.得到原始图像之后,代码处理的步骤是: (1)滤波增强边缘. (2)分离图像通道,并检测边缘. (3) 提取轮廓. (4)使用图像轮廓点进行多边形拟合. (5)计算轮廓面积并得到矩形4个顶点. (6)求轮廓边缘之间角度的最大余弦. (7)画出矩形. 2.代码 //检测矩形 //

随机推荐