使用 pytesseract 进行 OCR 识别:以固定区域经纬度提取为例

引言

在智能交通、地图定位等应用场景中,经常会遇到需要从图像中提取经纬度信息的需求。本篇文章将介绍如何利用 Python 的 pytesseract 库结合 PIL 对图像进行预处理,通过固定区域裁剪,来有效地识别出图像上显示的经纬度信息。

1. OCR 与 pytesseract 简介

OCR(Optical Character Recognition,光学字符识别)技术能够将图片中的文字信息转换成可编辑的文本。Tesseract 是一款开源的 OCR 引擎,功能强大且准确率较高;而 pytesseract 则是其 Python 封装,可以方便地在 Python 项目中调用 Tesseract 进行识别。

在我们的示例中,我们主要针对图像上固定位置的经纬度区域进行处理与识别。由于经纬度中只包含数字、小数点、°、N、S、E、W 等字符,我们可以通过设置 白名单 限制识别字符,从而提高识别准确率

2.示例代码

下面给出完整示例代码,并附带详细的注释说明每一步的实现逻辑:

import time
import pytesseract
from PIL import Image, ImageFilter, ImageEnhanceclass OCRReader:def __init__(self, center_x, center_y, width, height, sharpness=2.0, contrast=2.0, blur_radius=1):"""初始化 OCRReader 类,使用中心点和宽高设置裁剪区域的参数,并配置图像预处理的超参数。参数:center_x (int): 经度/纬度信息区域中心点的 x 坐标(从左向右)center_y (int): 经度/纬度信息区域中心点的 y 坐标(从上向下)width (int): 裁剪区域的宽度height (int): 裁剪区域的高度sharpness (float): 锐化处理的增强系数,数字越大效果越明显contrast (float): 对比度增强系数,数字越大表示对比度越明显blur_radius (float): 高斯模糊的半径,主要用于图像降噪"""self.center_x = center_xself.center_y = center_yself.width = widthself.height = heightself.sharpness = sharpnessself.contrast = contrastself.blur_radius = blur_radius# 对于经纬度,白名单中仅包含数字、°、小数点以及方向字符self.whitelist = "0123456789°.NSEW"def preprocess_image(self, img):"""对裁剪后的图像进行预处理:包括图像的锐化、对比度增强以及高斯模糊降噪。参数:img (Image): PIL 图像对象返回:Image: 预处理后的图像对象"""# 锐化处理,增强图像细节sharpener = ImageEnhance.Sharpness(img)img = sharpener.enhance(self.sharpness)# 增强对比度,使文字更明显enhancer = ImageEnhance.Contrast(img)img = enhancer.enhance(self.contrast)# 应用高斯模糊降噪if self.blur_radius > 0:img = img.filter(ImageFilter.GaussianBlur(self.blur_radius))return imgdef read_coordinates(self, image_path):"""从给定图像文件中提取经纬度信息。参数:image_path (str): 图像文件的路径返回:str: OCR 识别出的文本"""# 加载图像img = Image.open(image_path)# 如果图像带有透明度,则将其转换为 RGB 模式(填充背景为白色)if img.mode == 'RGBA':background = Image.new('RGB', img.size, (255, 255, 255))background.paste(img, mask=img.split()[3])img = backgroundelif img.mode == 'LA':background = Image.new('L', img.size, 255)background.paste(img, mask=img.split()[1])img = background.convert('RGB')# 根据中心点坐标和宽高,计算出裁剪区域的左上角和右下角坐标left = self.center_x - self.width // 2top = self.center_y - self.height // 2right = self.center_x + self.width // 2bottom = self.center_y + self.height // 2# 裁剪图像得到经纬度显示区域cropped_img = img.crop((left, top, right, bottom))cropped_img.save('sub_img.jpg')  # 保存裁剪后的图像,便于调试# 对裁剪后的图像进行预处理processed_img = self.preprocess_image(cropped_img)processed_img.save('processed_sub_img.jpg')  # 保存预处理后的图像,便于调试# 配置 Tesseract 的识别参数:# --psm 6 表示将图像看作单一文本块# tessedit_char_whitelist 限定识别的字符集custom_config = f'--psm 6 -c tessedit_char_whitelist={self.whitelist}'result = pytesseract.image_to_string(processed_img, config=custom_config, timeout=1)return result# 示例使用
if __name__ == '__main__':ocr_reader = OCRReader(center_x=1440, center_y=802, width=204, height=20)t1 = time.time()result = ocr_reader.read_coordinates('./ocr_test.png')print("\n识别结果:", result)print(f"Time: {time.time() - t1}")

2.1 类的初始化与参数设定

  • center_x 与 center_y:代表图像中经纬度展示区域的中心坐标。
  • width 与 height:定义裁剪区域的尺寸。
  • sharpness、contrast 和 blur_radius:预处理步骤中用于改善图像质量的参数。
  • whitelist:指定 OCR 识别时只允许出现的字符,本例中仅包含经纬度所必需的字符。

2.2 图像预处理

预处理步骤主要有三个:

  • 锐化:通过 ImageEnhance.Sharpness 增加图像的细节,帮助提高文字的边缘清晰度。
  • 对比度增强:利用 ImageEnhance.Contrast 调整图像的对比度,使目标文字更醒目。
  • 高斯模糊:适当的模糊可以起到降噪的作用,有利于提高 OCR 的识别率。

2.3 裁剪与 OCR 识别

  • 裁剪区域计算:通过中心点和尺寸参数计算出目标区域的四个边界的坐标,然后使用 crop 方法裁剪图像。
  • 透明度处理:有的图像可能带有透明通道(如 PNG 图片),通过转换为 RGB 模式确保 OCR 引擎能够正确处理。
  • OCR 参数配置:设置 --psm 6 以适应单一文本块的场景,并通过白名单限制识别字符范围,进一步提高识别准确性。
  • 超时设置:timeout=1 参数确保在识别超时时不会阻塞程序。
    在这里插入图片描述

3. 总结与扩展

通过本文示例,我们展示了如何利用 pytesseract 进行专门的区域 OCR 识别,并结合图像预处理技术提升识别率。在实际项目中,你可以根据图像质量和识别场景进一步调整预处理参数,比如增加二值化处理、去背景等操作。

此外,若图像中包含不同区域的文本信息,可扩展代码实现批量处理和区域定位,从而用于更大规模的自动化识别任务。

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

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

相关文章

docker安装和卸载

服务器系统:Ubuntu Server 18.04.2 64bit 1 安装docker: 1.1 在线安装 1.# yum install docker 1.2 离线安装 https://download.csdn.net/download/qq_27106141/90477700 1.# docker-18.03.1-ce.tgz 1.2.1 解压 tar -xzvf docker-18.03.1-ce.tgz 1.2.2…

机器人交互系统 部署构建

环境要求 Ubuntu 20.04 或更高版本ROS Noetic 或兼容版本Python 3.8 安装步骤 1. 安装ROS环境(如未安装) sudo apt update sudo apt install ros-noetic-desktop-full source /opt/ros/noetic/setup.bash2. 创建工作空间并克隆代码 mkdir -p ~/code…

【Go每日一练】构建一个简单的用户信息管理系统

👻创作者:丶重明 👻创作时间:2025年3月7日 👻擅长领域:运维 目录 1.😶‍🌫️题目:简单的用户信息管理系统2.😶‍🌫️代码开发3.😶‍&a…

全员DeepSeek时代,前端能做些什么?

全员DeepSeek时代,前端能做些什么? 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc #mermaid-svg-VNyL95jkz9jEXgUq {font-family:&…

Machine Learning: 十大基本机器学习算法

机器学习算法分类:监督学习、无监督学习、强化学习 基本的机器学习算法: 线性回归、支持向量机(SVM)、最近邻居(KNN)、逻辑回归、决策树、k平均、随机森林、朴素贝叶斯、降维、梯度增强。 机器学习算法大致可以分为三类: 监督学习算法 (Sup…

【Linux docker 容器】关于想要让虚拟机在开机时候也docker自己启动,容器也自己启动,省去要自己开docker和容器

确认 Docker 服务状态: 首先,你需要确保 Docker 服务已经在虚拟机上安装并正确配置。你可以使用如下命令来检查 Docker 服务的状态: systemctl status docker.service 如果服务没有运行,你可以使用以下命令启动它: s…

前端系统测试(单元、集成、数据|性能|回归)

有关前端测试的面试题 系统测试 首先,功能测试部分。根据资料,单元测试是验证最小可测试单元的正确性,比如函数或组件。都提到了单元测试的重要性,强调其在开发早期发现问题,并通过自动化提高效率。需要整合我搜索到的资料中的观点,比如单元测试的方法(接口测试、路径覆…

linux 命令 ls

ls 是 Linux 系统中用于列出目录内容的核心命令,几乎所有日常操作都会用到。以下是其详细用法和常见场景说明 1. 基础语法 ls [选项] [目录/文件] 不指定目录时,默认列出当前目录的内容。 可以指定文件或目录路径,支持通配符(如…

CI/CD—GitLab部署

GitLab简介: GitLab 是一个用于代码托管和软件开发协作的平台,在全球开发者社区及企业中应用广泛,以下是对它的详细介绍: 主要功能 代码托管:提供了基于 Git 的代码仓库管理功能,支持创建、克隆、推送、…

ubuntu软件

视频软件,大部分的编码都能适应 sudo apt install vlc图片软件 sudo apt install gwenview截图软件 sudo apt install flameshot设置快捷键 flameshot flameshot gui -p /home/cyun/Pictures/flameshot也就是把它保存到一个自定义的路径 菜单更换 sudo apt r…

Easysearch 使用 AWS S3 进行快照备份与还原:完整指南及常见错误排查

Easysearch 可以使用 AWS S3 作为远程存储库,进行索引的快照(Snapshot)备份和恢复。同时,Easysearch 内置了 S3 插件,无需额外安装。以下是完整的配置和操作步骤。 1. 在 AWS S3 上创建存储桶 登录 AWS 控制台&#x…

【系统架构设计师】性能评估

目录 1. 说明2. 基准测试程序3. Web服务器的性能评估4. 系统监视5. 例题5.1 例题1 1. 说明 1.性能评估是为了一个目的,按照一定的步骤,选用一定的度量项目,通过建模和实现,对一个系统的性能进行各项检测,对测试结果做…

动态规划-第2篇

前言:在上一篇文章中,我们了解了动态规划的基本概念和解决问题的基本思路。通过分解问题、存储子问题的解,动态规划为我们提供了高效的解决方案。然而,动态规划并不是一成不变的,它有很多不同的技巧和变种,…

基于Redis实现限流

限流尽可能在满足需求的情况下越简单越好! 1、基于Redsi的increment方法实现固定窗口限流 Redis的increment方法保证并发线程安全窗口尽可能越小越好(太大可能某一小段时间就打满请求剩下的都拿不到令牌了)这个原理其实就是用当前时间戳然后除窗口大小 在这个窗口大…

【工具使用】IDEA 社区版如何创建 Spring Boot 项目(详细教程)

IDEA 社区版如何创建 Spring Boot 项目(详细教程) Spring Boot 以其简洁、高效的特性,成为 Java 开发的主流框架之一。虽然 IntelliJ IDEA 专业版提供了Spring Boot 项目向导,但 社区版(Community Edition&#xff09…

探索高性能AI识别和边缘计算 | NVIDIA Jetson Orin Nano 8GB 开发套件的全面测评

随着边缘计算和人工智能技术的迅速发展,性能强大的嵌入式AI开发板成为开发者和企业关注的焦点。NVIDIA近期推出的Jetson Orin Nano 8GB开发套件,凭借其40 TOPS算力、高效的Ampere架构GPU以及出色的边缘AI能力,引起了广泛关注。本文将从配置性…

紧急救援!MySQL数据库误删后的3种恢复方案

一、误删场景分类与恢复策略 ‌常见误操作场景‌: DROP TABLE 误删单表(高频事故)DELETE 误删数据(可通过事务回滚抢救)DROP DATABASE 删除整个库(需全量备份)服务器rm -rf(物理文件删除)‌恢复方案选择矩阵‌: 场景推荐方案时间窗口表结构删除(DROP)备份恢复 + B…

开源免费日志服务ELK Syack代替syslog

一、ELK Stack 采集 syslog 日志的主要方式 通常,ELK Stack 使用 Logstash 或者 Filebeat 来采集 syslog 日志。 Beats 通常更轻量级,适合作为代理部署在各个日志源服务器上,而 Logstash 则功能更强大,可以进行更复杂的日志处理和…

单片机设计暖脚器研究

标题:单片机设计暖脚器研究 内容:1.摘要 本文聚焦于基于单片机设计暖脚器的研究。背景方面,在寒冷季节,暖脚器能有效改善脚部寒冷状况,提升人们的舒适度,但传统暖脚器存在功能单一、温控不准确等问题。目的是设计一款智能、高效且…

蓝桥杯省赛真题C++B组2024-握手问题

一、题目 【问题描述】 小蓝组织了一场算法交流会议,总共有 50 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手(且仅有一次)。但有 7 个人,这 7 人彼此之间没有进行握手(但这…