为什么matplotlib展示指定JPG图片时会自动旋转原始图像?
问题原因及解决方案
核心原因
这个问题是JPEG图片内置的*EXIF方向元数据(Orientation Tag)*导致的:
- 手机、相机等拍摄设备拍摄照片时,会把设备握持方向写入图片的EXIF元数据的Orientation字段,不会直接修改图片的原始像素矩阵
- Pillow的
Image.open()方法默认不会主动读取并应用该方向字段的旋转要求,matplotlib的imshow方法会直接渲染原始像素矩阵,就会出现显示方向和普通看图软件不一致的情况 - 其余图片可以正常显示,是因为这些图片的EXIF Orientation字段为默认的正常方向值,无需额外旋转即可正常显示
修复方法
调用Pillow内置的ImageOps.exif_transpose()方法即可自动根据EXIF元数据校正图片方向,修改后的代码如下:
import matplotlib.pyplot as plt from PIL import Image, ImageOps image = Image.open("yolov5_dataset/images/test/photo_alb_id.json_98.jpg") # 执行EXIF方向校正 image = ImageOps.exif_transpose(image) plt.imshow(image) plt.show()
如果是批量处理YOLO数据集,可以在数据集加载阶段统一对所有图片执行该校正操作,避免后续训练、推理环节出现图片方向不匹配的问题。
内容的提问来源于stack exchange,提问作者Dalireeza
相关产品推荐
相关产品推荐

