如何从图像中获取文本

时间:2019-07-19 18:29:21

标签: python ocr

我想从图像中读取文本。

我在Python中使用pytesseract

这是我的代码:

import pytesseract
from PIL import Image
pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"

image = Image.open(r'a.jpg')
image.resize((150, 50),Image.ANTIALIAS).save("pic.jpg")
image = Image.open("pic.jpg")
captcha = pytesseract.image_to_string(image).replace(" ", "").replace("-", "").replace("$", "")

image

但是,它返回空字符串。

正确的方法是什么?

谢谢。

2 个答案:

答案 0 :(得分:2)

Tesseract用于对文本文档执行OCR。以我的经验,这很好,但即使有非常干净的数据也有点不完整。

在这种情况下,您似乎正在尝试解决专门用于击败OCR软件的CAPTCHA。 您极有可能无法使用Tesseract解决此问题,因为:

  • 不是真的为此设计的
  • 这种情况是对抗性的:
    • 该示例专门用于防止您尝试执行的操作
    • 如果您可以使用它,则另一方可能会将其更改为再次损坏

如果您要继续,我建议:

  • 在尝试处理图像之前先清理图像(您能获得清晰可读的黑白图像吗?)
  • 使用大量示例训练您自己的识别网络

答案 1 :(得分:1)

我同意@Jon Betts

  1. tesseract在OCR中不是很强,只有在设置正确的二进制情况下才好
  2. 抓住傻瓜OCR!

但是,如果您确实需要执行此操作,则需要提出相应的手动步骤,

我为您提供的验证码类型专门创建了以下代码(但是它完全僵化,并未针对所有情况进行通用/优化)

伪代码

  1. 应用中值模糊
  2. 应用阈值以仅获取蓝色(此阶段输出的二进制图像)
  3. 应用打开以减少二进制图像中小的白色像素
  4. 使用以下选项将图像赋予整形效果:
    • 输出字符的限制白名单
    • OEM 3:tesseract +立方体
    • PSM 8:每张图片一个单词

代码

from PIL import Image
import pytesseract
import numpy as np
import cv2


img = cv2.imread('a.jpg')
img = cv2.medianBlur(img, 3)
# extract blue parts
img2 = np.zeros((img.shape[0], img.shape[1]), dtype=np.uint8)
cond = np.bitwise_and(img[:, :, 0] >= 100, img[:, :, 2] < 100)
img2[np.where(cond)] = 255
img = img2
# delete the noise
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

str1 = pytesseract.image_to_string(Image.fromarray(img),
                                       config='-c tessedit_char_whitelist=abcedfghijklmnopqrtuvwxyz0123456789 -oem 3 -psm 8')

cv2.imwrite("frame.png", img)
print(str1)

输出

f2e4

enter image description here

image

要查看tesseract的完整选项,请键入以下命令tesseract --help-extra或引用this_link