检测并删除字符周围的矩形

时间:2021-03-11 16:31:44

标签: python opencv computer-vision ocr tesseract

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

example

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

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

1 个答案:

答案 0 :(得分:2)

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

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

enter image description here

然后我使用 findContours 来获取盒子。我删除了小轮廓以过滤掉框内的数字。我重新绘制了盒子,里面没有数字。

enter image description here

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

enter image description here

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);