어쩌다 딥러닝 연구원

exif를 참조하여 반전/회전된 이미지 돌려놓기 본문

개발

exif를 참조하여 반전/회전된 이미지 돌려놓기

한샹곰 2020. 3. 7. 12:47

필자의 최근 업무는 스마트폰에서 찍어 서버로 전송된 데이터를 똑바로 회전시켜 주어 신경망에 줄 훈련 데이터를 정제하는 것이다.

 

맨 처음에는 일괄적으로 270도 회전을 시키는 것으로 생각했으나, 책임연구원님께서 Exif라는 포맷에 대해 알려주었는데, 이미지에 저장된 각종 정보들이다. 그 중 orientation이라는 정보가 포함되어 있는데, 아래의 이미지를 보면 이해할 수 있을 것이다.

값에 따라 F라는 글자가 

Exif가 무엇인지는 구체적인 정보를 원한다면 아래의 글을 참조해 보도록 하자.

https://ko.wikipedia.org/wiki/%EA%B5%90%ED%99%98_%EC%9D%B4%EB%AF%B8%EC%A7%80_%ED%8C%8C%EC%9D%BC_%ED%98%95%EC%8B%9D

 

교환 이미지 파일 형식 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 교환 이미지 파일 형식 (Exif; EXchangable Image File format)은 디지털 카메라에서 이용되는 이미지 파일 포맷이다. 이 데이터는 JPEG, TIFF 6.0과 RIFF, WAV 파일 포맷에서 이용되며 사진에 대한 정보를 포함하는 메타데이터를 추가한다. Exif는 JPEG 2000, PNG나 GIF 파일에서는 지원하지 않는다. 개발 과정[편집] 교환 이미지 파일 형식은 일본 전자산업진흥협회 (JEI

ko.wikipedia.org

 

다음은 작성한 코드이다.

rotate함수의 input은 파일의 절대경로이다.

이미지를 읽어들여  exif 메타데이터를 참조하여 orientation 값을 얻어낸 후 값에 따른 조치를 취하는 코드이다.

exif 메타데이터가 존재하지 않거나, orientation 값이 존재하지 않을 수 있다.

 

필자의 경우는 얼굴 사진들이기 때문에 이러한 경우 어쩔 수 없이 나중에 opencv를 이용한 face align을 찾아서 회전시키는 방식을 적용할 계획이다. 

import os
from PIL import Image
from matplotlib import pyplot as plt
import numpy as np
from PIL import ExifTags
import piexif

not_orient=[]
not_exif=[]
def rotate(filename):

    img = Image.open(filename)

    if "exif" in img.info:
        exif_dict = piexif.load(img.info["exif"])
        #print(exif_dict)
        if piexif.ImageIFD.Orientation in exif_dict["0th"]:
            orientation = exif_dict["0th"].pop(piexif.ImageIFD.Orientation)
            exif_bytes = piexif.dump(exif_dict)
            #print('{} orientation value is {}'.format(filename,str(orientation)))
            
            if orientation == 2:
                img = img.transpose(Image.FLIP_LEFT_RIGHT)

            elif orientation == 3:
                img = img.rotate(180)

            elif orientation == 4:
                img = img.rotate(180).transpose(Image.FLIP_LEFT_RIGHT)

            elif orientation == 5:
                img = img.rotate(-90, expand=True).transpose(Image.FLIP_LEFT_RIGHT)

            elif orientation == 6:
                img = img.rotate(-90, expand=True)

            elif orientation == 7:
                img = img.rotate(90, expand=True).transpose(Image.FLIP_LEFT_RIGHT)

            elif orientation == 8:
                img = img.rotate(90, expand=True)

            img.save(filename, exif=exif_bytes)
        else:
            #print('{} doesn\'t have exif orient info.'.format(filename))
            not_orient.append(filename)

    else:
        not_exif.append(filename)
        #print('{} doesn\'t have exif info.'.format(filename))

  
 
이러한 함수를 관리하는 디렉토리 하의 모든 이미지에 적용시키고 싶을 땐 어떻게 하는게 좋을까?
 
오늘도 topdown이다.
 
os 모듈의 활용 방법을 실무 코드로 작성해 놓은 글이니 참고 바란다.
 
 

Python OS 모듈 : 실무 코드로 알아보는 활용 예

os 모듈을 잘 모르는 분들께 도움이 될 코드들이다. 남들이 이미 다 써놓은 os 모듈 글을 왜 쓰냐는 질문이 들어올 것 같은 자의식과잉 환자로써 말하자면, 개발일지 겸사겸사 쓰는 글이라고 봐 주시면 감사하겠다..

shangom-developer.tistory.com

글이 유용했다면, 하트를 눌러주면 감사하겠다.

 

반쯤 반말체라 기분이 나쁘셨다면 죄송합니다. 아무튼 하트를 눌러주시면 감사하겠습니다.

 

그럼 제가 기분이 조크등요

 

Comments