我正在寻找从图像中提取文本的方法,我收到的输出不是很准确。我想知道是否可以采取其他措施来进一步处理图像以提高此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”
实际值是变化的,通常是无法识别的字符串,或者解析了一些数字,但准确率太低而无法使用。
答案 0 :(得分:2)
我没有使用OCR的经验,但是我认为您的方向正确:增加图像大小,以便算法可以使用更多像素,并增加数字与背景之间的区别。
我添加了一些技巧:thresholding图像,它将创建一个仅保留白色像素的蒙版。有一些白色斑点不是数字,所以我用findContours将那些不需要的斑点染成黑色。
结果:
代码:
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()