Intro

YOLO 를 이용한 객체인식 프로젝트 중, 객체가 검출된 이미지를 gif로 묶어 전송해야 하는 태스크가 생겼다.
imageio 모듈을 통해 이 태스크를 구현해보겠다.


imageio 모듈

imageio는 애니메이션 이미지, 체적 데이터 등 다양한 이미지를 읽고 쓸 수 있는 모듈이다.
사용시 주의해야 할 점은, 본 모듈은 현재 v1, v2, v3 세 버전이 존재한다는 점이다.

v1과 v2는 이전 작성된 코드의 호환성을 위해 유지되고 있으나, 더이상 업데이트 등의 관리가 되지 않는다.
새로 작성하는 코드에는 v3를 이용하기를 당부.


설치

1
2
3
4
5
6
# 콘다 가상환경 사용시
conda install -c conda-forge imageio

# pip 로 설치
pip install imageio


메서드

imageio 에는 여러 가지 메서드가 있지만, 그 중 핵심인
imread()와 imwrite(), 그리고 gif를 만드는 mimwrite 세 가지만 우선 알아도 충분할 것으로 보인다.

메서드 설명 파라미터
imageio.v3.imread() ndimage를 불러온다. uri : 불러올 이미지 경로 {str}
    그 외 비필수 파라미터들 존재.
자세한 내용은 docs 참고
imageio.v3.imwrite() nd이미지를 만들어 저장한다. uri : 이미지를 저장할 경로 {str}
    image : 이미지로 저장할 ndimage(들)
    extension=None : 저장할 확장자.
‘.GIF’, ‘.JPG’ 등
imageio.mimwrite() 이미지들을 GIF로 변환해 저장한다. uri : gif를 저장할 경로
    images : gif로 만들 이미지들
    fps={int} : 초당 프레임 수


예시

예시로 1 ~ 9 까지의 숫자를 GIF로 만들어보겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import imageio
import os # 파일 불러오기를 위해 os 모듈 사용

# 이미지들이 저장된 경로에서 이미지 파일 리스트 뽑기
path = 'images/path'
img_list = os.listdir(path)
img_list = [ path + '/' + x for x in img_list]

# 이미지 1개 테스트로 읽어오기
image = imageio.v3.imread(imge_list[0])
print(image)

## 출력
## array([[[ 99,  73,  58],
##         [ 99,  76,  60],
##         [101,  78,  62],
##         ...,
##         [ 20,  38,  62],
##         [ 13,  31,  53],
##         [ 15,  33,  55]]], dtype=uint8)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 이미지파일들을 파일명 오름차순으로 정렬 %하단 참고
images.sort()

# 이미지를 ndimage로 불러와 리스트에 담기
images = [imageio.v3.imread(x) for x in img_list]

# 불러온 이미지들을 gif로 만들어 저장하기 (imwrite, mimwrite 방법 비교)
imageio.v3.imwrite('/path/to/save_imwrite.gif', images, extension='.GIF')
imageio.mimwrite('/path/to/save_2.gif', images, fps=10)
imageio.mimwrite('/path/to/save_3.gif', images, fps=2)
imageio.mimwrite('/path/to/save_4.gif', images, fps=0.5)

imwrite()

mimwrite(fps=10)

mimwrite(fps=2)

mimwrite(fps=0.5)

TIP 꼭 오름차순 정렬을 하기 바람.
오름차순으로 정렬하는 것을 빼먹을 경우,
gif 파일이 시간순서대로 붙지 않는 불상사가 발생할 수 있다.



Reference

imageio docs : https://imageio.readthedocs.io/en/stable/index.html

첨언

(이 포스트를 작성하고 나서야 PIL 모듈을 이용하면 된다는 걸 깨달았다. ㅠㅠ)