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

如何从已标注图像中提取Bounding Box坐标及面积?

解决方案:提取标注图像中的Bounding Box坐标与面积

你的核心问题在于原代码是基于灰度形态学找最大轮廓,没有针对标注框的特定颜色做区分,导致误提取了图像整体轮廓。针对示例图中的蓝色标注框,我们可以通过颜色分割精准定位,步骤如下:

  • 转换图像到HSV颜色空间:HSV比BGR更适合做颜色阈值分割,能有效分离特定颜色区域
  • 设定蓝色的HSV阈值范围,生成掩码提取蓝色标注框
  • 形态学操作优化掩码:去除小噪点,让标注框轮廓更完整
  • 查找并过滤轮廓:只保留符合标注框特征的轮廓,计算坐标与面积

修改后的完整代码:

import cv2
import numpy as np

# 读取图像
img = cv2.imread('WhatsApp-Image-2023-07-13-at-10.59.04.jpg')
# 转换到HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 定义蓝色的HSV范围(可根据实际标注框颜色微调)
lower_blue = np.array([90, 50, 50])
upper_blue = np.array([130, 255, 255])

# 生成蓝色区域掩码
mask = cv2.inRange(hsv, lower_blue, upper_blue)

# 形态学操作:先膨胀再腐蚀,去除小噪点,修复框的断裂
kernel = np.ones((3,3), np.uint8)
mask = cv2.dilate(mask, kernel, iterations=2)
mask = cv2.erode(mask, kernel, iterations=2)

# 查找轮廓
contours, _ = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 过滤小轮廓(排除噪点),提取标注框
for cnt in contours:
    area = cv2.contourArea(cnt)
    # 根据标注框大小调整阈值,过滤极小的噪点轮廓
    if area > 100:
        x, y, w, h = cv2.boundingRect(cnt)
        # 计算框的面积(也可用w*h,和contourArea结果接近)
        box_area = w * h
        print(f"Bounding Box坐标:({x}, {y}), 宽:{w}, 高:{h}, 面积:{box_area}")
        # 在原图上绘制检测到的框(绿色)
        cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

# 显示结果
cv2.imshow('Detected Bounding Boxes', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键说明:

  1. HSV阈值可根据实际标注框的蓝色深浅微调,可借助图像取色工具获取准确的HSV值
  2. 形态学操作的迭代次数可根据图像噪点情况调整,确保标注框轮廓连续
  3. 轮廓过滤的面积阈值需根据标注框的实际大小设置,避免误判噪点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:33:30