【问题标题】:Detect and remove rectangles surrounding character检测并删除字符周围的矩形
【发布时间】:2021-03-11 16:31:44
【问题描述】:

如何删除字符和数字周围的矩形,以便之后执行 OCR?这是一个例子:

我假设线条是连续的。我试图用 OpenCV 轮廓来做,但到目前为止,它似乎是一个非常不可靠的算法,很大程度上取决于图像的噪声、线条的宽度等。

我对最通用和最强大的算法感兴趣。我也可以考虑神经解决方案,但到目前为止,我发现只有 CRAFT (https://github.com/clovaai/CRAFT-pytorch) 来检测和提取字符,当单词被正方形/矩形内的字符/数字分割时,这也经常失败。

【问题讨论】:

    标签: python opencv computer-vision ocr tesseract


    【解决方案1】:

    我们可以使用 findContours 删除它们以获取框。

    我们需要先制作图像的蒙版。我正在使用 [200, 255] 范围来获取白色背景。然后我腐蚀了遮罩,以确保盒子之间有足够的间隔。

    然后我使用 findContours 来获取这些框。我删除了小轮廓以过滤掉框内的数字。我重新绘制了没有数字的方框。

    然后我返回原始图像并将蒙版区域变白。

    import cv2
    import numpy as np
    
    # load image
    img = cv2.imread("numbers.png");
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY);
    mask = cv2.inRange(gray, 200, 255);
    
    # erode to enhance box separation
    kernel = np.ones((3,3), np.uint8);
    mask = cv2.erode(mask, kernel, iterations = 1);
    
    # contours OpenCV3.4, if you're using OpenCV 2 or 4, it returns (contours, _)
    _, contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE);
    
    # only take big boxes
    cutoff = 250;
    big_cons = [];
    for con in contours:
        area = cv2.contourArea(con)
        if area > cutoff:
            big_cons.append(con);
            print(area);
    
    # make a mask
    redraw = np.zeros_like(mask);
    cv2.drawContours(redraw, big_cons, -1, (255), -1);
    redraw = cv2.bitwise_not(redraw);
    img[redraw == 255] = (255,255,255); # replace with whatever color you want as your background
    
    # show
    cv2.imshow("Image", img);
    cv2.imshow("Mask", mask);
    cv2.imshow("redraw", redraw);
    cv2.waitKey(0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-07
      • 2014-04-04
      • 1970-01-01
      • 2013-01-15
      • 2012-06-18
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多