cv2.boundingRect 创建问题
cv2.boundingRect creating issue
我正在处理数字图像的预处理。每张图片都包含一个数字和一些不需要的轮廓 .
此噪声或轮廓可以是线条或小点的形式。我的任务是去除这些轮廓。所以我决定使用下面的算法
找到所有轮廓
等高线按面积降序排列
遍历从索引 2 到最后一个的轮廓
创建一个 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 以便只能替换轮廓区域。
输出图像如下:
原图文件如下
我可以通过以下步骤获得所需的输出:
反转图像的颜色(或在查找轮廓时将检索方法更改为RETR_INTERNAL)。白色像素值为 1,黑色像素值为 0,因此 RETR_EXTERNAL 操作无法检测到黑色轮廓。
像你一样根据区域对轮廓进行排序
从第二大轮廓开始用白色填充轮廓
代码:
# 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 之间的黑条是我的背景)
我正在处理数字图像的预处理。每张图片都包含一个数字和一些不需要的轮廓
此噪声或轮廓可以是线条或小点的形式。我的任务是去除这些轮廓。所以我决定使用下面的算法
找到所有轮廓
等高线按面积降序排列
遍历从索引 2 到最后一个的轮廓
创建一个 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 以便只能替换轮廓区域。
输出图像如下:
原图文件如下
我可以通过以下步骤获得所需的输出:
反转图像的颜色(或在查找轮廓时将检索方法更改为RETR_INTERNAL)。白色像素值为 1,黑色像素值为 0,因此 RETR_EXTERNAL 操作无法检测到黑色轮廓。
像你一样根据区域对轮廓进行排序
从第二大轮廓开始用白色填充轮廓
代码:
# 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 之间的黑条是我的背景)