OpenCV半小时掌握基本操作之圆圈检测
作者:我是小白呀 发布时间:2022-09-17 08:07:50
标签:OpenCV,圆圈检测,python
【OpenCV】⚠️高手勿入! 半小时学会基本操作 ⚠️ 圆圈检测
概述
OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界.
霍夫圆变换
霍夫圆变换 (Hough Circle Transform) 的原理和霍夫直线变换类似. 对于一条直线, 我们可以用参数 (r, θ) 表示, 对于圆我们需要三个参数 (x, y, r), 分别代表三个参数 x 圆心, y 圆心, r, 半径.
代码实现
因为霍夫圆检测对噪声比较敏感, 所以首先要对图像做中值滤波.
基于效率考虑, Opencv 中实现的霍夫变换圆检测是基于图像梯度实现, 分为两步:
检测变换, 发现可能的圆心基于第一步的基础上从候选圆心开始计算最佳半径大小
格式:
cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)
参数:
image: 输入图像
method: 判别方法, 只有 HOUGH_GRADIENT (计算梯度) 一个方法
dp: 累计阈值
minDist: 间距, 小于间距判断成一个圆
param1: Canny 边缘检测的最大阈值
param2: 在检测阶段圆心累加器阈值, 是否为圆形
例一
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 读取图片
image = cv2.imread("map.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=50, param2=100, 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)
输出结果:
例二
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 读取图片
image = cv2.imread("coin.jpg")
image_copy = image.copy()
# 均值迁移滤波
filter = cv2.pyrMeanShiftFiltering(image, 10, 40)
# 转换成灰度图
filter_gray = cv2.cvtColor(filter, cv2.COLOR_BGR2GRAY)
# 霍夫曼圆圈检测
circles = cv2.HoughCircles(filter_gray, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=100, 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("coin_result.jpg", image_copy)
输出结果:
来源:https://blog.csdn.net/weixin_46274168/article/details/119341229
0
投稿
猜你喜欢
- <%on error resume nextdim conn,sql,rsset conn=Server.CreateObject(&
- Tracert 命令跟踪路由原理是IP路由每经过一个路由节点TTL值会减一,假设TTL值=0时数据包还没有到达目标主机,那么该路由则会回复给
- 启动sql server Net Start MSSqlServer 暂停sql server Net Pause MSSqlServer
- 怎样才能将在表A取得的数据插入另一个表B中?(1)对于表A和表B两个表结构完全相同的话〔字段个数,相应字段的类型等等〕,可以使用 inser
- 了解如何 在sublime编辑器中安装python软件包,以 实现自动完成等功能,并在sublime编辑器本身中运行build。安装Subl
- 很多时候,用户可能会因为承受不了某一产品中的细节设计而放弃使用该产品,这无疑是让设计人员感很沮丧的事情,因为除去这个细节的问题外,这个产品可
- 最近学习了一点python,那就试着做一做简单的编程练习。 首先是这个编程的指导图,如下:对的,类似一个简单区块链的模拟。 代码如下:cla
- asp之家注:如果你学习过asp,并且在网络公司上过班,一定会接触到网购系统,网购系统可以说是一个典型的程序类型,而其中最重要,也是最关键的
- 有时候我们可能需要import另一个路径下的python文件,例如下面这个目录结构,我们想要在_train.py里import在networ
- 声明,本文中所称CSS雪碧即为CSS Sprites,这个词组一直没有一个固定或者约定俗成的中文翻译,一些人开始称之为CSS雪碧,我们且当作
- 地图服务是指可以提供数据信息的接口,比如说本地搜索/路线规划等,下面小编给大家整理下百度地图API之本地搜索和范围搜索,具体请看下文。地图服
- Qt Designer的介绍在PyQt中编写UI界面可以直接通过代码来实现,也可以通过Qt Designer来完成。Qt Designer的
- 先来看个例子:需求为生成4位数,不足前面补0<?php //生成4位数,不足前面补0 $var=sprintf
- 常用目标检测模型基本都是读取的PASCAL VOC格式的标签,下面代码用于生成VOC格式的代码,根据需要修改即可:from lxml imp
- wlile循环while True表示永远为真,不管是什么条件都会向下执行,下面是写的一个例子。#!/usr/bin/env pythona
- 刚接触 Go 语言时,就听说有一个叫rune的数据类型,即使查阅过一些资料,对它的理解依旧比较模糊,加之对陌生事物的天然排斥,在之后很长一段
- 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 它包括两个类:Pattern和Ma
- insert into testtable(recordnumber,currentdate) values (i,sysdate); pr
- Python 基础教程之包和类的用法建立一个文件夹filePackage 在filePackage 文件夹内创建 __init__.py 有
- pandas DataFrame是二维的,所以,它既有列索引,又有行索引上一篇里只介绍了列索引:import pandas as pddf