Programing

PL 이미지를 Numpy 배열로 변환하는 방법

c10106 2022. 3. 23. 20:28
반응형

PL 이미지를 Numpy 배열로 변환하는 방법

좋아, 나는 PL 이미지 오브젝트를 앞뒤로 Numpy 배열로 변환하여 PL 이미지보다 픽셀 변환을 더 빠르게 할 수 있게 하려고 한다.PixelAccess사물이 허락할 것이다.다음과 같은 방법으로 픽셀 정보를 유용한 3D numpy 배열로 배치하는 방법을 알아냈다.

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

하지만 내가 멋진 변신을 다 해놓고 어떻게 다시 PL 오브젝트에 로딩해야 할지 모르겠어.나는 그 방법을 알고 있지만, 그것이 제대로 행동하도록 할 수는 없는 것 같다.

정확히 어떻게 해야 하는지 말하는 게 아니잖아.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 array로 만들게 된다.이것

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

효과가 있을 것이지만 그것은 매우 느리다.

PIL 1.1.6을 기준으로 영상과 Numpy 어레이 간에 변환하는 "적절한" 방법은 간단하다.

>>> pix = numpy.array(pic)

결과 배열 형식은 사용자의 형식과 다르지만(3-d 배열 또는 행/열/열/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의 베개 4.1.1 (PL의 후계자)을 사용하고 있다.베개와 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

그 후, 나는 신경망에 있는 바이트 아레이를 사용할 수 있었다.

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-to-convert-a-pil-image-into-a-numpy-array

반응형