当前位置:   article > 正文

Python识别图片内文字,正则表达式处理数据_使用python写一段代码,识别我放在文件夹里的图片,识别出图片的文字信息并打印输出

使用python写一段代码,识别我放在文件夹里的图片,识别出图片的文字信息并打印输出

介绍

本文将介绍如何使用PyQt5开发一个提取工具,该工具可以从指定文件夹中的图片中提取出指定格式的文本信息,并按照指定规则进行排序和去重,最终输出为txt文件。在开发过程中,我们将会学习到以下内容:

  • PyQt5界面搭建方法
  • 使用Pytesseract库提取图片中的文本信息
  • 正则表达式的使用
  • 文件读写操作

工具特点

  • 支持选择指定路径的文件夹。
  • 支持识别多种图片格式,包括.jpg、.jpeg、.png、.bmp。
  • 支持选择不同的正则表达式规则。
  • 支持按照指定规则对提取结果进行排序和去重。
  • 支持输出为txt文本。

界面预览

界面包含三个主要组件:

  • 文件夹路径输入框:用于输入需要处理的文件夹路径。
  • 识别规则下拉菜单:用于选择需要使用的正则表达式规则。
  • 提取结果显示区域:用于显示提取出的文本信息和最终处理结果。

代码实现

我们将代码分为两个部分,第一部分是PyQt5界面的搭建和逻辑的实现,第二部分是文本识别和数据处理的实现。

PyQt5界面的搭建和逻辑的实现

首先需要引入必要的库:

import os
import re
import sys

from PyQt5 import QtCore, QtGui, QtWidgets
import pytesseract
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

然后定义一个Ui_Form类,用于设置界面的布局和初始化控件。

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(466, 283)
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(180, 240, 93, 28))
        self.pushButton.setObjectName("pushButton")
        self.lineEdit = QtWidgets.QLineEdit(Form)
        self.lineEdit.setGeometry(QtCore.QRect(150, 20, 201, 31))
        self.lineEdit.setObjectName("lineEdit")
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(10, 30, 131, 16))
        self.label.setObjectName("label")
        self.comboBox = QtWidgets.QComboBox(Form)
        self.comboBox.setGeometry(QtCore.QRect(40, 80, 87, 22))
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.textBrowser = QtWidgets.QTextBrowser(Form)
        self.textBrowser.setGeometry(QtCore.QRect(180, 80, 271, 131))
        self.textBrowser.setObjectName("textBrowser")
        self.pushButton_2 = QtWidgets.QPushButton(Form)
        self.pushButton_2.setGeometry(QtCore.QRect(360, 20, 93, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(30, 120, 131, 41))
        self.label_2.setText("")
        self.label_2.setObjectName("label_2")

        self.retranslateUi(Form)
        self.pushButton_2.clicked.connect(Form.get_folder)  # type: ignore
        self.pushButton.clicked.connect(Form.run_ocr)  # type: ignore
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "提取工具"))
        self.pushButton.setText(_translate("Form", "开始提取"))
        self.label.setText(_translate("Form", "获取图片文件路径:"))
        self.comboBox.setItemText(0, _translate("Form", "=1/22."))
        self.comboBox.setItemText(1, _translate("Form", "规则2"))
        self.pushButton_2.setText(_translate("Form", "浏览"))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

接下来是主要的逻辑实现,定义一个MyForm类,继承自QtWidgets.QWidget和Ui_Form,实现两个主要功能:获取文件夹路径和运行OCR程序。

class MyForm(QtWidgets.QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

    def get_folder(self):
        folder_path = QtWidgets.QFileDialog.getExistingDirectory(self, "选取文件夹", "/")
        self.lineEdit.setText(folder_path)

    def run_ocr(self):
        folder_path = self.lineEdit.text()
        if not os.path.isdir(folder_path):
            QtWidgets.QMessageBox.warning(self, "错误", "请指定正确的文件夹路径")
            return

        regex_list = ["[=]\w+[/]\d+", "[=]\w+[/]\d{3}|[=]\w+[/]\d{1}",
                      r'[=]\w+[/]\d+']  # 三种正则表达式
        regex_idx = self.comboBox.currentIndex()
        regex = regex_list[regex_idx]

        file_list = os.listdir(folder_path)
        image_file_list = []
        for filename in file_list:
            file_path = os.path.join(folder_path, filename)
            file_ext = os.path.splitext(file_path)[1].lower()
            if file_ext in ['.jpg', '.jpeg', '.png', '.bmp']:
                image_file_list.append(file_path)

        if len(image_file_list) == 0:
            QtWidgets.QMessageBox.warning(self, "错误", "文件夹内没有图片格式的文件")
            return
        self.label_2.setText("正在提取...")
        QtWidgets.QApplication.processEvents()

        for file_path in image_file_list:
            text = extract_text(file_path)
            append_text_to_file(text, folder_path)
            QtWidgets.QApplication.processEvents()  # 定期处理事件队列,保证应用程序响应性

        result = extract_regex_from_file(regex, folder_path)
        formatted_result = format_list(result)
        self.textBrowser.setText(formatted_result)
        self.label_2.setText("提取完成")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

接下来,我们需要定义一些辅助函数,用于实现主要逻辑中提到的功能。

文本识别和数据处理的实现

首先是使用Pytesseract库提取图片中的文本信息的函数。

def extract_text(file_path: str) -> str:
    return pytesseract.image_to_string(file_path, lang='eng')
  • 1
  • 2

然后是向指定文件夹中的data.txt文件追加文本信息的函数。

def append_text_to_file(text: str, folder_path: str):
    with open(os.path.join(folder_path, 'data.txt'), 'a+', encoding="utf-8") as f:
        f.write(text + '\n')
  • 1
  • 2
  • 3

接下来是使用正则表达式从data.txt文件中提取指定格式文本信息的函数,同时也会将结果输出为txt文件。

def extract_regex_from_file(regex: str, folder_path: str) -> List[str]:
    with open(os.path.join(folder_path, 'data.txt'), 'r', encoding='utf-8') as f:
        content = f.read()
    pattern = re.compile(regex)
    result = pattern.findall(content)
    result = list(set(result))
    result.sort(key=lambda x: (x[1], x[3]))  # 按照序号排序

    # 将结果输出为txt文本
    with open(os.path.join(folder_path, 'result.txt'), 'w', encoding="utf-8") as f:
        f.write('\n'.join(result))

    return result
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

最后一个函数将处理后的数据格式化并返回为字符串,用于显示在界面上。

def format_list(data: List[str]) -> str:
    lines = []
    for item in data:
        lines.append(f'{item}\n')
    return ''.join(lines)
  • 1
  • 2
  • 3
  • 4
  • 5

完整代码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/296005
推荐阅读
相关标签
  

闽ICP备14008679号