如何从带有少量背景的图像中提取文本?

时间:2019-02-05 17:34:38

标签: python opencv processing ocr

我正在寻找从图像中提取文本的方法,我收到的输出不是很准确。我想知道是否可以采取其他措施来进一步处理图像以提高此OCR的准确性。

我研究了一些处理图像和改善OCR结果的不同方法。图片很小,我可以将其炸毁,但无济于事。

图像将始终是水平的,除数字外不会显示其他文本。最大数量将达到55000。

有关图片的示例:

图像处理后,我的图像在X和Y轴上按比例放大4。并删除了一些饱和度,尽管这根本无法提高精度。

image = self._process(scale=6, iterations=2)
text = pytesseract.image_to_string(image, config="--psm 7")

我的处理方法正在执行以下操作:

# Resize and desaturate.
image = cv2.resize(image, None, fx=scale, fy=scale, 
interpolation=cv2.INTER_CUBIC)
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Apply dilation and erosion.
kernel = np.ones((1, 1), np.uint8)
image = cv2.dilate(image, kernel, iterations=iterations)
image = cv2.erode(image, kernel, iterations=iterations)

return image

预期:“ 10411”

实际值是变化的,通常是无法识别的字符串,或者解析了一些数字,但准确率太低而无法使用。

1 个答案:

答案 0 :(得分:2)

我没有使用OCR的经验,但是我认为您的方向正确:增加图像大小,以便算法可以使用更多像素,并增加数字与背景之间的区别。

我添加了一些技巧:thresholding图像,它将创建一个仅保留白色像素的蒙版。有一些白色斑点不是数字,所以我用findContours将那些不需要的斑点染成黑色。

结果:

enter image description here

代码:

import numpy as np 
import cv2
# load image
image = cv2.imread('number.png')
# resize image
image = cv2.resize(image,None,fx=5, fy=5, interpolation = cv2.INTER_CUBIC)
# create grayscale
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# perform threshold
retr, mask = cv2.threshold(gray_image, 230, 255, cv2.THRESH_BINARY)
# find contours
ret, contours, hier = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# draw black over the contours smaller than 200 - remove unwanted blobs
for cnt in contours:
    # print contoursize to detemine threshold
    print(cv2.contourArea(cnt))
    if cv2.contourArea(cnt) < 200:
         cv2.drawContours(mask, [cnt], 0, (0), -1)

#show image
cv2.imshow("Result", mask)
cv2.imshow("Image", image)

cv2.waitKey(0)
cv2.destroyAllWindows()