ocr识别遇到的小问题-图片的EXIF 元数据
背景
之前在公司通过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 元数据的更多相关文章
- 以API方式调用C# dll,使用OneNote2013 sp1实现OCR识别本地图片
http://www.cnblogs.com/Charltsing/p/OneNoteOCRAPI.html OneNote2013 OCR API调用使用说明2019.4.17 使用说明:1.安装干 ...
- 基于Tesseract的OCR识别小程序
一.背景 先说下开发背景,今年有次搬家找房子(2020了应该叫去年了),发现每天都要对着各种租房广告打很多电话.(当然网上也找了实地也找),每次基本都是对着墙面看电话号码然后拨打,次数一多就感觉非常麻 ...
- 图片文字OCR识别-tesseract-ocr
帮助文件:https://github.com/tesseract-ocr/tesseract/blob/master/doc/tesseract.1.asc 下载地址:https://github. ...
- 【转】Python OCR识别图片验证码
转载自:博客 对于某些网站登录的时候,往往需要输入验证码才能实现登录.如果要爬虫这类网站,往往总会比这个验证码导致无法爬取数据.以下介绍一种比较折中的方法,也是比较可行的方法: 实现思想: 1.通过截 ...
- 微信公众号开发调用摄像头、拍摄或选择图片、OCR识别
一 .准备工作 <1> 域名认证准备工作 在需要调用摄像头的接口页面引入微信的js,具体地址为:(支持https):http://res.wx.qq.com/open/js/ ...
- Onenote实现OCR识别图片
OCR识别推荐两个软件: 1. Tesseract:一个开源的,由谷歌维护的OCR软件. 2. Onenote:微软Office附带或者可以自己独立安装. 3. O ...
- python3使用OCR识别图片
放假三天,闲来无事,想学下python爬虫.本想跟着网上教程操作一遍,奈何安装使用过程中出现一堆问题,并且在网上搜了一堆复制黏贴的答案,关键都不能起作用,最后终于找到一篇生效,为了以后不至于再经历这种 ...
- Atitit ocr识别原理 与概论 attilax总结
Atitit ocr识别原理 与概论 attilax总结 1.1. Ocr的过程与流程1 1.2. OCR不同技术细分略有不同,但大概原理是一样的. 即主要技术过程是:二值化(又叫归一化)----- ...
- AI时代的OCR识别技术浅析
人工智能这个词可谓是耳熟能详,近几年人工智能热潮再次席卷而来,引起轰动的要数google的AlphaGo,相继打败了围棋界的韩国选手李世石以及世界冠军柯洁,见证了人工智能发展的里程碑式的变革,人工智能 ...
- 例子:照片的OCR识别
来自ng的ml-003中 18_XVIII._Application_Example-_Photo_OCR 这是ng2013年在coursera上最后的一课了.这一系列的几个视频还是相比前面有些难懂, ...
随机推荐
- 隐私集合求交(PSI)-多方
本文主要讲解一个多方的PSI协议,文章转载:隐私计算关键技术:多方隐私集合求交(PSI)从原理到实现以及多方隐私求交--基于OPPRF的MULTI-PARTY PSI:原论文:Practical Mu ...
- linux:init
init命令启动级别的含义(0-6) 0:停机1:单用户形式,只root进行维护2:多用户,不能使用net file system3:完全多用户4:未使用(系统之间可能略有不同,有些人的博客写的是安全 ...
- Oracle数据库只能127.0.0.1连接,无法局域网远程通过IP访问
今天使用Oracle时遇到一个问题,连接字符串中IP配置成127.0.0.1时可能正常访问数据库,当配置成实际IP地址时连接数据库失败.然后 telnet IP 1521 失败. 解决方案: 1. 打 ...
- 0511-Properties集合
package A10_IOStream; import java.io.*; import java.util.Properties; import java.util.Set; /* java.u ...
- flutter3-dymall仿抖音直播商城|Flutter3.27短视频+直播+聊天App实例
自研flutter3.27+dart3.6+getx实战抖音短视频+聊天+直播电商带货app商城应用. flutter_dymall一款基于最新版Flutter3.27+Dart3.x+Getx+me ...
- 安全可信 | 首批!天翼云边缘安全加速平台AccessOne通过信通院“软件自研创新能力”专项评估
近日,中国信息通信研究院(以下简称"中国信通院")公布"软件自研创新能力"专项评估(简称"可信研创")结果,天翼云边缘安全加速平台Acces ...
- NSSM使用说明
1.说明 NSSM是一个服务封装程序,它可以将普通exe程序封装成服务,使之像windows服务一样运行.同类型的工具还有微软自己的srvany,不过nssm更加简单易用,并且功能强大.它的特点如下: ...
- Q:su命令无法切换用户问题,密码正确可登录
一.文件权限问题 查看文件权限: ll -a /bin/su /usr/bin/passwd 正确的结果为: 错误的结果为: suid和普通x执行权限 s:当普通用户使用su的时候,采用的是owner ...
- 接口响应指标的p99、p95、p50到底是什么?
一.简介 我们对服务响应时间的衡量指标有Min(最小响应时间).Max(最大响应时间).Avg(平均响应时间)等,P99.P90也是衡量指标 二.指标简介 1.平均值Avg 其中比较常用的值就是平均值 ...
- 华盛顿大学-分布式系统课设-lab0
前言 无意间发现一个华盛顿大学分布式系统的课程实验,感觉课程组设计得非常用心.不同于一般实验仅仅给出若干测试样例并判断程序的输出是否正确,实验中的验证环节通过DFS搜索来遍历分布式系统可能的状态,以此 ...