如何使用opencv-python检测给定图片中球类的颜色

基于Python-OpenCV的球类颜色检测实现方案
核心实现逻辑
- 先对输入图片做降噪预处理,避免后续圆检测出现误判
- 调用OpenCV内置的霍夫圆变换,识别出图中所有球类的位置、半径参数
- 生成每个球的圆形掩码,提取对应的感兴趣区域(ROI),排除背景像素的干扰
- 将ROI转换为对光照更鲁棒的HSV颜色空间,和预设的常见球类颜色范围做匹配,统计占比最高的颜色作为识别结果
可直接运行的代码
import cv2 import numpy as np # 预设常见球类的HSV颜色范围,可根据实际测试效果微调 color_ranges = { "红色": [(0, 120, 70), (10, 255, 255), (170, 120, 70), (180, 255, 255)], "黄色": [(20, 100, 100), (30, 255, 255)], "蓝色": [(90, 100, 100), (130, 255, 255)], "绿色": [(40, 40, 40), (70, 255, 255)], "橙色": [(10, 100, 20), (20, 255, 255)], "白色": [(0, 0, 200), (180, 30, 255)] } # 读取图片,替换为你本地保存的图片路径 img = cv2.imread("ball_image.jpg") # 预处理:转灰度+高斯模糊降噪 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (5, 5), 0) # 霍夫圆检测识别所有球类 circles = cv2.HoughCircles( gray, cv2.HOUGH_GRADIENT, dp=1.2, minDist=50, param1=50, param2=30, minRadius=10, maxRadius=100 ) if circles is not None: circles = np.uint16(np.around(circles)) hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) for idx, (x, y, r) in enumerate(circles[0]): # 生成圆形掩码,仅保留当前球的像素 mask = np.zeros(img.shape[:2], dtype=np.uint8) cv2.circle(mask, (x, y), r, 255, -1) roi_hsv = cv2.bitwise_and(hsv_img, hsv_img, mask=mask) max_pixel_count = 0 result_color = "未知" # 匹配所有预设颜色,取像素占比最高的 for color_name, ranges in color_ranges.items(): if color_name == "红色": # 红色HSV区间分两段,单独处理 lower1, upper1, lower2, upper2 = ranges mask1 = cv2.inRange(roi_hsv, np.array(lower1), np.array(upper1)) mask2 = cv2.inRange(roi_hsv, np.array(lower2), np.array(upper2)) color_mask = cv2.bitwise_or(mask1, mask2) else: lower, upper = ranges color_mask = cv2.inRange(roi_hsv, np.array(lower), np.array(upper)) count = cv2.countNonZero(color_mask) if count > max_pixel_count: max_pixel_count = count result_color = color_name print(f"第{idx+1}个球(圆心坐标:{x}, {y})的检测颜色:{result_color}")
调优建议
- 如果出现漏检球或者误检非球区域的情况,调整
HoughCircles的param2参数,数值越大检测越严格,数值越小检出的圆越多 - 如果颜色识别不准,可以根据实际拍摄的光照情况,微调对应颜色的HSV上下界阈值
- 如果球表面有反光、印花杂色,可以先对ROI做形态学开运算过滤噪点,再统计颜色占比
内容的提问来源于stack exchange,提问作者DAMODAR CHOUDHARI
相关产品推荐
相关产品推荐

