背景

  之前在公司通过paddleocr写了个接口,传入图片的base64编码返回识别出的文字信息。但是图片为横向时,文字行会乱序,所以准备新加一个功能通过paddleclas推理图片文字的倾斜角度,并将图片旋转为正向。在测试过程中发现windows打开一个正向图片,调用ocr接口时无法识别,返回一堆奇怪的文字。

排查过程

  首先我需要识别的图片在windows中打开是这样的,宽为4096,长为3072





  识别出的结果为



(图片内容为示例图片,实际是纯文字图片,返回的内容都是奇怪的文字)



  之后尝试了其他正向图片都可以正常识别,于是在PyCharm中打算通过python打开图片,然后使用本地的paddleocr尝试一下。使用如下代码:

with open("C:\\Users\\xxxxx\\test.jpg", "rb") as image_file:
file_content = base64.b64encode(image_file.read()).decode("utf8")

  发现预览图片时,图片是旋转的,于是将图片复制到pycharm和idea里,发现全部都是旋转的图片。



  并且发现只有jpg格式的出现了这个问题,其他如PNG格式的图片是正常的。



  于是搜索了一下jpg和PNG图片的不同之处。发现JPEG 图片通常包含 EXIF 元数据,里面包括了一个 Orientation 标签,它告诉系统应该如何旋转图片来正常显示。

  • Windows 的照片查看器会读取这个 Orientation 标签,并自动旋转图片。

  • 但一些 IDE(如 PyCharm、IDEA)中的图片查看器或第三方库(如 PIL、OpenCV)通常不读取 EXIF 的 Orientation 信息,而是直接以图像的原始像素排列进行显示。

  那么问题就很明显了,使用如下代码对图片的EXIF信息进行读取

from PIL import Image, ExifTags

def open_image_with_correct_orientation(path):
image = Image.open(path) try:
for orientation in ExifTags.TAGS.keys():
if ExifTags.TAGS[orientation] == 'Orientation':
break exif = image._getexif()
if exif is not None:
orientation_value = exif.get(orientation) if orientation_value == 3:
image = image.rotate(180, expand=True)
elif orientation_value == 6:
image = image.rotate(270, expand=True)
elif orientation_value == 8:
image = image.rotate(90, expand=True)
except Exception as e:
print(f"读取 EXIF 方向失败: {e}") return image # 示例使用
img = open_image_with_correct_orientation("your_image.jpg")
img.show()

  返回结果为



  发现Orientation 为3,证明原始图片确实是旋转过的。

解决办法

1、通过上述代码获取图片的元数据的旋转信息,对图片进行旋转

2、通过paddleclas判断文字的倾斜角度,对图片进行旋转,我这边采用的是这种方法,毕竟这次遇到的bug是因为测试为了方便直接对图片进行旋转并保存而出现。线上环境中图片由于每个人拍摄角度不固定,所以很可能上传的原始图片就是倾倒的。

图片的EXIF元数据

常见关键字段:

  • Orientation:图像方向(是否旋转)

  • DateTime:拍摄时间

  • Make / Model:设备品牌 / 型号

  • ExifImageWidth / ExifImageHeight:原始像素尺寸

  • GPSInfo:地理位置信息(如果有)

Orientation 的取值含义:

说明
1 正常
3 旋转 180 度
6 顺时针旋转 90 度
8 逆时针旋转 90 度

常见支持 EXIF 的图片格式

说明
JPEG / JPG 是主要支持 EXIF 的格式
TIFF 原始格式之一,支持丰富的元信息
HEIF / HEIC 新一代图像格式(如 iPhone 拍照),支持 EXIF,但不是所有工具都能读取
WebP 支持嵌入元数据(EXIF 和 XMP),但不是标准实现的一部分,兼容性差异较大
RAW 格式(如 .CR2, .NEF, .ARW, .DNG 等) 摄影相机原始文件,通常包含大量 EXIF 和其他元数据
PNG 不支持 EXIF,但可以写入其他形式的元数据(如 tEXt 或 iTXt)
BMP 不支持 EXIF
GIF 不支持 EXIF
SVG 是 XML 文本格式,不支持 EXIF,但可以有自定义 metadata 区域

ocr识别遇到的小问题-图片的EXIF 元数据的更多相关文章

  1. 以API方式调用C# dll,使用OneNote2013 sp1实现OCR识别本地图片

    http://www.cnblogs.com/Charltsing/p/OneNoteOCRAPI.html OneNote2013 OCR API调用使用说明2019.4.17 使用说明:1.安装干 ...

  2. 基于Tesseract的OCR识别小程序

    一.背景 先说下开发背景,今年有次搬家找房子(2020了应该叫去年了),发现每天都要对着各种租房广告打很多电话.(当然网上也找了实地也找),每次基本都是对着墙面看电话号码然后拨打,次数一多就感觉非常麻 ...

  3. 图片文字OCR识别-tesseract-ocr

    帮助文件:https://github.com/tesseract-ocr/tesseract/blob/master/doc/tesseract.1.asc 下载地址:https://github. ...

  4. 【转】Python OCR识别图片验证码

    转载自:博客 对于某些网站登录的时候,往往需要输入验证码才能实现登录.如果要爬虫这类网站,往往总会比这个验证码导致无法爬取数据.以下介绍一种比较折中的方法,也是比较可行的方法: 实现思想: 1.通过截 ...

  5. 微信公众号开发调用摄像头、拍摄或选择图片、OCR识别

     一 .准备工作       <1> 域名认证准备工作 在需要调用摄像头的接口页面引入微信的js,具体地址为:(支持https):http://res.wx.qq.com/open/js/ ...

  6. Onenote实现OCR识别图片

    OCR识别推荐两个软件: 1.       Tesseract:一个开源的,由谷歌维护的OCR软件. 2.       Onenote:微软Office附带或者可以自己独立安装. 3.       O ...

  7. python3使用OCR识别图片

    放假三天,闲来无事,想学下python爬虫.本想跟着网上教程操作一遍,奈何安装使用过程中出现一堆问题,并且在网上搜了一堆复制黏贴的答案,关键都不能起作用,最后终于找到一篇生效,为了以后不至于再经历这种 ...

  8. Atitit  ocr识别原理 与概论 attilax总结

    Atitit  ocr识别原理 与概论 attilax总结 1.1. Ocr的过程与流程1 1.2. OCR不同技术细分略有不同,但大概原理是一样的. 即主要技术过程是:二值化(又叫归一化)----- ...

  9. AI时代的OCR识别技术浅析

    人工智能这个词可谓是耳熟能详,近几年人工智能热潮再次席卷而来,引起轰动的要数google的AlphaGo,相继打败了围棋界的韩国选手李世石以及世界冠军柯洁,见证了人工智能发展的里程碑式的变革,人工智能 ...

  10. 例子:照片的OCR识别

    来自ng的ml-003中 18_XVIII._Application_Example-_Photo_OCR 这是ng2013年在coursera上最后的一课了.这一系列的几个视频还是相比前面有些难懂, ...

随机推荐

  1. 快速修改MySQL数据库名称

    原理:先创建新的数据库,然后利用information_schema数据库表结构信息,用 RENAME命令 将旧的表迁移到新数据库里面,最后删除旧的数据库名称即可. 步骤如下: #查询目标数据库下面的 ...

  2. MySQL系统命令

    原文链接:https://blog.liuzijian.com/post/34b3b940-c053-9d75-06e2-07a2e7aeedc3.html 登录命令 mysql -h 主机 -P 端 ...

  3. C# WebAPI 插件热插拔

    背景 WebAPI 插件热插拔是指在不重启应用程序的情况下,能够动态地加载.更新或卸载功能模块(即插件)的能力.这种设计模式在软件开发中非常有用,尤其是在需要频繁更新或扩展功能的大型系统中.通过实现插 ...

  4. uni-app之页面跳转(点击按钮进行页面跳转)

    001==>点击按钮进行页面跳转 <view class="" @tap="gotoLunBo"> 去轮播页 </view> // ...

  5. 报错sql_mode=only_full_group_by

    这个问题的原因是,在这种模式下,sql分组时默认只能select + 分组字段以及聚合函数,相当于做一个规范检查 但很多时候并不需要这个检查,因为真实sql中,分组后很多字段是1对1的,比如分组id, ...

  6. 性能飞跃!TensorRT-YOLO 6.0 全面升级解析与实战指南

    一.核心升级亮点速览 多Context共享引擎:高效推理,最大化硬件资源利用率 TensorRT-YOLO 6.0 引入了创新的多Context共享引擎机制,允许多个线程共享同一个Engine进行推理 ...

  7. 从挑战到突破:HBlock定义智算存储新范式!

    近日,由DOIT传媒主办,中国计算机学会信息存储专委会.武汉光电国家研究中心.百易存储研究院支持的2024中国数据与存储峰会在北京召开.此次峰会以"智数据 AI未来"为主题,天翼云 ...

  8. 云主机(操作系统:CentOS7版本)安装nfs客户端,挂载文件系统

    本文分享自天翼云开发者社区<云主机(操作系统:CentOS7版本)安装nfs客户端,挂载文件系统>,作者:c****n 1.保证宿主机上有nfs-utils 1.1若宿主机yum源不可以用 ...

  9. 安装VMware

    安装VMware 官网下载 首先需要进行账号注册:https://support.broadcom.com/ 注册完成后,进行账号登录:https://login.broadcom.com/signi ...

  10. [记录点滴]在Ionic和Android中上传Blob图片

    [记录点滴]在Ionic和Android中上传Blob图片 目录 [记录点滴]在Ionic和Android中上传Blob图片 0x00 摘要 0x01 Blob 0x02 项目简述 0x02 Ioni ...