You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 00:54:03