如何从已标注图像中提取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()
关键说明:
- HSV阈值可根据实际标注框的蓝色深浅微调,可借助图像取色工具获取准确的HSV值
- 形态学操作的迭代次数可根据图像噪点情况调整,确保标注框轮廓连续
- 轮廓过滤的面积阈值需根据标注框的实际大小设置,避免误判噪点
内容的提问来源于stack exchange,提问作者MN1005
相关产品推荐
相关产品推荐

