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.