Python opencv进行圆形识别(圆检测)
Posted 老李的森林
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python opencv进行圆形识别(圆检测)相关的知识,希望对你有一定的参考价值。
圆形识别(圆检测)是图像识别中很常见的一种处理方式,最核心的是cv2.HoughCircles这个函数实现的圆形检测。当然还有一些其他的处理过程,以下详述:
1 读入图像
首先需要读取一个图像文件,将其作为一个变量
img = cv2.imread("save1.jpg", 0) # 0或者cv2.IMREAD_GRAYSCALE 读取为灰度图像
img2 = cv2.imread("save1.jpg", 1) # 1或者cv2.IMREAD_COLOR 读取为为彩色图像
img是一个ndarray,2维结构,包含的是灰度化后的图像信息
img2是一个ndarray,3维结构,包含的是RGB彩色图像信息,比img2多出一个色彩维度
如下图,img2是3个方括号“[”
2 图像预处理
可以对图像进行裁切,滤波等处理,当然不处理也可以直接用,以下展示一下:
裁切
size = 400
x1 = 560
y1 = 200
x2 = x1+size
y2 = y1+size
cut = img[y1:y2, x1:x2]
滤波加二值化
numpy_img = cv2.adaptiveThreshold(cut, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 15) # 自动阈值二值化
显示中间处理过程
有时候我们需要直观的看到中间处理过程的图像样貌,可以随时显示
cv2.imshow("img", img)
cv2.imshow("cut", cut)
cv2.imshow("numpy_img", numpy_img)
cv2.waitKey(0)
注意imshow函数,第一个参数是要显示的窗口的标题,不得用中文和中文标点,必须全英文,否则会乱码,第2个参数是待显示的图像变量
最后一行可以没有,如果有的话,程序会在此等待,直到有按键动作,程序才继续往后运行。这对我们调试比较有用。
3 圆形识别
# 圆心距 canny阈值 投票数 最小半径 最大半径
circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 170, param1=100, param2=60, minRadius=60, maxRadius=90)
大概讲一下重要的几个参数,参数与实际的图像尺寸相关,不是一个参数用所有的图
圆心距:170 圆心距小于此值的圆不检测,以减小计算量
canny阈值:图像二值化的参数,根据实际情况调整
投票数:一个圆需要至少包含多少个点,才认为这是一个圆
最小半径,最大半径:在此值之间的圆才是需要的圆,超过范围不检测,以减小计算量
检测完的结果保存在circles 中
可以自己调整参数以观察结果
4 显示检测结果
没啥好说的,代码很简单,就是对于每个结果画出圆和圆心
arr1 = np.zeros([0, 2], dtype=int) # 创建一个0行, 2列的空数组
if circles is not None:
circles = np.uint16(np.around(circles)) # 4舍5入, 然后转为uint16
for i in circles[0, :]:
arr1 = np.append(arr1, (i[0], i[1])) # arr1是圆心坐标的np数组
# print(arr1)
cv2.circle(img2, (i[0], i[1]), i[2], (0, 0, 255), 3) # 轮廓
cv2.circle(img2, (i[0], i[1]), 2, (0, 0, 0), 6) # 圆心
5 完整代码和示例图像
可以在这里下载:示例代码下载
Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示
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进行圆形识别(圆检测)的主要内容,如果未能解决你的问题,请参考以下文章
Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示
Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示
#私藏项目实操分享#教你用OpenCV 和 Python实现圆物检测《-》HoughCircles