cv2.boundingRect 创建问题

cv2.boundingRect creating issue

我正在处理数字图像的预处理。每张图片都包含一个数字和一些不需要的轮廓 .

此噪声或轮廓可以是线条或小点的形式。我的任务是去除这些轮廓。所以我决定使用下面的算法

  1. 找到所有轮廓

  2. 等高线按面积降序排列

  3. 遍历从索引 2 到最后一个的轮廓

  4. 创建一个 boundingRect 并用 255

    填充图像的那部分
     cv2.findContours(image,  cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
     contours = sorted(contours, key = cv2.contourArea, reverse = True)
     for c in contours[2:]:
         (x, y, w, h) = cv2.boundingRect(c)
         image[y:y + h, x:x + w] = 255
    

现在的问题是,如果第一个图像 boundingRect 返回 (14,14,150,150),它也覆盖了数字。现在我的问题是,是否有更好的替代 boundingRect 以便只能替换轮廓区域。

输出图像如下:

原图文件如下

我可以通过以下步骤获得所需的输出:

  1. 反转图像的颜色(或在查找轮廓时将检索方法更改为RETR_INTERNAL)。白色像素值为 1,黑色像素值为 0,因此 RETR_EXTERNAL 操作无法检测到黑色轮廓。

  2. 像你一样根据区域对轮廓进行排序

  3. 从第二大轮廓开始用白色填充轮廓

代码:

# Images I copied from here were not single channel, so convert to single channel to be able to find contours.
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Copy the original image to draw on it later on
img_copy = img.copy()

# Invert the color if using RETR_EXTERNAL
img = cv2.bitwise_not(img)

# Note that findContours function returns hierarchy as well as the contours in OpenCV4.x, in OpenCV3.x it used to return 3 values.
contours, hierarchy = cv2.findContours(img,  cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Sort the contours descending according to their area
contours = sorted(contours, key =lambda x: cv2.contourArea(x), reverse = True)

# Fill the detected contours starting from second largest
for c in contours[1:]:
    print(c)
    img_copy = cv2.fillPoly(img_copy, [c], color=(255,255,255))

输出:(windows 之间的黑条是我的背景)