programing

PIL 이미지를 NumPy 어레이로 변환하는 방법

sourcejob 2022. 9. 30. 11:05
반응형

PIL 이미지를 NumPy 어레이로 변환하는 방법

Image로 왔다 갔다 하면 NumPy 배열보다 할 수 .PixelAccessNumPy를 사용하다

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일련의 튜플을 예상하면 숫자 배열이 됩니다....

>>> data = list(tuple(pixel) for pixel in pix)
>>> pic.putdata(data)

작동하지만 매우 느립니다.

PIL 1.1.6에서는 이미지와 numpy 어레이를 '적절하게' 변환하는 방법은 다음과 같습니다.

>>> pix = numpy.array(pic)

다만, 결과 어레이의 형식이 다릅니다(3-d 어레이 또는 이 경우는 행/열/열).

배열 할 수 거예요.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에서 Peaker 4.1.1 (FIL의 후속 버전)을 사용하고 있습니다.People과 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 numpy as np
from PIL import Image

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

def NumpyToPil(img):
    return Image.fromarray(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

그 후 뉴럴 네트워크에서 byteArrays를 사용할 수 있게 되었습니다.

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로 변환할 수 있습니다.

언급URL : https://stackoverflow.com/questions/384759/how-do-i-convert-a-pil-image-into-a-numpy-array

반응형