如何避免使用cv2.imread()读取图像时出现自动旋转问题?
解决OpenCV cv2.imread() 加载图像时的旋转问题
这个问题我之前帮不少开发者踩过坑!核心原因是图像的EXIF元数据里的Orientation方向标签在搞事情:很多手机、相机拍摄的竖屏照片,实际像素存储还是横向的,但会在EXIF中标记一个方向参数,告诉图像查看器需要旋转才能正确显示。但cv2.imread()默认会完全忽略这个EXIF标签,直接按像素原始顺序加载,所以当图像高度大于宽度时,就会出现看起来被旋转的错觉(其实是没按EXIF提示调整方向)。
下面给你两种靠谱的解决方法,按需选择:
方法一:用PIL配合处理(兼容所有OpenCV版本)
PIL/Pillow库能方便读取EXIF信息,我们可以先通过PIL处理方向,再转换成OpenCV的BGR格式:
import cv2 from PIL import Image import numpy as np def load_image_with_exif(path): # 用PIL读取图像和EXIF元数据 pil_img = Image.open(path) exif_data = pil_img._getexif() # 检查并处理Orientation标签(标签ID为274) if exif_data is not None and 274 in exif_data: orientation = exif_data[274] # 根据不同的Orientation值调整图像 if orientation == 2: pil_img = pil_img.transpose(Image.FLIP_LEFT_RIGHT) elif orientation == 3: pil_img = pil_img.rotate(180) elif orientation == 4: pil_img = pil_img.rotate(180).transpose(Image.FLIP_LEFT_RIGHT) elif orientation == 5: pil_img = pil_img.rotate(-90).transpose(Image.FLIP_LEFT_RIGHT) elif orientation == 6: pil_img = pil_img.rotate(-90) # 等价于顺时针旋转270度 elif orientation == 7: pil_img = pil_img.rotate(90).transpose(Image.FLIP_LEFT_RIGHT) elif orientation == 8: pil_img = pil_img.rotate(90) # 将PIL的RGB格式转换成OpenCV的BGR格式 cv_img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR) return cv_img
方法二:纯OpenCV处理(需OpenCV 4.5.0+版本)
如果你的OpenCV版本是4.5.0及以上,可以直接用OpenCV自带的EXIF读取功能,不需要额外依赖:
import cv2 def load_image_with_cv2_exif(path): # 读取原始图像 img = cv2.imread(path) if img is None: return None # 读取图像的EXIF数据 exif_data = img.getexif() # 检查Orientation标签并调整方向 if 274 in exif_data: orientation = exif_data[274] if orientation == 3: img = cv2.rotate(img, cv2.ROTATE_180) elif orientation == 6: img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) elif orientation == 8: img = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE) return img
额外注意事项
- 不是所有图像都有EXIF信息:比如截图、经过编辑保存的图像可能没有Orientation标签,所以代码里一定要加
exif_data is not None这类判断,避免报错。 - 测试时可以打印
orientation值:如果不确定图像的方向参数,直接输出这个值,对应上面的分支就能快速定位问题。 - 颜色空间转换:PIL默认是RGB,OpenCV是BGR,所以方法一里必须用
COLOR_RGB2BGR转换,否则颜色会失真。
内容的提问来源于stack exchange,提问作者Bernardo Cortez
相关产品推荐
相关产品推荐

