首页 > 编程问答 >优化Python中图像中的OCR文本检测

优化Python中图像中的OCR文本检测

时间:2024-07-26 09:35:10浏览次数:10  
标签:python ocr python-tesseract

我目前正在用 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}")

这是我正在处理的图像的一小部分,原始图像要大得多,但格式保持相似。

small image


好的,我可以帮助优化 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

相关文章

  • Python保存字典类型数据到文件的三种方法
    1、在Python中使用pickle模块的dump函数将字典保存到文件中importpicklemy_dict={'Apple':4,'Banana':2,'Orange':6,'Grapes':11}#保存文件withopen("myDictionary.pkl","wb")astf:pickle.dump(my_dict,tf)......
  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-53- 处理面包屑(详细教程)
    1.简介面包屑(Breadcrumb),又称面包屑导航(BreadcrumbNavigation)这个概念来自童话故事“汉赛尔和格莱特”,当汉赛尔和格莱特穿过森林时,不小心迷路了,但是他们发现沿途走过的地方都撒下了面包屑,让这些面包屑来帮助他们找到回家的路。所以,面包屑导航的作用是告诉访问者他们在网站中......
  • 如何使用 Python 在 Telegram 中进行标签搜索
    Telegram最近添加了一项新功能,可以在所有公共频道中同时按主题标签进行搜索:https://telegram.org/blog/message-effects-and-more#hashtag-search如何进行此类搜索用蟒蛇?(Telethon,Python-Telegram-Bot,...)我在Telethon文档中找到了这个函数:https://tl.......
  • 使用 Python 构建一个简单的 REST API
    使用Python构建一个简单的RESTAPI简介本文档将引导您使用Python和Flask框架构建一个简单的RESTAPI。我们将创建一个API,用于管理一个虚拟的书籍数据库。准备工作Python环境:确保您的系统上安装了Python3.x。Flask框架:使用pip安装Flask:pipinstallFla......
  • python学习之闭包与装饰器
    一、闭包闭包允许一个函数访问并操作函数外部的变量(即父级作用域中的变量),即使在该函数外部执行。特性:(1)外部函数嵌套内部函数。(2)外部函数可以返回内部函数。(3)内部函数可以访问外部函数的局部变量。defout():print("我是外层")n=10defins():......
  • 如何正确处理Python中的可选功能
    我正在开发实现科学模型的python包,我想知道处理可选功能的最佳方法是什么。这是我想要的行为:如果无法导入某些可选依赖项(例如,在无头机器上绘制模块),我想在我的类中禁用使用这些模块的功能,警告用户如果他尝试使用它们以及所有这些,而不会破坏执行。所以下面的脚本在任何情况下......
  • 在Python中,对于一个数字列表,如何找到具有最大和的数字的连续子集范围?
    输入的一个示例可能是nums1=[-1,4,-3,5,-5]nums2=[-1,4]我想知道这里什么可能是有效的解决方案。谢谢。defmax_subarray_sum_range(nums):"""找到数字列表中具有最大和的连续子集范围。Args:nums:数字列表。Returns:一个包含最大和子集起......
  • 如何安装mysqlclient 1.4.6? (Python 3.6)MacO?
    我安装pipinstallmysqlclient==1.4.6--no-cache-dir但是出现错误:ld:library'ssl'notfoundclang:error:linkercommandfailedwithexitcode1(use-vtoseeinvocation)error:command'clang'failedwithexitstatus......
  • Numpythonic 方式从所需的时间步长和窗口大小构造窗口向量
    给定参数timestep=2window_size=3我已经展平了大小为9的时间序列向量。内容是:arr=np.array([1,2,3,4,5,6,7,8,9])如何使用这些参数重塑/构造窗口时间序列?我希望输出具有形状unknown,window_size)所以,它的输出将是这样的矩阵:windowed_arr=np......
  • Python - 检测字母模式而不迭代所有可能的组合
    对于可能不太有用的标题,我表示歉意,我不知道如何将这个问题总结为一句话。我正在尝试计算Python3.10中一个单词有多少个“单位”长。一个“单位”是(C表示辅音,V表示元音)CV或VC或C或V(后两者仅在没有配对时使用)可以制作)。例如,“件”将为三个单位......