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
'Programing' 카테고리의 다른 글
하위 프로세스를 한 줄씩 읽다. (0) | 2022.03.23 |
---|---|
라우터 링크-활성화된 vue-router는 홈페이지 경로의 모든 해시 링크를 활성화함 (0) | 2022.03.23 |
html 이전에 스크립트를 로드할 때 Vue.js가 작동하지 않음 (0) | 2022.03.23 |
MD 크기의 장치에 대해서만 요소 표시 (0) | 2022.03.23 |
뉴라인 없이 인쇄(인쇄 'a'), 인쇄 공간, 제거 방법? (0) | 2022.03.23 |