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

基于颜色的目标Bounding Box绘制(Python)技术求助

嘿,我来帮你搞定基于颜色的目标Bounding Box绘制!你之前的代码是用灰度图轮廓检测的思路,换成颜色检测的话,核心是先通过颜色空间分割出目标区域,再提取轮廓画框,我给你梳理完整的实现方案:

基于颜色的目标Bounding Box绘制实现步骤

1. 确定目标颜色的HSV范围

OpenCV默认的颜色空间是BGR,但HSV空间对颜色的区分度更高,更适合做颜色分割。你需要先找到目标颜色对应的HSV上下阈值——比如红色在HSV里有两个区间(因为色相环是0-180,红色在两端),其他颜色一般是单个区间。

2. 生成颜色掩码并去除噪点

把原图转成HSV后,用cv2.inRange()生成只保留目标颜色的掩码,再通过腐蚀+膨胀的形态学操作去掉掩码里的小噪点,让目标区域更清晰。

3. 提取轮廓并绘制Bounding Box

和你之前的思路类似,找到掩码里的轮廓后,过滤掉太小的无效轮廓,用cv2.boundingRect()获取框的坐标,最后用cv2.rectangle()在原图上画出框。


完整代码实现
import cv2
import numpy as np
import os

# 读取目标图片
img = cv2.imread('1 (2).png')
# 将BGR格式转为HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 示例:红色目标的HSV阈值(你需要根据自己的目标颜色调整)
# 红色在HSV中有两个区间,需要合并掩码
lower_red = np.array([0, 120, 70])
upper_red = np.array([10, 255, 255])
lower_red2 = np.array([170, 120, 70])
upper_red2 = np.array([180, 255, 255])

# 创建颜色掩码:只保留目标颜色区域
mask1 = cv2.inRange(hsv, lower_red, upper_red)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask = mask1 | mask2

# 形态学操作:先腐蚀去噪,再膨胀还原目标区域
kernel = np.ones((5,5), np.uint8)
mask = cv2.erode(mask, kernel, iterations=1)
mask = cv2.dilate(mask, kernel, iterations=2)

# 查找掩码中的轮廓(只提取最外层轮廓)
contours, hierarchy = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 遍历每个轮廓,绘制Bounding Box
for cnt in contours:
    # 过滤掉面积过小的杂点轮廓(阈值根据你的图片调整)
    if cv2.contourArea(cnt) > 50:
        # 获取Bounding Box的坐标(x,y)和宽高(w,h)
        x, y, w, h = cv2.boundingRect(cnt)
        # 在原图上绘制绿色矩形框(BGR格式),线宽2
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
        
        # 可选:绘制目标中心点(和你之前的代码逻辑呼应)
        M = cv2.moments(cnt)
        if M['m00'] != 0:  # 避免除以0的异常
            cx = int(M['m10'] / M['m00'])
            cy = int(M['m01'] / M['m00'])
            cv2.circle(img, (cx, cy), 3, (0, 0, 255), -1)

# 显示结果窗口
cv2.imshow('Color-based Bounding Boxes', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

实用小贴士
  • 怎么获取目标颜色的HSV值?
    可以用这段小代码快速转换:

    # 比如你想查BGR红色(0,0,255)的HSV值
    bgr_color = np.uint8([[[0, 0, 255]]])
    hsv_color = cv2.cvtColor(bgr_color, cv2.COLOR_BGR2HSV)[0][0]
    print(hsv_color)
    

    得到基础值后,上下浮动色相±10、饱和度/明度±50左右,就能得到合适的阈值范围。

  • 优化建议
    如果是光线不稳定的场景,可以考虑用自适应阈值或者颜色直方图匹配来提升鲁棒性;轮廓面积的阈值要根据你的图片分辨率和目标大小灵活调整。

内容的提问来源于stack exchange,提问作者Zeyad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:59:04