[python] PIL 이미지를 numpy 배열로 변환하는 방법은 무엇입니까?

PIL 이미지 객체를 numpy 배열로 앞뒤로 변환하여 PIL PixelAccess객체가 허용하는 것 보다 픽셀 단위로 더 빠른 픽셀 변환을 수행 할 수 있습니다. 픽셀 정보를 유용한 3D numpy 배열에 배치하는 방법을 알아 냈습니다.

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

그러나 멋진 변환을 모두 마친 후에 PIL 객체에 다시로드하는 방법을 알 수없는 것 같습니다. 나는 그 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)

결과 배열은 귀하의 형식과 다릅니다 (이 경우 3 차원 배열 또는 행 / 열 / rgb).

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


답변

I배열로 엽니 다 :

>>> I = numpy.asarray(PIL.Image.open('test.jpg'))

에 몇 가지 작업을 수행 I한 다음 이미지로 다시 변환하십시오.

>>> im = PIL.Image.fromarray(numpy.uint8(I))

FFT, Python으로 numpy 이미지 필터링

어떤 이유로 명시 적으로 수행하려는 경우 correlation.zip 의이 페이지 에서 getdata ()를 사용하는 pil2array () 및 array2pil () 함수가 있습니다.


답변

Python 3.5에서 Pillow 4.1.1 (PIL의 후속 버전)을 사용하고 있습니다. Pillow와 numpy 간의 변환은 간단합니다.

from PIL import Image
import numpy as np
im = Image.open('1.jpg')
im2arr = np.array(im) # im2arr.shape: height x width x channel
arr2im = Image.fromarray(im2arr)

주의해야 할 사항 중 하나는 필로우 스타일 im이 열 주요이고 numpy 스타일 im2arr이 행 주요이라는 것입니다. 그러나 함수는 Image.fromarray이미 이것을 고려합니다. 이고, 그 arr2im.size == im.sizearr2im.mode == im.mode상술 한 예이다.

변환 된 numpy 배열을 처리 할 때 HxWxC 데이터 형식을 처리해야합니다 (예 : 변환 im2arr = np.rollaxis(im2arr, 2, 0)또는im2arr = np.transpose(im2arr, (2, 0, 1)) CxHxW 형식으로).


답변

이 방법으로 이미지를 numpy 배열로 변환해야합니다.

import numpy
import PIL

img = PIL.Image.open("foo.jpg").convert("L")
imgarr = numpy.array(img) 


답변

예를 들어 오늘 사용했습니다.

import PIL
import numpy
from PIL import Image

def resize_image(numpy_array_image, new_height):
    # convert nympy array image to PIL.Image
    image = Image.fromarray(numpy.uint8(numpy_array_image))
    old_width = float(image.size[0])
    old_height = float(image.size[1])
    ratio = float( new_height / old_height)
    new_width = int(old_width * ratio)
    image = image.resize((new_width, new_height), PIL.Image.ANTIALIAS)
    # convert PIL.Image into nympy array back again
    return array(image)


답변

이미지가 Blob 형식 (예 : 데이터베이스)으로 저장된 경우 Billal Begueradj에서 설명한 것과 동일한 기술을 사용하여 이미지를 Blob에서 바이트 배열로 변환 할 수 있습니다.

필자의 경우 db 테이블의 blob 열에 저장된 이미지가 필요했습니다.

def select_all_X_values(conn):
    cur = conn.cursor()
    cur.execute("SELECT ImageData from PiecesTable")
    rows = cur.fetchall()
    return rows

그런 다음 데이터 세트를 np.array로 변경하는 도우미 함수를 만들었습니다.

X_dataset = select_all_X_values(conn)
imagesList = convertToByteIO(np.array(X_dataset))

def convertToByteIO(imagesArray):
    """
    # Converts an array of images into an array of Bytes
    """
    imagesList = []

    for i in range(len(imagesArray)):
        img = Image.open(BytesIO(imagesArray[i])).convert("RGB")
        imagesList.insert(i, np.array(img))

    return imagesList

그 후 신경 네트워크에서 byteArrays를 사용할 수있었습니다.

plt.imshow(imagesList[0])


답변

Numpy to PIL이미지 변환PIL to Numpy

import numpy as np
from PIL import Image

def pilToNumpy(img):
    return np.array(img)

def NumpyToPil(img):
    return Image.fromarray(img)