我目前正在用 python 编写一个程序,该程序获取包含大量文本的图像,将其提取到 .txt 文件,然后将找到的单词与另一个文件中的单词列表进行比较,并创建一些坐标(根据像素)在图像中找到的单词中,如果找到图像,则会在图像中绘制红色方块。到目前为止,我已经正确处理了坐标部分,在单词周围绘制了方块,并且给定的坐标非常准确地匹配。 我的问题是单词检测:ocr 没有找到图像中确实存在的几个单词,我认为问题是因为它们没有写在同一行中,而是在几个空格内,因此句子被“剪切” " :示例 Journal Voucher -> Journal 和几个单词之后我们找到了 Voucher 单词。 我对 OneNote 文本检测功能进行了测试,结果非常好,因此我相信检测文本可以获得更好的结果。 我将不胜感激任何改进文本检测的帮助(另一个库?,不同的方法?)我已经不知道如何改进文本检测,但我必须改进它,否则坐标也不会被检测到。 这是我处理图像的代码的一部分:
from PIL import Image, ImageEnhance, ImageFilter, ImageOps
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Users\xxx\AppData\Local\Programs\Tesseract-OCR\tesseract.exe'
image_path = r'C:\Users\xxx\Pictures\xxx.png'
image = Image.open(image_path)
#grayscale
image = image.convert('L')
#enhance contrast
image = ImageEnhance.Contrast(image).enhance(2)
#Sharpen the image
image = image.filter(ImageFilter.SHARPEN)
#reduce noise
image = image.filter(ImageFilter.MedianFilter(size=3))
#save the preprocessed image
preprocessed_image_path = r'C:\Users\xxx\xxx\preprocessed_image.png'
image.save(preprocessed_image_path)
print(f"Preprocessed image saved to {preprocessed_image_path}")
#OCR
custom_config = r'--oem 3 --psm 3'
ocr_text = pytesseract.image_to_string(image, config=custom_config)
#Save OCR text to a .txt file
txt_output_path = r'C:\Users\xxx\Documents\ocr_output.txt'
with open(txt_output_path, 'w', encoding='utf-8') as file:
file.write(ocr_text)
print(f"OCR text saved to {txt_output_path}")
这是我正在处理的图像的一小部分,原始图像要大得多,但格式保持相似。
好的,我可以帮助优化 OCR 文本检测。遇到的问题(文本跨多行、空格影响单词检测)在使用 OCR 时很常见,尤其是对于没有清晰结构的文档。以下是改进代码的一些建议:
1. 图像预处理改进
已经完成了不错的预处理步骤,但我们可以添加更多内容:
- 偏斜校正: 如果图像稍有倾斜,则会影响行检测。使用类似于 OpenCV 的库来检测并校正偏斜。
-
行分割:
将图像分割成单独的行可以提高 OCR 准确性,尤其是在处理不同空格时。OpenCV 中的
cv2.findContours
和cv2.boundingRect
可以帮助找到行边界。 -
自适应阈值:
代替全局阈值,自适应阈值(如 OpenCV 中的
cv2.adaptiveThreshold
)可以根据图像的局部区域调整阈值,从而更好地分割文本和背景。
2. OCR 引擎和配置
-
Tesseract 配置:
正在使用
--oem 3 --psm 3
,这分别适用于默认引擎模式和自动页面分割模式。尝试以下其他页面分割模式:-
--psm 6
(假设一行文本)对于分割的每一行可能效果更好。 -
尝试不同的
psm
值并查看哪个效果最好。
-
-
其他 OCR 引擎:
虽然 Tesseract 是一个不错的选择,但也可以探索其他 OCR 引擎:
- EasyOCR: 用户友好且支持多种语言。
- Google Cloud Vision API: 基于云的 OCR,通常具有很高的准确性。
- 训练 Tesseract: 对于特定字体或格式的文档,使用自己的数据训练 Tesseract 可以显着提高准确性。
3. 后处理
- 正则表达式模式匹配: 使用正则表达式来查找想要的特定单词或模式,即使 OCR 不是完美的。这可以帮助连接被错误分割的单词,例如 "Jour- \n nal"。
- 词典校正: 使用词典检查 OCR 输出并更正识别错误的单词。
代码示例(使用 OpenCV 进行行分割):
import cv2
import pytesseract
# ...(的其他预处理步骤)...
# 使用 OpenCV 进行行分割
img = cv2.imread(preprocessed_image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# 查找轮廓并获取边界框
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
ocr_text = ""
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
cropped = img[y:y+h, x:x+w]
text = pytesseract.image_to_string(cropped, config='--psm 6')
ocr_text += text + "\n"
# ...(的其余代码)...
记住: 提高 OCR 准确性是一个迭代过程。尝试不同的预处理技术、OCR 引擎和配置,以找到适合特定图像的最佳组合。
标签:python,ocr,python-tesseract From: 78795033