Python 从图像中提取白色矩形

Python 从图像中提取白色矩形,python,opencv,image-processing,computer-vision,yolo,Python,Opencv,Image Processing,Computer Vision,Yolo,我有一个大的数据集,只有遮罩图片和白框显示的投资回报率。我想得到边界框xywh,用于实现yolov3。 样本图片 我的努力 image = cv2.imread('sample.jpg') # cv2.imshow('image',image) copy = image.copy() gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 0, 255, cv

我有一个大的数据集,只有遮罩图片和白框显示的投资回报率。我想得到边界框xywh,用于实现yolov3。 样本图片

我的努力

    image = cv2.imread('sample.jpg')
    # cv2.imshow('image',image)
    copy = image.copy()
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)[1]

    cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]

    ROI_number = 0
    bboxes = []
    for c in cnts:
        x, y, w, h = cv2.boundingRect(c)
        bboxes.append([x, y, w, h])
        ROI = image[y:y + h, x:x + w]
        # cv2.imshow('ROI_{}.png'.format(ROI_number), ROI)
        cv2.rectangle(copy, (x, y), (x + w, y + h), (36, 255, 12), 2)

    print(bboxes)
    exit()
结果

[[1594, 864, 1, 144], [1076, 717, 2, 2], [908, 668, 148, 47], [1356, 7, 3, 1], [1594, 6, 1, 6], [1344, 6, 106, 28], [1377, 0, 3, 1]]

应该只有2个框,而不是7这段代码中的什么错误

因为你没有过滤区域或类似区域的轮廓,你也会检测到那些(小的,但有点清晰可见!)瑕疵,比如在右上角,或者在下框的右下角,或者在右图像边框的那条线。例如,我如何过滤它们,像这样:
cnts=[cnt for cnt in cnts if cv2.contourArea(cnt)>thr]
使用
thr
作为合适的阈值,在您的示例中可能是
500
,因为与工件相比,您有相当大的盒子。我刚刚注意到图像上有小的凹痕。我可以根据w,h进行过滤吗?或者我的想法是错误的cnts=imutils.grab_courts(cnts)cnts=sorted(cnts,key=cv2.contourArea,reverse=True)ROI_number=0 bboxes=[]对于枚举中的i,c(cnts):如果cv2.contourArea(c)>500:x,y,w,h=cv2.boundingRect(c)bboxes.append([x,y,w,h])ROI=图像[y:y+h,x:x+w]#cv2.imshow('ROI{}.png'.格式(ROI_编号),ROI)cv2.矩形(复制,(x,y),(x+w,y+h),(36255,12),2)