我有以下图像并尝试使用 pytesseract 提取文本。但是,它总是返回一些未知字符。
图像
这是我正在使用的代码:
import pytesseract as pt
from PIL import Image
#Converting image to text
img = Image.open('frame-1ROI_2.png')
extracted = pt.image_to_string(img)
print(extracted)
print(type(extracted))
这是输出
如果我使用 这个 在线文本提取工具,它确实提取文本并返回正确的文本。
更新 1
我已更改此代码,结果仍然相同。
img = img.convert("L")
img = img.filter(ImageFilter.SMOOTH_MORE)
图像现在如下所示:
我也尝试过| ||这个 方法但是输出仍然是一样的。 method but the output is still the same.
Tesseract 在处理具有复杂背景的图像时会遇到困难,就像提供的那个。要提高识别精度,需要对图像进行预处理以增强文本并简化背景。
以下是对示例的逐步改进建议,使用 Python 和 OpenCV:
import cv2
import pytesseract
# 1. 加载图像
img = cv2.imread('frame-1ROI_2.png')
# 2. 图像预处理
# a. 转换为灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# b. 使用自适应阈值进行二值化
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 15, 2)
# c. 降噪(可选,但可以提高结果)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
# 3. 使用 Tesseract 进行 OCR
extracted = pytesseract.image_to_string(opening)
print(extracted)
# 4. (可选)显示结果
cv2.imshow('Thresholded Image', thresh)
cv2.waitKey(0)
这个代码做了以下事情:
-
加载图像:
使用 OpenCV (
cv2.imread
) 加载图像。 -
图像预处理:
-
转换为灰度:
将图像转换为灰度以简化处理 (
cv2.cvtColor
). -
二值化:
应用自适应阈值将图像转换为黑白,突出显示文本 (
cv2.adaptiveThreshold
). -
降噪:
使用形态学操作(打开)去除噪声和小的伪影,从而清理图像 (
cv2.morphologyEx
).
-
转换为灰度:
将图像转换为灰度以简化处理 (
-
使用 Tesseract 进行 OCR:
使用
pytesseract.image_to_string
在预处理后的图像上执行 OCR。 - (可选)显示结果: 显示结果图像(二值化图像)以可视化预处理步骤的效果。
通过试验预处理技术和参数,可以进一步改进结果。还可以探索其他图像预处理技术,例如:
- 去斜: 如果图像倾斜,则校正图像方向。
- 缩放: 有时,放大图像可以帮助 Tesseract 更好地识别字符。
- 去边框: 从图像中移除任何边框或线条,这些边框或线条可能会干扰文本提取过程。
请记住,在处理具有挑战性的图像时,没有一种万能的解决方案,并且可能需要调整预处理步骤和 Tesseract 配置以获得最佳结果。
标签:python,python-tesseract From: 73269373