请在下面找到一些tesseract错误识别的图片。
47被认为是“4]”。
55被认为是“S55”。
90被认为是“智商”。
我认为图像非常好,应该很容易被Tesseract识别。但结果证明是错误的。我使用的代码如下所示。
import cv2
import pytesseract
from PIL import Image
import glob
for i in glob.glob('*.png'):
img = cv2.imread(i, 0)
tessdata_dir_config = '--tessdata-dir "C:\Program Files (x86)\Tesseract-OCR\" --psm 10'
result = pytesseract.image_to_string(Image.fromarray(img), config=tessdata_dir_config)
print result
有谁知道发生了什么以及如何提高性能?
答案 0 :(得分:0)
好的,我找到了问题的答案。似乎Tesseract不喜欢粗体字,所以你必须稍微侵蚀角色的黑色部分。但要注意cv2.erode
会侵蚀角色中的白色部分,因此我们必须使用cv2.dilate
来实现目标。
for i in ['47-4].png', '55-S55.png', '90-IQ.png']:
img = cv2.imread(i, 0)
### After apply dilation using 3X3 kernal. The recognition results are improved.##
kernel = np.ones((3, 3), np.uint8)
img = cv2.dilate(img, kernel, iterations=2)
cv2.imwrite("./output/" + i[:-4]+'_dilate.png', img)
tessdata_dir_config = '--tessdata-dir "D:\Program Files\Tesseract-ocr\" --psm 10'
result = pytesseract.image_to_string(Image.fromarray(img), config=tessdata_dir_config)
print result
我想看看这个问题是否有更好的分析。所以我会让它打开一段时间并选择最佳答案。
答案 1 :(得分:0)
我遇到了从Android设备屏幕上读取文本的问题。 在某些设备上,其他设备没有。 我在tesseract documentation中发现它与图像dpi有关。
Tesseract在DPI至少为300 dpi的图像上效果最佳,因此调整图像大小可能会有所帮助。有关详细信息,请参阅常见问题解答。
所以我使用了cv2的resize函数来重新缩放图像。
path = "/home/share/workspace/NNW4JJ4T4LR4G66H_ZTE_Blade_L5/clock_present_cropped.png"
path2 = "/home/share/workspace/NNW4JJ4T4LR4G66H_ZTE_Blade_L5/clock_present_cropped_2.png"
crop_img2 = cv2.imread(str(path))
img_scaled = cv2.resize(crop_img2, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)
cv2.imwrite(str(path2), img_scaled)
crop_img2 = Image.open(path2)
result = pytesseract.image_to_string(crop_img2)
现在它适用于所有设备。