행궁동 데이터 엔지니어

반응형

사진 파일을 열어보면 아래와 같이 사진의 세부정보를 설명하는 데이터를 볼 수 있습니다.

  • 밑의 정보처럼 다른 데이터를 설명하기 위해 만들어진 데이터를 메타데이터(Metadata)라고 이야기합니다.

이번 포스팅은 사진 파일에서 Python을 이용해 메타데이터를 추출하는 방법에 대해 다루려고 합니다.

 

이미지 정보 1
이미지 정보 2
이미지 정보 3

 


개요

사진에서 위치정보, 노출시간, 조리개 정보, 촬영시각 등 메타정보(메타데이터)를 추출하기 위해 Python의 PIL(Python Image Library)을 활용합니다.

 

메타데이터의 추출은 디지털카메라, 휴대폰 카메라의 사진들이 EXIF(Exchangeable Image File Format) 메타데이터 포맷에 맞춰 정보들을 담고 있기에 가능합니다.

  • EXIF 메타데이터 포맷은 표준은 아니지만 오늘날 대부분의 카메라들이 사진 촬영 시 EXIF 포맷으로 정보를 저장하기에 사실상 표준으로 봐도 무방합니다.

EXIF 메타데이터는 다음과 같은 정보(출처: 나무 위키)를 포함합니다.

  • 날짜와 시간 정보
  • 카메라 정보(카메라 제조사, 모델명), 스마트폰이라면 스마트폰 제조사, 모델명
  • 카메라 설정 정보(초점 거리, 플래시 여부, ISO 감도, 조리개, 셔터 속도, 회전 방향, 색 공간 등)
  • 위치 정보 (고도, 위도, 경도)
  • 이외 EXIF 메타데이터가 담고 있는 정보 참고자료 : https://exiftool.org/TagNames/EXIF.html

 

추출 방법

1. Python image library 설치

pip install image

 

2. 이미지 불러오기

import PIL.Image
from pprint import pprint

# 이미지 불러오기 (YourPath 부분 수정 해주세요)
img = PIL.Image.open("YourPath/능소화.jpeg")

# 메타데이터 불러오기
meta_data = img._getexif()
# 정보 출력
pprint(meta_data)

출력 예시

뭔가 복잡한 메타 정보들

3. 필요한 메타데이터 추출하기

  • 저는 촬영기기의 제조사, 모델명 그리고 촬영 시각, GPS 정보를 추출해 봤습니다. (이미지에서 좌표 정보 추출, 고도 정보 추출하는 것이 주목적이었습니다)
- 271: 제조사
- 272: 모델명
- 36868: 촬영 시각
- 36881: 촬영 시각 offset 정보
- 34853: 좌표 정보 2: 경도, 4: 위도, 6: 고도
 

EXIF Tags

Tag IDTag Name WritableGroupValues / Notes 0x0001 InteropIndex string! InteropIFD 'R03' = R03 - DCF option file (Adobe RGB) 'R98' = R98 - DCF basic file (sRGB) 'THM' = THM - DCF thumbnail file 0x0002 InteropVersion undef!: InteropIFD   0x000b ProcessingS

exiftool.org

 

  • 위의 링크에 들어가시면 코드들이 16진수로 나와 있기에 Python의 int함수를 이용해 10진수로 변환하시면 확인하기 편합니다.
  • int("16진수 코드값", 16)

EXIP GPSinfo의 16진수 코드는 0x8825
0x8825를 10진수로 변환하기

  • 최종적으로 위에서 언급한 5개 정보를 이미지에서 추출한 결과는 아래와 같습니다.
# 메타데이터 정보 저장
company = meta_data[271]
model = meta_data[272]
timestamp = meta_data[36868]
timestamp_offset = meta_data[36881]
gps_info = meta_data[34853]

# 메타데이터 정보 출력
print(company)
print(model)
print(timestamp)
print(timestamp_offset)
print(gps_info)

메타데이터 추출 결과

 

 

이미지 정보 추출시 예제로 활용하시라고 메타데이터를 담고있는 사진 1장도 함께 첨부합니다.

능소화.jpeg
3.55MB

 

기타  궁금하신 사항은 편하게 댓글 남겨주세요.

 

감사합니다.

 

전체코드 (이미지 경로는 수정해주세요)

import PIL.Image
from pprint import pprint
img = PIL.Image.open("data-preprocessing/data/능소화.jpeg")
# 메타데이터 불러오기
meta_data = img._getexif()
# 메타데이터 전체 출력
# pprint(meta_data)
# Check EXIF Code (16진수 -> 10진수 변환)
int("0x8825", 16)
# 추출 예정 메타데이터 정보
# - 참고자료: https://exiftool.org/TagNames/EXIF.html
# - 271: 제조사
# - 272: 모델명
# - 36868: 촬영 시각
# - 36881: 촬영 시각 offset 정보
# - 34853: 좌표 정보 2: 경도, 4: 위도, 6: 고도
# 추출
company = meta_data[271]
model = meta_data[272]
timestamp = meta_data[36868]
timestamp_offset = meta_data[36881]
gps_info = meta_data[34853]
print(company)
print(model)
print(timestamp)
print(timestamp_offset)
print(gps_info)

 

 

참고자료

1. https://rudalson.tistory.com/entry/python%EC%9C%BC%EB%A1%9C-image-%EC%B2%98%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-exif-%EC%A0%95%EB%B3%B4-%EB%8B%A4%EB%A3%A8%EA%B8%B0
2. https://namu.wiki/w/EXIF 
3. https://pillow.readthedocs.io/en/stable/index.html

 

반응형

이 글을 공유합시다

facebook twitter kakaoTalk kakaostory naver band