OCR识别表格中的参数及参数值

news/2025/11/7 7:56:03/文章来源:https://www.cnblogs.com/jicing/p/18717927

一、需求

识别固定表格中的文字,输出表格中的参数字典

二、整体思路

  1. 找到一张含有表格的图片,利用mac自带的预览工具分析出图片每个单元格的对角线坐标,
  2. 使用程序根据图片文件和对角线坐标数组,分割图片为很多个小图片,
  3. 采用tesseract库识别单个单元格中的文字,并将识别出来的所有文字输出到同一个文本文件中。

三、开发环境准备

Mac上安装VSCode,VSCode中安装python扩展,使用venv这个python自带的虚拟环境,建立测试venv工作区后利用.venv/bin/pip3安装tesseract和pillow类库

.venv/bin/pip3 install pillow
.venv/bin/pip3 install tesseract

.venv/bin/pip3 install pytesseract
.venv/bin/pip3 install opencv-python
.venv/bin/pip3 install numpy
.venv/bin/pip3 install scikit-image

 

四、开发步骤

建立根目录及相关功能目录,并使用VSCode打开根目录

 编写图片分割程序

 1 import os
 2 from PIL import Image
 3 
 4 img = "imgs2txt/imgs/合格证.jpg"
 5 pix_a = [(20,3,428,20),     (428,3,700,20),
 6          (20,20+1,428,20*2),(428,20+1,700,20*2)]
 7 
 8 def cut_by_pix_a(img, xys):
 9     number_of_pic = len(xys)
10     image = Image.open(img)
11     print(f'这个图像是{image.width} x {image.height}')
12     name1, name2 = os.path.dirname(img) + "/splits/" ,os.path.basename(img).split(".")[-2]+"_cut_"
13     for p in xys:
14         name3 = name1+name2+str(p)+".jpg"
15         im2 = image.crop(p)
16         im2.save(name3)
17     print(f"一共完成了{len(xys)}个文件.")
18 
19 cut_by_pix_a(img, pix_a)

编写图片增强处理器

分割后发现图片非常模糊识别时,汉子无法识别出来,所以编写图片锐化程序,提高图片识别精度

import cv2
import numpy as np
from skimage import filtersdef preprocess_image_old(img_path):img = cv2.imread(img_path)# 1.灰度化gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 2.去操(中值滤波)denoised = cv2.medianBlur(gray, 3)# 3.自适应二值化binary = cv2.adaptiveThreshold(denoised, 255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 11, 2)# 4.锐化处理(拉普拉斯算子)kernel = np.array([[0, -1, 0], [-1, 5,-1], [0, -1, 0]])sharpened = cv2.filter2D(binary, -1, kernel)# 5.形态学操作(去除小噪点)kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))cleaned = cv2.morphologyEx(sharpened, cv2.MORPH_OPEN, kernel)return cleaneddef preprocess_image(img_path):img = cv2.imread(img_path)# 1.灰度化# gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 1.去操(中值滤波)denoised = cv2.medianBlur(img, 3)# 2.自适应二值化binary = cv2.adaptiveThreshold(denoised, 255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 11, 2)# 3.锐化处理(拉普拉斯算子)kernel = np.array([[0, -1, 0], [-1, 5,-1], [0, -1, 0]])sharpened = cv2.filter2D(binary, -1, kernel)# 5.形态学操作(去除小噪点)kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))cleaned = cv2.morphologyEx(sharpened, cv2.MORPH_OPEN, kernel)return cleanedimg1_path = 'imgs2txt/imgs/splits/合格证_cut_(20, 3, 106, 20).jpg'
r = preprocess_image(img1_path)
cv2.imwrite('imgs2txt/imgs/cleaned/合格证_cut_(20, 3, 106, 20).jpg', r)
print(r)

 

 

编写单个图片识别程序

 
import pytesseract
from PIL import Imageimg1_path = 'imgs2txt/imgs/splits/合格证_cut_(20, 3, 106, 20).jpg'def basic_ocr(img_path):img = Image.open(img_path)text = pytesseract.image_to_string(img, lang='chi_sim')return textdef advanced_ocr(img_path):custom_config = r'--oem 3 --psm 6 -c tessedit_char_whitelist=0123456789'text = pytesseract.image_to_string(Image.open(img_path),lang='chi_sim',config=custom_config)return textprint("基本识别结果" + basic_ocr(img1_path))
print("高级识别结果" + advanced_ocr(img1_path))

 

待处理的图片

 

......未完待续

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/884654.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H800 Nvlink 基础环境配置(Ubuntu20.04 )

H100/800 SXM的8卡服务器在配置多机互联环境时,除了要安装Nvidia的GPU驱动,还需要安装FabricManager。 Nvidia 提供了在线安装和离线安装两种方式。Z项目H800 NVL 基础环境配置(Ubuntu20.04 ) 操作系统基础安装 配置源 本操作在Ubuntu 20.04下完成, 所有命令都以root身份执行…

matrix 初体验

License CC BY-NC-SA 4.0 本文包含 AI 生成的内容。它们会用 斜体 标注。想象一下,在一个充满隐私泄露和数据监控的世界里,你还能找到一个真正属于你的通讯空间吗?Matrix 就是这样一个革命性的选择!它不仅仅是一个即时通讯工具,而是一场对自由、安全和隐私的捍卫。Matrix …

知识蒸馏方法探究:Google Distilling Step-by-Step 论文深度分析

大型语言模型 (Large Language Models, LLMs) 的发展日新月异。从最初的简单对话系统,到如今能够执行文本生成、语言翻译和代码编写等复杂任务的先进模型,LLM 技术实现了跨越式的进步。 然而这些模型的规模和计算需求也呈指数级增长。它们需要大量的计算资源、专用硬件设施以…

题解:P3544 [POI 2012] BEZ-Minimalist Security

前言 模拟赛中因为判无解判错了错一个点再次喜提 \(0\) 分。 思路 不难想到,对于一个联通块,确定一个点的值,这个联通块其它的点的值都确定了,当然无法确定就是无解。 考虑优化上诉过程,容易发现合法的取值一定是一段区间,我们想做到在 \(i\) 最终值为 \(0\) 时,最少加多…

题解:P6645 [CCO 2020] Interval Collection

前言 我在模拟赛中把单 \(\log\) 实现为了双 \(\log\),即对于每个线段树节点开了四个优先队列,获得了 \(0\) 分超空的好成绩。 思路 我们先把每次操作给出的区间 \(r-1\)。 首先分析发现,如果存在不交区间,则优先选不交区间,这样就有 \(0\) 个不合法的。 否则,剩下的区间…

c_note

c笔记一、变量 1、变量的声明 ​ 变量的声明是给编译器看的,告诉编译器变量的类型以及名字等相关的信息。 格式:数据类型 变量名; 变量的声明显然是一个编译时概念,所以它和程序的运行没有太大的关系。 一个变量具有声明,并不意味着该变量会在运行时期分配内存空间。 2、…

SQL语句规范书写

SQL 编写规范核心原则清晰易读:代码是给人看的,其次才是机器执行。性能优先:避免低效语法,减少数据库负担。安全可靠:防范 SQL 注入等风险。统一风格:团队协作时保持格式一致。✨ 格式规范 1. 关键字统一大写-- 正确 ✅ SELECT id, name FROM users WHERE age > 18;--…

Drasi Sources SDK

什么是Drasi数据源(Source)?Source提供了与系统的连接,Drasi 可以将这些系统视为变化源。source 在 Drasi 中执行三个重要功能:处理源系统生成的更改日志/源,并将这些更改推送到使用该源作为输入的每个连续查询。 将源更改数据转换为一致的属性图数据模型,以便订阅的 Co…