plt.imshow显示图像倒置而cv2_imshow正常,如何确认神经网络输入?
问题原因
导致两种显示方式出现差异的核心原因是图像读取工具对EXIF元数据或像素存储顺序的处理逻辑不同:
cv2.imread()与cv2_imshow()的组合不会自动处理图像的EXIF方向标记,直接读取并显示原始像素数据;mpimg.imread()(matplotlib的图像读取接口)会读取图像的EXIF方向信息并自动应用旋转/翻转,但如果图像的EXIF标记与实际像素方向不匹配(比如本地查看器已自动修正显示,但EXIF标记未同步更新),就会导致matplotlib显示时出现倒置。
另外,部分从PDF、扫描件导出的图像,其像素存储顺序本身是上下颠倒的,本地查看器和cv2_imshow会自动适配这种存储方式,而matplotlib默认按原始像素顺序显示,也会出现倒置情况。
解决方法
以下几种可靠方式可确保图像方向正确,避免影响模型精度:
方法1:读取后手动翻转图像
如果plt显示的图像是倒置的,直接对读取后的图像进行上下翻转即可:
import matplotlib.image as mpimg import matplotlib.pyplot as plt pt = '/content/content/DATA/testing_data/1/126056495_AO_BIZ-0000320943-Process_IP_Cheque_page-0001.jpg' image = mpimg.imread(pt) # 上下翻转图像 image_flipped = image[::-1, :] plt.imshow(image_flipped) # 模型输入使用image_flipped即可
方法2:统一用OpenCV读取并转换格式
因为cv2读取的图像显示正常,可先用cv2读取,再转换为matplotlib支持的RGB格式(cv2默认读取BGR格式):
import cv2 import matplotlib.pyplot as plt pt = '/content/content/DATA/testing_data/1/126056495_AO_BIZ-0000320943-Process_IP_Cheque_page-0001.jpg' # cv2读取BGR格式图像 img = cv2.imread(pt) # 转换为RGB格式供matplotlib显示 img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img_rgb) # 模型输入可直接用cv2读取的图像(若模型需要RGB格式则转RGB)
方法3:处理EXIF方向信息
如果是EXIF标记导致的问题,可用PIL库读取并自动修正EXIF方向:
from PIL import Image import matplotlib.pyplot as plt import numpy as np pt = '/content/content/DATA/testing_data/1/126056495_AO_BIZ-0000320943-Process_IP_Cheque_page-0001.jpg' # 读取图像并自动处理EXIF方向 image = Image.open(pt).convert('RGB') plt.imshow(image) # 转换为numpy数组供模型使用 image_np = np.array(image)
对模型精度的影响
只要确保输入模型的图像是正立的(与你训练/标注时的图像方向一致),就不会影响模型精度。建议统一使用一种读取方式(比如OpenCV或PIL),避免因处理逻辑不同导致输入图像方向混乱。
内容的提问来源于stack exchange,提问作者Sadaf Shafi
相关产品推荐
相关产品推荐

