作者:乐土网6868 | 来源:互联网 | 2023-08-21 12:44
基于exif信息进行图片方向旋转修正在处理标注数据的时候,发现标注框不吻合经过分析发现标注软件在读取图片时,读取了图片的exif信息,并对图片进行了旋转,所以标注的坐标时旋转后的坐
基于exif信息进行图片方向旋转修正
在处理标注数据的时候,发现标注框不吻合经过分析发现标注软件在读取图片时,读取了图片的exif信息,并对图片进行了旋转,所以标注的坐标时旋转后的坐标。
解决方法有两种,一是旋转坐标,二是旋转图片,这里展示图片旋转的方法:
# coding:utf-8
import glob
import json
import os
import PIL.ExifTags
import PIL.Image
import PIL.ImageOps
import imageio
import numpy as np
import cv2
def update_image_files():
# 图片所在的文件夹
image_dir = "chinese_ocr_rec"
# 过滤出jpg图片
image_files = glob.glob(os.path.join(image_dir, "*.jpg"))
image_files.sort()
for image_file in image_files:
with open(image_file, 'rb') as f:
# 打开图片
image = PIL.Image.open(f)
# 图片旋转
image = apply_exif_orientation(image)
# 使用opencv读取,去除exif信息
img = cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)
# 保存图片
cv2.imwrite(image_file, img)
# 此方法为标注软件里图片旋转的方法
def apply_exif_orientation(image):
try:
exif = image._getexif()
except AttributeError:
exif = None
if exif is None:
return image
exif = {
PIL.ExifTags.TAGS[k]: v
for k, v in exif.items()
if k in PIL.ExifTags.TAGS
}
orientation = exif.get('Orientation', None)
if orientation == 1:
# do nothing
return image
elif orientation == 2:
# left-to-right mirror
return PIL.ImageOps.mirror(image)
elif orientation == 3:
# rotate 180
return image.transpose(PIL.Image.ROTATE_180)
elif orientation == 4:
# top-to-bottom mirror
return PIL.ImageOps.flip(image)
elif orientation == 5:
# top-to-left mirror
return PIL.ImageOps.mirror(image.transpose(PIL.Image.ROTATE_270))
elif orientation == 6:
# rotate 270
return image.transpose(PIL.Image.ROTATE_270)
elif orientation == 7:
# top-to-right mirror
return PIL.ImageOps.mirror(image.transpose(PIL.Image.ROTATE_90))
elif orientation == 8:
# rotate 90
return image.transpose(PIL.Image.ROTATE_90)
else:
return image
旋转后: