문제

좋아, 나는 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로 변환 할 수 있습니다 (정규화되지 않음).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top