numpy 배열을 이미지로 변환하고 표시하는 방법은 무엇입니까?


227

따라서 배열을 만들었습니다.

import numpy as np
data = np.zeros( (512,512,3), dtype=np.uint8)
data[256,256] = [255,0,0]

내가 원하는 것은 512x512 이미지의 중앙에 단일 빨간색 점을 표시하는 것입니다. (적어도 처음부터 ... 나는 나머지 부분을 알아낼 수 있다고 생각합니다)


1
PIL을 사용할 수 없다는 제약 조건이 있지만 stackoverflow.com/questions/902761/… 도 참조하십시오 .
— 피터 한센

허용 된 답변을 Peter 's로 바꾸는 것을 고려할 수 있습니까? 둘 다 numpy 배열 주위에 객체를 감쌀 필요가 없으며 이미지를 표시하기 위해 임시 파일을 쓰지 않아도됩니다.
— Josiah Yoder

답변:


224

PIL을 사용하여 이미지를 만들고 표시 할 수 있습니다.

from PIL import Image
import numpy as np

w, h = 512, 512
data = np.zeros((h, w, 3), dtype=np.uint8)
data[0:256, 0:256] = [255, 0, 0] # red patch in upper left
img = Image.fromarray(data, 'RGB')
img.save('my.png')
img.show()

3
버그가있는 것 같습니다. size를 사용하여 배열을 만들지 (w,h,3)만 (h,w,3)PIL의 인덱싱은 numpy의 인덱싱과 다르기 때문에 이어야합니다 . 관련 질문이 있습니다 : stackoverflow.com/questions/33725237/...
— fdermishin

1
@ user502144 : 내 오류를 지적 해 주셔서 감사합니다. shape 배열을 만들어야합니다 (h,w,3). 첫 번째 축의 길이는 배열의 행 수와 두 번째 축의 길이, 열 수로 간주 할 수 있습니다. 따라서 (h, w)"height" h및 "width" 배열에 해당합니다 w. Image.fromarray이 배열을 height h및 width 이미지로 변환합니다 w.
— unutbu

1
img.show()ipython 노트북에서 작동하지 않습니다. img_pil = Image.fromarray(img, 'RGB') display(img_pil.resize((256,256), PIL.Image.LANCZOS))
— mrgloom

@ unutbu이 방법은 이미지를 왜곡하는 것 같습니다 ... stackoverflow.com/questions/62293077/…
— Ludovico Verniani

284

다음이 작동합니다.

from matplotlib import pyplot as plt
plt.imshow(data, interpolation='nearest')
plt.show()

Jupyter 노트북 / 랩을 사용하는 경우 matplotlib를 가져 오기 전에이 인라인 명령을 사용하십시오.

%matplotlib inline 

3
이것은 PIL보다 더 정확합니다. PIL은 배열 값을 리 스케일 / 정규화하는 반면 pyplot은 실제 RGB 값을 그대로 사용합니다.
— GaryO

21
알아두면 좋은 정보 : 그레이 스케일 이미지를 표시하려면 plt.gray()코드에서 한 번만 호출 하여 다음 그래프를 모두 그레이 스케일로 전환하는 것이 좋습니다 . OP가 원하는 것은 아니지만 그럼에도 불구하고 아는 것이 좋습니다.
— Cerno

2
저장하는 방법?
— user334639

"<ipython-input-29-29c784f62838>"파일, 39 행 plt.show () ^ SyntaxError : 잘못된 구문
— Mona Jalal

1
@Cerno 또한 회색조 이미지는 (h, w, 1)이 아닌 모양 (h, w)이어야합니다. squeeze()세 번째 차원을 제거하는 데 사용할 수 있습니다 .plt.imshow(data.squeeze())
— Josiah Yoder

51

최단 경로는 scipy다음과 같이 사용하는 것입니다.

from scipy.misc import toimage
toimage(data).show()

이를 위해서는 PIL 또는 필로우도 설치해야합니다.

PIL 또는 필로우도 필요하지만 다른 뷰어를 호출 할 수 있는 유사한 방법 은 다음과 같습니다.

from scipy.misc import imshow
imshow(data)

따라서이 방법은 python 3.5와 호환되지 않습니다 ...?
— Christopher

@ bordeo, 왜 3.5와 호환되지 않습니까? 가져 오기와 몇 가지 함수 호출입니다.
— 피터 한센

PIL은 3.5와 호환되지 않습니다 (설치되지 않음)
— Christopher

1
Ftr :을 직접 사용하여이를 더욱 단축 할 수 있습니다 scipy.misc.imshow(data).
— dtk

3
toimage는 scipy-1.0.0에서 더 이상 사용되지 않으며 Pillow 's에 찬성하여 1.2.0에서 제거되었습니다 Image.fromarray.
— Sid

4

pygame을 사용하면 창을 열고 표면을 픽셀 배열로 가져오고 원하는대로 조작 할 수 있습니다. 그러나 numpy 배열을 표면 배열로 복사해야하지만 파이 게임 표면 자체에서 실제 그래픽 작업을 수행하는 것보다 훨씬 느립니다.


3

예를 들어 numpy 배열에 저장된 이미지를 표시하는 방법 (Jupyter 노트북에서 작동)

나는 더 간단한 답변이 있다는 것을 알고 있지만,이 답변은 이미지가 실제로 numpy 배열에서 어떻게 익사하는지 이해하게합니다.

로드 예

from sklearn.datasets import load_digits
digits = load_digits()
digits.images.shape   #this will give you (1797, 8, 8). 1797 images, each 8 x 8 in size

한 이미지의 디스플레이 배열

digits.images[0]
array([[ 0.,  0.,  5., 13.,  9.,  1.,  0.,  0.],
       [ 0.,  0., 13., 15., 10., 15.,  5.,  0.],
       [ 0.,  3., 15.,  2.,  0., 11.,  8.,  0.],
       [ 0.,  4., 12.,  0.,  0.,  8.,  8.,  0.],
       [ 0.,  5.,  8.,  0.,  0.,  9.,  8.,  0.],
       [ 0.,  4., 11.,  0.,  1., 12.,  7.,  0.],
       [ 0.,  2., 14.,  5., 10., 12.,  0.,  0.],
       [ 0.,  0.,  6., 13., 10.,  0.,  0.,  0.]])

100 개의 이미지를 시각화하기 위해 빈 10 x 10 서브 플로트 생성

import matplotlib.pyplot as plt
fig, axes = plt.subplots(10,10, figsize=(8,8))

이미지 100 개 플로팅

for i,ax in enumerate(axes.flat):
    ax.imshow(digits.images[i])

결과:

여기에 이미지 설명을 입력하십시오

무엇을 axes.flat합니까? numpy 열거자를 작성하여 축을 반복하여 객체를 그릴 수 있습니다. 예:

import numpy as np
x = np.arange(6).reshape(2,3)
x.flat
for item in (x.flat):
    print (item, end=' ')

2

예를 들어 베개의 배열을 사용하여 :

from PIL import Image
from numpy import *

im = array(Image.open('image.jpg'))
Image.fromarray(im).show()


0

matplotlib을 사용하여 보충하십시오. 컴퓨터 비전 작업을 수행하는 것이 편리하다는 것을 알았습니다. dtype = int32로 데이터를 가지고 있다고 가정 해 봅시다.

from matplotlib import pyplot as plot
import numpy as np

fig = plot.figure()
ax = fig.add_subplot(1, 1, 1)
# make sure your data is in H W C, otherwise you can change it by
# data = data.transpose((_, _, _))
data = np.zeros((512,512,3), dtype=np.int32)
data[256,256] = [255,0,0]
ax.imshow(data.astype(np.uint8))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.