반응형
질문
어떻게 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)
를 사용하여 새 이미지를 만들 수 있어야 합니다.
반응형
댓글