PIL 이미지를 멍청한 배열로 변환하는 방법은 무엇입니까?
-
23-08-2019 - |
문제
좋아, 나는 Pil Image Object를 앞뒤로 Numpy 배열로 변환하여 놀아서 PIL의 것보다 픽셀 변환으로 더 빠른 픽셀을 할 수 있습니다. PixelAccess
물체가 허용합니다. 픽셀 정보를 유용한 3D Numpy 배열로 배치하는 방법을 알아 냈습니다.
pic = Image.open("foo.jpg")
pix = numpy.array(pic.getdata()).reshape(pic.size[0], pic.size[1], 3)
그러나 모든 멋진 변형을 한 후에 Pil Object에 다시로드하는 방법을 알 수없는 것 같습니다. 나는 알고있다 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
일련의 튜플을 기대하고 당신은 그것을 멍청한 배열을 제공합니다. 이것
>>> data = list(tuple(pixel) for pixel in pix)
>>> pic.putdata(data)
작동하지만 매우 느립니다.
Pil 1.1.6 기준으로 "적절한"이미지와 Numpy 배열 사이에서 변환하는 방법 간단합니다
>>> pix = numpy.array(pic)
결과 배열은 귀하와 다른 형식이지만 (이 경우 3D 배열 또는 행/열/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 이미지를 필터링하십시오
어떤 이유로 든 명시 적으로 수행하려면 getData ()를 사용하여 vil2array () 및 array2pil () 함수가 있습니다. 이 페이지 상관 관계에서 zip.
Python 3.5에서 Pillow 4.1.1 (PIL의 후계자)을 사용하고 있습니다. 베개와 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 형식으로.
이 방법으로 이미지를 멍청한 배열로 변환해야합니다.
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가 설명한 동일한 기술을 사용하여 이미지를 Blobs에서 바이트 어레이로 변환 할 수 있습니다.
제 경우에는 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
그 후, 나는 신경망에서 바닥을 사용할 수있었습니다.
plt.imshow(imagesList[0])
def imshow(img):
img = img / 2 + 0.5 # unnormalize
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
plt.show()
기능을 낭비한 후 이미지를 Numpy () 함수로 구문 분석하여 이미지를 Numpy로 변환 할 수 있습니다 (정규화되지 않음).