如何从图像中获取文本
How to get text from image
我想阅读图片中的文字。
我在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("$", "")
但是,它 returns 空字符串。
正确的方法应该是什么?
谢谢。
Tesseract 用于对文本文档执行 OCR。根据我的经验,它很好,但即使是非常干净的数据也有点不完整。
在这种情况下,您似乎正在尝试解决专门设计用于击败 OCR 软件的验证码。 很可能您无法使用 Tesseract 解决此问题,因为:
- 它并不是真正为此设计的
- 场景是对抗性的:
- 该示例专门用于防止您尝试执行的操作
- 如果你能搞定,对方很可能会改成再break
如果您想继续,我建议:
- 在尝试处理之前清理图像(你能得到一张清晰易读的黑白图像吗?)
- 使用大量示例训练您自己的识别网络
我同意@Jon Betts
- tesseract 在 OCR 方面不是很强,只有在正确设置的二进制情况下才好
- 用于欺骗 OCR 的验证码!
但如果你真的需要这样做,你需要为它想出手动程序,
我专门针对您提供的验证码类型创建了以下代码(但它完全严格并且并非 generalized/optimized 适用于所有情况)
伪代码
- 应用中值模糊
- 应用阈值以仅获取蓝色(此阶段的二进制图像输出)
- 应用开口以减少二进制图像中的小白色像素
- 使用选项给图像进行 tesseract:
- 有限的输出字符白名单
- OEM 3:超正方体 + 立方体
- 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
为了查看 tesseract 的完整选项,键入以下命令 tesseract --help-extra
或参考 this_link
我想阅读图片中的文字。
我在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("$", "")
但是,它 returns 空字符串。
正确的方法应该是什么?
谢谢。
Tesseract 用于对文本文档执行 OCR。根据我的经验,它很好,但即使是非常干净的数据也有点不完整。
在这种情况下,您似乎正在尝试解决专门设计用于击败 OCR 软件的验证码。 很可能您无法使用 Tesseract 解决此问题,因为:
- 它并不是真正为此设计的
- 场景是对抗性的:
- 该示例专门用于防止您尝试执行的操作
- 如果你能搞定,对方很可能会改成再break
如果您想继续,我建议:
- 在尝试处理之前清理图像(你能得到一张清晰易读的黑白图像吗?)
- 使用大量示例训练您自己的识别网络
我同意@Jon Betts
- tesseract 在 OCR 方面不是很强,只有在正确设置的二进制情况下才好
- 用于欺骗 OCR 的验证码!
但如果你真的需要这样做,你需要为它想出手动程序,
我专门针对您提供的验证码类型创建了以下代码(但它完全严格并且并非 generalized/optimized 适用于所有情况)
伪代码
- 应用中值模糊
- 应用阈值以仅获取蓝色(此阶段的二进制图像输出)
- 应用开口以减少二进制图像中的小白色像素
- 使用选项给图像进行 tesseract:
- 有限的输出字符白名单
- OEM 3:超正方体 + 立方体
- 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
为了查看 tesseract 的完整选项,键入以下命令 tesseract --help-extra
或参考 this_link