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

news2025/3/13 11:43:03

引言

在智能交通、地图定位等应用场景中,经常会遇到需要从图像中提取经纬度信息的需求。本篇文章将介绍如何利用 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, ImageEnhance

class 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_x
        self.center_y = center_y
        self.width = width
        self.height = height
        self.sharpness = sharpness
        self.contrast = contrast
        self.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 img

    def 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 = background
        elif 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 // 2
        top = self.center_y - self.height // 2
        right = self.center_x + self.width // 2
        bottom = 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.coloradmin.cn/o/2314274.html

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

相关文章

【51单片机】程序实验15.DS18B20温度传感器

主要参考学习资料:B站【普中官方】51单片机手把手教学视频 开发资料下载链接:http://www.prechin.cn/gongsixinwen/208.html 单片机套装:普中STC51单片机开发板A4标准版套餐7 目录 DS18B20介绍主要特性内部结构控制时序初始化时序写时序读时序…

Vue项目上传到GitHub,vscode拉取vue项目更新后推送到GitHub上

1、新建Vue项目 2、在GitHub新建仓库 3、留意建立好仓库后提示的命令 4、进入vue项目目录,在空白处点击鼠标右键选择git bash here 5、输入命令 git init git add . git commit -m "注释内容" 输入之前创建GitHub仓库后记下的代码的第一句 git remote…

InternVL:论文阅读 -- 多模态大模型(视觉语言模型)

更多内容:XiaoJ的知识星球 文章目录 InternVL: 扩展视觉基础模型与通用视觉语言任务对齐1.概述2.InternVL整体架构1)大型视觉编码器:InternViT-6B2)语言中间件:QLLaMA。3)训练策略(1&#xff09…

【BUG】类文件具有错误的版本 61.0, 应为 52.0,请删除该文件或确保该文件位于正确的类路径子目录中。

报错: [ERROR] 类文件具有错误的版本 61.0, 应为 52.0 [ERROR] 请删除该文件或确保该文件位于正确的类路径子目录中。 报错截图: 原因:Java 版本和 Spring 不兼容,显示 Spring 版本过高 解决方法 1. 使用更高版本的 J…

康谋应用 | 基于多传感器融合的海洋数据采集系统

在海洋监测领域,基于无人艇能够实现高效、实时、自动化的海洋数据采集,从而为海洋环境保护、资源开发等提供有力支持。其中,无人艇的控制算法训练往往需要大量高质量的数据支持。然而,海洋数据采集也面临数据噪声和误差、数据融合…

双周报Vol.67: 模式匹配支持守卫、LLVM 后端发布、支持 Attribute 语法...多项核心技术更新!

2025-03-10 语言更新 模式匹配支持守卫(Pattern Guard) 模式守卫可以通过在模式后追加 if ... 的语法结构来指定。有模式守卫的分支只有在被模式匹配的值满足对应模式,并且模式守卫为真的情况下才会执行。如果模式守卫为假,则会…

MCP-代码解读TypeScript版本

MCP-代码解读TypeScript版本 文章目录 MCP-代码解读TypeScript版本1-参考网址2-TypeScript代码3-代码解读1-[非重点]定义函数2-[非重点]定义工具说明3-[重点]运行MCP服务 1-参考网址 B站视频参考 2-TypeScript代码 import { McpServer } from "modelcontextprotocol/sd…

写了一个二叉树构造函数和画图函数,方便debug

代码 class TreeNode(object):def __init__(self, val, leftNone, rightNone):self.val valself.left leftself.right rightdef construct_tree(nodes):if not nodes:return Noneroot TreeNode(nodes[0])queue [root]index 1while index < len(nodes):node queue.p…

docker 小记

一、卸载 查看当前版本 docker -v2. 如果有&#xff0c;先停止docker systemctl stop docker如果是yum安装&#xff0c;卸载方式为 #已防版本冲突&#xff0c;直接卸载 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-lat…

G-Star 公益行起航,挥动开源技术点亮公益!

公益组织&#xff0c;一直是社会温暖的传递者&#xff0c;但在数字化浪潮中&#xff0c;也面临着诸多比大众想象中复杂的挑战&#xff1a;项目管理如何更高效&#xff1f;志愿者管理又该如何创新&#xff1f;宣传推广怎么才能更有影响力&#xff1f;内部管理和技术支持又该如何…

k9s入门及实战

概述 k9s&#xff0c;GitHub&#xff0c;是用于管理k8s集群的CLI&#xff0c;提供一个终端UI来与k8s集群进行交互。通过封装kubectl功能&#xff0c;k9s会以特定时间间隔监控k8s的变化&#xff0c;默认为2秒&#xff0c;并提供后续命令来与k8s资源进行交互&#xff0c;k9s可让…

redis增加ip白名单

Redis增加IP白名单 随着互联网的快速发展&#xff0c;网络安全问题也日益凸显。为了保护服务器安全&#xff0c;我们常常需要对访问服务器的IP地址进行限制。而Redis作为一种高性能的缓存数据库&#xff0c;可以用来实现IP白名单功能。本文将介绍如何使用Redis来增加IP白名单&…

git commit messege 模板设置 (规范化管理git)

配置方法 git config --global core.editor vim &#xff08;设置 Git 的默认编辑器为 Vim&#xff09;在用户根目录下&#xff08;~&#xff09;&#xff0c;创建一个.git_commit_msg文件&#xff0c;然后把下面的内容拷贝到文件中并保存。 [version][模块][类型]{解决xxx问题…

Franka机器人ROS 2 发布:赋能机器人研究和行业应用

Franka机器人 ROS 2 发布&#xff1a;赋能机器人研究和行业应用 Franka ROS 2 发布&#xff1a;赋能机器人研究和行业应用 由zlem Odeh 于Franka Robotics 发布 在机器人操作系统 (ROS) 等技术和生态系统的推动下&#xff0c;机器人世界正以前所未有的速度发展。ROS 2 是广受…

docker部署jenkins,安装使用一条龙教程

Jenkins k8s 实现CI/CD 一、简介 1. JenKins是什么? Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。 2. 什么是CI / CD…

短视频下载去水印,用什么工具好?

去除视频和图片水印是许多用户的需求&#xff0c;尤其是在分享或保存内容时。以下是6款超好用的工具&#xff0c;帮助你轻松去除水印&#xff0c;享受纯净的视觉体验&#xff1a; 1. 易下载去水印小程序 特点&#xff1a; 操作简单&#xff0c;支持抖音、快手、小红书、哔哩哔哩…

推理大模型时代,TextIn ParseX助力出版业知识资产重构

在大语言模型&#xff08;LLM&#xff09;与推理能力快速进化的技术浪潮下&#xff0c;出版机构沉淀数十年的非结构化数据资产&#xff0c;包括书籍、期刊、手稿及历史档案&#xff0c;正在焕发新的机遇。基于文档解析、NLP与大模型的推理生成能力&#xff0c;我们在图书馆层层…

Redis 2025/3/9

Redis主从集群 搭建主从集群 Redis并发能力非常强&#xff0c;单节点能够达到数万的并发。 不过对一些用户规模大&#xff0c;并发量比较高的应用来讲&#xff0c;数万并发不太够。这时候就用到redis的集群了。因为Redis中的数据通常读多写少&#xff0c;所以最常用的集群方…

2min搞定~Mac Pro 编译安装 Nginx 1.8.1

2min搞定&#xff5e;Mac Pro 编译安装 Nginx 1.8.1 一安装流程简述1、编译源码前&#xff0c;获取要依赖的源码包2、进行编译、安装nginx3、启动 二、实战部分&#xff1a;测试demo1、nginx.conf改动2、代码改动3、访问 一安装流程简述 阿哟啊哟老铁&#xff0c;别嫌我啰嗦奥…

要在Unreal Engine 5(UE5)中实现角色打击怪物并让怪物做出受击反应,

UE5系列文章目录 文章目录 UE5系列文章目录前言一、实现思路二、最终效果 前言 ue5角色受击没有播放受击动画&#xff0c;主角达到怪物身上没有反应 一、实现思路 要在Unreal Engine 5&#xff08;UE5&#xff09;中实现角色打击怪物并让怪物做出受击反应&#xff0c;你需要…