non*_*mer 4 python ocr opencv python-imaging-library python-tesseract
编辑:感谢 Nathancy,我忘记处理解决阅读问题的图像。仍然想知道是什么让 Tesseract 只读取未处理图像的顶部或底部线(相同的图像,两种不同的结果)
原始:
我有一个包含两行文本的图像:
pytesseract 的随机测试图像
当我使用 PIL Image 在 python (IDLE Python 3.6) 中打开图像并使用 pytesseract 提取字符串时,它只正确提取最后一行/底行。文本的上面一行是乱码。(参见下面的代码部分)
但是,当我使用 opencv 打开图像并使用 pytesseract 提取字符串时,它只正确提取顶部/上面的行,同时弄乱了第二个/文本的底行。(另请参见下面的代码部分)
这是代码:
>>> from PIL import Image, ImageFilter
>>> import pytesseract
>>> pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
>>> import cv2
>>> img = Image.open(r"C:\Users\user\MyImage.png")
>>> img2 = cv2.imread(r"C:\Users\user\MyImage.png", cv2.IMREAD_COLOR)
>>> print(pytesseract.image_to_string(img2))
Pet Sock has 448/600 HP left
A ae eee PER eats ae
>>> print(pytesseract.image_to_string(img))
Le TL
JHE has 329/350 HP left.
Run Code Online (Sandbox Code Playgroud)
pytesseract.image_to_boxes当我在两者上使用时img,img2它将在某些位置显示具有不同字母的相同边界框(仅显示包含相同框的 2 个提取行)
>>> print(pytesseract.image_to_boxes(img2))
A 4 6 10 16 0
>>> print(pytesseract.image_to_boxes(img))
J 4 6 10 16 0
Run Code Online (Sandbox Code Playgroud)
pytesseract.image_to_data当我在两者上使用时img,img2它在读取正确的行上显示出非常高的置信度(95+),在乱码行上显示出非常低的置信度(30-)。
image_to_data
编辑的 Excel 表输出:Excel 表相应地是 img2 和 img
我摆弄了 psm 配置值(我已经尝试了所有这些),除了在设置上创建更多垃圾:5、7、8、9、10、13;有些给出错误:0, 2; 它给出的结果与默认值(我相信是 3)没有什么不同,
我一定犯了一些菜鸟错误,但我无法理解为什么会发生这种情况。如果有人能朝着正确的方向发出光芒,那就太棒了。
该图像只是一个适合我放置的 OCR 测试的随机图像。除了尝试 pytesseract 之外没有其他意图。
每当使用 Pytesseract 执行 OCR 时,对图像进行预处理非常重要,以便文本为黑色,背景为白色。我们可以通过简单的阈值来做到这一点
Pytesseract 的输出
Pet Sock has 448/600 HP left
JHE has 329/359 HP left.
Run Code Online (Sandbox Code Playgroud)
代码
import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
data = pytesseract.image_to_string(thresh, lang='eng',config='--psm 6')
print(data)
cv2.imshow('thresh', thresh)
cv2.waitKey()
Run Code Online (Sandbox Code Playgroud)