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)
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)