본문 바로가기
Python/Python FAQ

Python PIL 이미지를 NumPy 배열로 변환하는 방법은 무엇인가요?, How do I convert a PIL Image into a NumPy array?

by 베타코드 2023. 11. 3.
반응형

질문


어떻게 PIL Image를 NumPy 배열로 변환하고 다시 변환하여 PIL의 PixelAccess보다 빠른 픽셀 단위 변환을 할 수 있을까요? 다음과 같이 NumPy 배열로 변환할 수 있습니다:

pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)

하지만 배열을 수정한 후 PIL Image로 다시로드하는 방법은 어떻게 해야 할까요? pic.putdata()는 잘 작동하지 않습니다.


답변


당신은 어떻게 putdata()가 정확히 작동하지 않는지 설명하지 않고 있습니다. 아마도 다음과 같이 하고 있다고 가정하겠습니다.

>>> pic.putdata(a)
Traceback (most recent call last):
  File "...blablabla.../PIL/Image.py", line 1185, in putdata
    self.im.putdata(data, scale, offset)
SystemError: new style getargs format but argument is not a tuple

이는 putdata가 튜플의 시퀀스를 예상하고 있으며 numpy 배열을 제공하고 있기 때문입니다. 이렇게 하면 작동하지만 매우 느립니다.

>>> data = list(tuple(pixel) for pixel in pix)
>>> pic.putdata(data)

PIL 1.1.6부터는 이미지와 numpy 배열 간에 변환하는 "적절한" 방법은 다음과 같습니다.

>>> pix = numpy.array(pic)

결과 배열은 당신의 것과 다른 형식입니다 (이 경우 행/열/RGB의 3차원 배열).

그런 다음 배열에 변경 사항을 적용한 후에는 pic.putdata(pix) 또는 Image.fromarray(pix)를 사용하여 새 이미지를 만들 수 있어야 합니다.

반응형

댓글