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 모듈을 이용하면 된다는 걸 깨달았다. ㅠㅠ)