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))
어떤 이유로 명시 적으로 수행하려는 경우 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.size
와 arr2im.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)