无法使用 pytesseract.image_to_string 从图像中读取文本
Posted
技术标签:
【中文标题】无法使用 pytesseract.image_to_string 从图像中读取文本【英文标题】:Unable to read text from Image using pytesseract.image_to_string 【发布时间】:2021-08-06 05:35:04 【问题描述】:这里的问题是我需要删除这些行并编写代码来识别字符。到目前为止,我已经看到了解决方案,其中 char 是实心的,但是这个 char 有双边框。
【问题讨论】:
大多数验证码生成器的设计方式使得 tesseract 等传统工具无法检测其输出(它们会将 tesseract 等公开可用的工具应用于生成的验证码样本批次,如果在大多数情况下,像 tesseract 这样的工具会失败,它们会发布这种验证码生成模式)。所以这很正常,你可以查看其他的OCR工具,最强的是,我认为是Google Cloud的Vision API(例如Google Lens)。我测试了图像的手动修改版本,发现正如你提到的我们应该删除线条并用 cv 的计数器填充字符。 【参考方案1】:对于这个特定的验证码,有一个非常简单的解决方案。但是,由于 cmets 中已经提到的验证码的“性质”,并且通常在处理提供有限输入数据的图像处理任务时,不能保证这种方法适用于其他甚至非常相似的验证码。
将图像读取为灰度。
将图像阈值设置为接近白色的截止点。
Flood fill“背景”为黑色。
使用-psm 6
选项运行pytesseract
。
这就是整个代码:
import cv2
import pytesseract
# Read image as grayscale
img = cv2.imread('FuZEJ.png', cv2.IMREAD_GRAYSCALE)
# Threshold at nearly white cutoff
thr = cv2.threshold(img, 224, 255, cv2.THRESH_BINARY)[1]
# Floodfill "background" with black
ff = cv2.floodFill(thr, None, (0, 0), 0)[1]
# OCR using pytesseract
text = pytesseract.image_to_string(ff, config='--psm 6').replace('\n', '').replace('\f', '')
print(text)
# xwphs
警告:我使用来自 Mannheim University Library 的特殊版本的 Tesseract。
----------------------------------------
System information
----------------------------------------
Platform: Windows-10-10.0.16299-SP0
Python: 3.9.1
PyCharm: 2021.1.1
OpenCV: 4.5.1
pytesseract: 5.0.0-alpha.20201127
----------------------------------------
【讨论】:
【参考方案2】:我会尝试戴口罩:
import cv2
import numpy as np
def process(img): # To process the image
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, img_gray = cv2.threshold(img_gray, 224, 255, cv2.THRESH_TOZERO_INV)
img_blur = cv2.GaussianBlur(img_gray, (7, 7), 6)
img_canny = cv2.Canny(img_blur, 0, 100)
return cv2.dilate(img_canny, np.ones((1, 5)), iterations=1)
def get_mask(img): # To generate the mask
mask = np.zeros(img.shape[:2], 'uint8')
contours, _ = cv2.findContours(process(img), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
for cnt in contours:
cv2.drawContours(mask, [cnt], -1, 255, -1)
return mask
def crop(img, mask): # To mask an image and use white background
bg = np.full(img.shape, 255, 'uint8')
fg = cv2.bitwise_or(img, img, mask=mask)
fg_back_inv = cv2.bitwise_or(bg, bg, mask=cv2.bitwise_not(mask))
return cv2.bitwise_or(fg, fg_back_inv)
img = cv2.imread("image.png")
img = cv2.pyrUp(cv2.pyrUp(img)) # To enlarge image by 4x
cv2.imshow("Masked Image", crop(img, get_mask(img)))
cv2.waitKey(0)
之前:
之后:
【讨论】:
以上是关于无法使用 pytesseract.image_to_string 从图像中读取文本的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 StorageClass 配置卷 - 无法获取存储帐户的存储密钥
Worklight Studio 和本地开发,有时无法使用 Java 类,有时无法使用 HTML 文件
Ubuntu 80端口无法使用-非root用户无法使用1024以下端口