图像标注与OCR工具分析

图像标注和OCR(光学字符识别)工具的代码进行详细分析。该工具允许用户在图像上进行矩形标注,使用 OCR 对标注区域进行文本识别,并将结果保存为 Excel 文件。同时,用户可以保存和加载标注,清除标注,以及裁剪图像等。
C:\pythoncode\new\scipgetpersoninfofromphoto.py

项目简介

这个图像标注和OCR工具的功能主要包括:

  1. 加载图像并显示在界面上。
  2. 允许用户在图像上绘制矩形框,以标注感兴趣的区域。
  3. 在标注区域内执行OCR识别,并显示识别的文本。
  4. 将OCR识别结果保存为Excel文件。
  5. 保存和加载用户的标注数据(JSON格式)。
  6. 提供裁剪、清除标注、重置图像等功能。
1. 图像加载与显示

首先,程序会扫描指定文件夹中的图像文件(支持的格式包括 .png, .jpg, .jpeg, .bmp, .tiff),并显示在界面的图像面板中。

self.image_files = [f for f in os.listdir(folder_path) 
                    if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.tiff'))]

通过 wx.ListBox 组件显示图像文件的列表,用户可以点击选择一个文件,然后加载并显示它:

file_path = os.path.join(self.folder_path, filename)
self.original_image = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), cv2.IMREAD_COLOR)
self.original_image = cv2.cvtColor(self.original_image, cv2.COLOR_BGR2RGB)

这段代码使用 OpenCV 读取图像,并转换颜色空间以适应 wxPython 显示。

2. 矩形标注

用户可以在图像上绘制矩形框,标记感兴趣的区域。程序通过鼠标事件(按下、移动、松开)来绘制和更新矩形框:

def on_mouse_down(self, event):
    """鼠标按下开始绘制矩形"""
    if self.displayed_image is not None:
        self.start_point = event.GetPosition()
        self.drawing = True

def on_mouse_move(self, event):
    """鼠标移动时更新矩形"""
    if self.drawing and self.displayed_image is not None:
        self.image_panel.Refresh()

def on_mouse_up(self, event):
    """鼠标松开完成矩形绘制"""
    if self.drawing and self.displayed_image is not None:
        end_point = event.GetPosition()
        # 确保矩形方向正确
        x1 = min(self.start_point.x, end_point.x)
        y1 = min(self.start_point.y, end_point.y)
        x2 = max(self.start_point.x, end_point.x)
        y2 = max(self.start_point.y, end_point.y)
        orig_rect = self.convert_to_original_coords((x1, y1, x2, y2))
        self.rectangles.append(orig_rect)
        self.drawing = False
        self.image_panel.Refresh()

on_mouse_down 中,用户点击图像开始绘制矩形框,on_mouse_move 用于实时更新矩形的形状,on_mouse_up 在用户松开鼠标时完成矩形的绘制。

3. OCR识别

标注完成后,用户可以点击“识别”按钮,程序会对标注区域进行OCR识别。OCR处理通过 pytesseract 库实现:

text = pytesseract.image_to_string(
    pil_image, 
    lang='chi_sim',  # 中文简体
    config='--psm 6 --oem 3'  # 更精确的文本块处理
)

识别结果会显示在文本框中,并且可以将识别的结果保存为Excel文件:

if ocr_results:
    df = pd.DataFrame({'识别区域': range(1, len(ocr_results) + 1), '识别文本': ocr_results})
    output_path = os.path.join(self.folder_path, f'{self.current_filename}_ocr_results.xlsx')
    df.to_excel(output_path, index=False, engine='openpyxl')

使用 pandas 库将识别结果保存为Excel文件,方便后续查看和处理。

4. 标注的保存与加载

程序还允许用户将标注区域保存为 JSON 格式,以便下次加载时使用。这是通过以下方式实现的:

annotations_data = {
    'filename': self.current_filename,
    'rectangles': self.rectangles
}
json_path = os.path.join(self.folder_path, f'{self.current_filename}_annotations.json')
with open(json_path, 'w', encoding='utf-8') as f:
    json.dump(annotations_data, f)

标注文件会根据图像的文件名命名,以便与图像文件对应。加载标注时,程序会读取 JSON 文件并恢复之前的标注状态:

with open(json_path, 'r', encoding='utf-8') as f:
    annotations_data = json.load(f)
if annotations_data['filename'] == self.current_filename:
    self.rectangles = annotations_data['rectangles']
5. 裁剪与重置图像

裁剪功能允许用户裁剪图像的选定区域。用户完成矩形绘制后,点击“裁剪”按钮,程序会根据最后一个矩形进行图像裁剪:

cropped = self.current_image[y1:y2, x1:x2].copy()

如果需要重置图像,用户可以点击“重置图像”按钮,程序将恢复到原始图像状态。

6. UI组件与布局

wxPython 的布局管理使得界面整洁易用。主界面分为文件列表、图像显示区域和操作按钮区域三个部分。文件列表用于选择图像,图像显示区域展示图像并允许标注,按钮区域提供裁剪、标注、OCR识别等操作。

file_list_sizer = wx.BoxSizer(wx.VERTICAL)
self.file_listbox = wx.ListBox(panel, choices=self.image_files, style=wx.LB_SINGLE)
file_list_sizer.Add(self.file_listbox, 1, wx.EXPAND | wx.ALL, 10)

通过 BoxSizer 管理不同控件的布局,使得界面更加模块化和灵活。

运行结果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Node.js从零搭建DeepSeek本地部署(Express框架、Ollama)

目录 1.安装Node.js和npm2.初始化项目3.安装Ollama4.下载DeepSeek模型5.创建Node.js服务器6.运行服务器7.Web UI对话-Chrome插件-Page Assist 1.安装Node.js和npm 首先确保我们机器上已经安装了Node.js和npm。如果未安装,可以通过以下链接下载并安装适合我们操作系…

基于粒子群算法的配电网重构

一、配电网重构原理 定义: 配电网重构是指在满足运行约束的前提下,通过改变开关状态优化配电网性能,提高系统的经济效益和运行效率。 拓扑约束: 配电网必须保持径向拓扑,避免环网或孤岛。采用算法控制开关状态的选择&…

下载Hugging Face模型的几种方式

1.网页下载 直接访问Hugging Face模型页面,点击“File and versions”选项卡,选择所需的文件进行下载。 2.使用huggingface-cli 首先,安装huggingface_hub: pip install huggingface_hub 然后,使用以下命令下载模型&#xff1…

【Dubbo+Zookeeper】——SpringBoot+Dubbo+Zookeeper知识整合

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

DeepSeek R1 学习笔记

DeepSeek为了方便大众的使用,同时提供了6个蒸馏版本 DeekSeek使用方式 1.大众方式: 网页版:DeepSeek App版:手机各大应用商店下载安装DeepSeek-AI智能对话助手 2.专业用户 开发者:调用API DeepSeek服务器 网址&a…

《从零构建企业级容器镜像生态:Harbor与Registry双星架构实战手记》

目录 一、企业级镜像中枢:Harbor架构深度解析 1.Harbor介绍 环境准备 2. Harbor战略部署 下载安装Harbor 关键配置文件 报错一 添加本地解析 登录测试Harbor 报错二 登录成功 测试 成功显示 二、轻量化镜像驿站:Registry闪电战部署 简单介…

FPGA之USB通信实战:基于FX2芯片的Slave FIFO回环测试详解

FPGA之Usb数据传输 Usb 通信 你也许会有疑问,明明有这么多通信方式和数据传输(SPI、I2C、UART、以太网)为什么偏偏使用USB呢? 原因有很多,如下: 1. 高速数据传输能力 高带宽:USB接口提供了较高的数据传…

mysql中in和exists的区别?

大家好,我是锋哥。今天分享关于【mysql中in和exists的区别?】面试题。希望对大家有帮助; mysql中in和exists的区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中,IN 和 EXISTS 都用于进行子查询,但它…

Unity摄像机跟随物体

功能描述 实现摄像机跟随物体,并使物体始终保持在画面中心位置。 实现步骤 创建脚本:在Unity中创建一个新的C#脚本,命名为CameraFollow。 代码如下: using UnityEngine;public class CameraFollow : MonoBehaviour {public Tran…

springcloud sentinel教程

‌QPS(Queries Per Second)即每秒查询率 TPS,每秒处理的事务数目 PV(page view)即页面浏览量 UV 访问数(Unique Visitor)指独立访客访问数 一、初识Sentinel 什么是雪崩问题? 微服务之间相…

【Tools】Windows下Git 2.48安装教程详解

00. 目录 文章目录 00. 目录01. Git简介02. Git参考资料03. Git安装04. Git测试05. 附录 01. Git简介 Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 [1] Git 是 Linus Torvalds 为了帮助管理 Linux 内核…

【Linux系统编程】初识系统编程

目录 一、什么是系统编程1. 系统编程的定义2. 系统编程的特点3. 系统编程的应用领域4. 系统编程的核心概念5. 系统编程的工具和技术 二、操作系统四大基本功能1. 进程管理(Process Management)2. 内存管理(Memory Management)3. 文…

神经网络|(十四)|霍普菲尔德神经网络-Hebbian训练

【1】引言 前序学习进程中,除了对基本的神经网络知识进行了学习,还掌握了SOM神经网络原理,文章链接包括且不限于: 神经网络|(十一)|神经元和神经网络-CSDN博客 神经网络|(十二)|常见激活函数-CSDN博客 神经网络|(十三)|SOM神经…

Hive八股

Hive八股 说一下GC模型遇到过gc调优吗yarn有哪些了解讲讲hqI转化为MR源码hbase读写流程hive数据倾斜page cache和buffer的区别和相同近来你关注了大数据生态哪些领域的发展,比如新的feature,新的领域等 Hive1Hive1hive简介2hive架构3hive与Hadoop的关系4…

Docker 部署 Graylog 日志管理系统

Docker 部署 Graylog 日志管理系统 前言一、准备工作二、Docker Compose 配置三、启动 Graylog 服务四、访问 Graylog Web 界面总结 前言 Graylog 是一个开源的日志管理平台,专为实时日志收集、分析和可视化设计。它支持强大的搜索功能,并且与 Elastics…

im即时聊天客服系统SaaS还是私有化部署:成本、安全与定制化的权衡策略

随着即时通讯技术的不断发展,IM即时聊天客服系统已经成为企业与客户沟通、解决问题、提升用户体验的重要工具。在选择IM即时聊天客服系统时,企业面临一个重要决策:选择SaaS(软件即服务)解决方案,还是进行私…

MySQL(单表)知识点

文章目录 1.数据库的概念2.下载并配置MySQL2.1初始化MySQL的数据2.2注册MYSQL服务2.3启动MYSQL服务2.4修改账户默认密码2.5登录MYSQL2.6卸载MYSQL 3.MYSQL数据模型3.1连接数据库 4.SQL简介4.1SQL的通用语法4.2SQL语句的分类4.3DDL语句4.3.1数据库4.3.2表(创建,查询,修改,删除)4…

同为科技智能PDU在数据中心场景的应用与解决方案

数据中心当前处于一个快速发展和技术变革的特殊时期,全新的人工智能应用正在重塑整个世界,为社会带来便捷的同时,也为数据中心的发展带来了新的机遇和挑战。智能算例的爆发式增长,对数据中心提出了大算力、高性能的新需求&#xf…

基于Asp.net的零食购物商城网站

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

Redis|Springboot集成Redis

文章目录 总体概述本地Java连接Redis常见问题集成Jedis集成lettuce集成RedisTemplate——推荐使用连接单机连接集群 总体概述 jedis-lettuce-RedisTemplate三者的联系 jedis第一代lettuce承上启下redistemplate着重使用 本地Java连接Redis常见问题 bind配置请注释掉保护模式…