Python 동적 변수 생성 관련 질문입니다.
조회수 1025회
from PIL import Image
from os import listdir
from os.path import isfile, join
filepath = './FACE/'
files = [f for f in listdir(filepath) if isfile(join(filepath, f))]
for i in range(0, files.len()):
im[i] = Image.open(filepath + files[i]).convert('L')
위와 같은 방식으로 filepath 내의 모든 이미지들을 불려와서 im[]이라는 배열에 쌓아두고 싶습니다.
PIL Image 형식의 배열을 만들 수 있을까요?
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
배열이라고 질문에는 되어 있는데...파이썬의 builtin 에는 c 와 같은 배열은 없습니다.
보통 list 를 사용하여 c 의 배열을 표현합니다.
물론 array 모듈의 array 를 사용하여 c와 유사한 한타입의 배열을 만들수는 있습니다. (저장할 수 있는 타입이 정해져 있습니다. https://docs.python.org/ko/3.7/library/array.html)
그러나 보통 list 혹은 generator 를 사용합니다.....list 인 경우 모든 이미지를 메모리에 로드해야 합니다. 이미지 갯수가 적으면 부담이 없지만 많다면 큰 사이즈의 이미지들을 메모리에 로드하다 메모리 부족사태가 발생합니다. 사실 배열에 담는다는 의미 역시 sequence 하게 처리할 목적이기 때문에 lazy loading 을 해서 필요한 이미지만 메모리에 올리는 편이 낫습니다.
files = [f'{filepath}{f}' for f in listdir(filepath) if isfile(join(filepath, f))] L = list(map(Image.open, files)) # L 은 이미지 리스트입니다. 1메가짜리 이미지 10개면 적어도 10메가의 메모리를 차지할겁니다. # 혹은 아래와 같이 제너레이터로 작업합니다. 이때에는 next 가 실행되기 전에는 open 함수는 실행되지 않습니다. lazy loading 이 되어 메모리를 아낄 수 있습니다. L = map(Image.open, files) next(L)
댓글 입력