我们如何在 canny 边缘检测输出周围添加边界框?

How can we add bounding box around canny edge detection output?

我正在使用 canny 边缘检测,并希望在检测到的边缘周围创建一个边界框,以便每个单词都被单个边界框覆盖。

Canny 边缘输出 -

Canny 边缘输出周围的边界框 -

我试过以下方法

contours,hierarchy=cv2.findContours(edged,cv2.RETR_LIST,cv2.CHAIN_APPROX_NONE)


boundRect = [None]*len(contours)
for i, c in enumerate(contours):
    contours_poly = cv2.approxPolyDP(c, 3, True)
    boundRect[i] = cv2.boundingRect(contours_poly)

for i in range(len(contours)):
    cv2.rectangle(image, (int(boundRect[i][0]), int(boundRect[i][1])), (int(boundRect[i][0]+boundRect[i][2]), int(boundRect[i][1]+boundRect[i][3])), (0,0,0), 2)

但在这种方法中,每个字母表都单独获得边界框。

实际输出 -

轮廓输出 -

您可能需要找到轮廓,然后应用边界框。以下链接可以提供帮助:

  1. 要找到轮廓Try this

  2. 绘制边界框Try this

您必须使用函数<< cv2.findContours >>

它是这样使用的:

contours = cv2.findContours(image, cv2.RETR_LIST, cv2.RETR_EXTERNAL) 
// contours : Numpy array with shape [number_contours, number_points,1,2]
// image: Your binary image as input
// cv2.RETR_EXTERNAL: Way to get your contours hierarchie
// cv2.CHAIN_APPROX_NONE: Approximation for optimisation

Contour hierarchie documentation

Approximation documentation

我建议你不要用精明的人来解决你的问题,而是 threshold method 代替。

对于字母检测,您可以使用 ICP algorithm 以便能够自动读取文本。

要描绘轮廓,请使用此代码:

import random
contours = sorted(contours, key = cv2.contourArea, reverse = True)
for i in range(len(contours)):
    contour = contours[i]
    random.seed(i)
    color = (255*random.random(),255*random.random(),255*random.random())
    cv2.drawContours(img,[contour], -1, color, 3)

如果图像中 1 个元素的轮廓太多,则必须使用扩张方法才能 "close" 您的轮廓:

img_dilate = cv2.dilate(image, cv2.getStructuringElement(cv2.MORPH_RECT, (1, 1), (1, 1)))

Contour approximation method documentation