Numpy 배열을 이미지로 저장


260

Numpy 배열 유형의 행렬이 있습니다. 디스크에 이미지로 쓰려면 어떻게해야합니까? 모든 형식이 작동합니다 (png, jpeg, bmp ...). 중요한 제약 중 하나는 PIL이 존재하지 않는다는 것입니다.


12
난 그냥 반드시 아래의 답변, 그리고오고이 질문을 찾는 사람들 중 일부의 일부가되는 위에 나열된 제약 조건에 부합하지 않는 점에 유의하고 싶습니다 없이 PIL을 . 일부 질문자 및 일부 답변 모두 해당 제약 조건을 피하기 때문에 여기에 있고 PIL이 마음에 들지 않는 사람과 아래에서 PIL이 아닌 답변 (신규 또는 기존)이 PIL 사용 중임을 언급하는 것이 좋습니다. 원래 제약 조건을 만족하는 답변과 구별하기 위해 답변 유형.
lindes

답변:


54

PyPNG 를 사용할 수 있습니다 . 순수 Python (종속성이 없음) 오픈 소스 PNG 인코더 / 디코더이며 NumPy 배열을 이미지로 작성 하는 것을 지원합니다 .


4
PNG의 올바른 범위 (보통 0..255)로 값을 조정해야합니다. 신경망의 값 범위는 종종 0..1 또는 -1..1입니다.
Tomáš Gavenčiak

8
PyPNG는 순수 Python으로 외부 종속성을 줄이지 만 PIL 및 파생 클래스보다 훨씬 느립니다. 예를 들어, 컴퓨터에 3000x4000 이미지를 저장하는 데 PyPNG의 경우 4.05 초가 걸리고 scipy.misc.imsave의 경우 0.59 초 밖에 걸리지 않았습니다 (6 배 빠름).
Zvika

@ TomášGavenčiak-scipy.misc.imsave는 이제 최신 버전의 Scipy에서 더 이상 사용되지 않습니다. 아래의 몇 가지 의견은 imageio.imwrite ( 'image_file.jpg', array)를 사용하는 것입니다.
Psi-Ed

259

이것은 PIL을 사용하지만 일부는 유용 할 수 있습니다.

import scipy.misc
scipy.misc.imsave('outfile.jpg', image_array)

편집 : 현재 scipy버전은 모든 이미지를 정규화하기 시작하여 최소 (데이터)가 검은 색이되고 최대 (데이터)가 흰색이됩니다. 데이터가 정확한 그레이 레벨 또는 정확한 RGB 채널이어야하는 경우에는 원하지 않습니다. 해결책:

import scipy.misc
scipy.misc.toimage(image_array, cmin=0.0, cmax=...).save('outfile.jpg')

19
에서 imsave 삶 ... / scipy / 기타 / pilutil.py PIL 사용하는
데니스

5
jpg로 변환 할 때는 손실이 있으므로 이미지를 생성하는 데 사용 된 정확한 데이터를 복구하지 못할 수 있으므로주의하십시오.
Feanil

8
이것은 scipy 0.19 사용에서 더 이상 사용되지 않습니다-scipy.io.imwrite
g.stevo

6
"imsave는 SciPy 1.0.0에서 더 이상 사용되지 않으며 1.2.0에서 제거됩니다"( Scipy 1.1.0 doc )
noobar

15
scipy.misc.imsave는 더 이상 사용되지 않습니다. 가져 오기 이미지 사용; imageio.imwrite ( 'file_name.jpg', nmupy_array)
ChaosPredictor

228

PIL을 사용한 답변 (유용한 경우에 대비하여).

numpy 배열 "A"가 주어진 경우 :

from PIL import Image
im = Image.fromarray(A)
im.save("your_file.jpeg")

"jpeg"를 원하는 거의 모든 형식으로 바꿀 수 있습니다. 형식에 대한 자세한 내용은 여기


5
이미지는 PIL의 모듈입니다. "인쇄 이미지 .__ FILE__"수행
Juh_

10
여기를 방황하고 PIL을 가지고있는 사람들에게 매우 도움이됩니다.- from PIL import Image분명하게하기 위해 사용할 것 같습니다 ...
sage

4
RGB 이미지가있는 경우 im = Image.fromarray (A) .convert ( 'RGB')를 사용하여 이미지를 얻을 수 있습니다. 추가 정보 : stackoverflow.com/questions/4711880/…
Roger Veciana

RGB를 코딩하기 위해 uint8 배열의 세 번째 축을 사용하면이 방법으로 작동합니다. 모듈 PIL은 "pip install pillow"을 사용하여 설치할 수 있습니다.
bli

1
@Ludovico Verniani 이미지를 왜곡하지는 않지만 색상 순서가 RGB가 아닌 BGR 인 다소 드문 색상 인코딩을 사용합니다.
Zvika

87

matplotlib:

import matplotlib

matplotlib.image.imsave('name.png', array)

matplotlib 1.3.1에서 작동하지만 더 낮은 버전에 대해서는 모르겠습니다. docstring에서 :

Arguments:
  *fname*:
    A string containing a path to a filename, or a Python file-like object.
    If *format* is *None* and *fname* is a string, the output
    format is deduced from the extension of the filename.
  *arr*:
    An MxN (luminance), MxNx3 (RGB) or MxNx4 (RGBA) array.

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


이것을 사용합니다. 그러나 메모리 누수로 고통
받음

새 버전에서 () matplotlib.imsave
인 Vinay Lodha에게

6
그것은이다 matplotlib.pyplot.imsave2+하기 matplotlib에서
알렉세이 페트 렌코

1
@HughPerkins 시도 베개를 파이썬 3에서 PIL 교체로
christianbrodbeck

10
import matplotlib.pyplot as plt그리고plt.imsave('name.png', array)
Alessandro Jacopson

61

타사 의존성이없는 스 니펫 인 순수 Python (2 & 3).

이 함수는 압축 된 트루 컬러 (픽셀 당 4 바이트) RGBAPNG를 씁니다 .

def write_png(buf, width, height):
    """ buf: must be bytes or a bytearray in Python3.x,
        a regular string in Python2.x.
    """
    import zlib, struct

    # reverse the vertical line order and add null bytes at the start
    width_byte_4 = width * 4
    raw_data = b''.join(
        b'\x00' + buf[span:span + width_byte_4]
        for span in range((height - 1) * width_byte_4, -1, - width_byte_4)
    )

    def png_pack(png_tag, data):
        chunk_head = png_tag + data
        return (struct.pack("!I", len(data)) +
                chunk_head +
                struct.pack("!I", 0xFFFFFFFF & zlib.crc32(chunk_head)))

    return b''.join([
        b'\x89PNG\r\n\x1a\n',
        png_pack(b'IHDR', struct.pack("!2I5B", width, height, 8, 6, 0, 0, 0)),
        png_pack(b'IDAT', zlib.compress(raw_data, 9)),
        png_pack(b'IEND', b'')])

... 데이터는 다음과 같이 바이너리로 열린 파일에 직접 기록되어야합니다.

data = write_png(buf, 64, 64)
with open("my_image.png", 'wb') as fh:
    fh.write(data)


2
이것은 내가 정확히 찾고있는 것처럼 보이지만 의견을 추가 할 수 있습니까? 이것이 파일에 쓰는 방법을 모르겠습니다. 이전에 열린 파일에 출력을 써야합니까? 감사!
PhilMacKay

1
@PhilMacKay, 데이터는 이진 파일에 작성해야합니다. 댓글 추가
ideasman42

1
누군가 이미지 ( buf)의 형식을 지정할 수 있습니까 ? 그것은 numpy 배열이 아닌 것 같습니다 ...
christianbrodbeck

1
@christianmbrodbeck, bytearray (RGBARGBA ...)
ideasman42

1
감사합니다 @ ideasman42. Blender에서 사용하기 위해이 코드 포팅했습니다 .
emackey

57

있다 opencv(파이썬을 위해 여기 문서 ).

import cv2
import numpy as np

cv2.imwrite("filename.png", np.zeros((10,10)))

저장 이외의 다른 처리가 필요한 경우에 유용합니다.


1
왜 크기 10의 배열입니까? 이 솔루션에서 10을 선택하게 된 이유는 무엇입니까?
Gathide

3
@Gathide 임의의 numpy 행렬을 파일에 쓰는 예제와 같습니다. 실제로는 np.zeros((10,10))이미지로 교체 하십시오.
Xocoatzin

5
cmap="gray"cv2를 사용하여 이미지를 저장할 때 어떻게 추가 할 수 있습니까?
Mona Jalal 2016 년

@Xocoatzin 끊어진 링크?
jtlz2

1
@ jtlz2 업데이트 된 링크.
Xocoatzin 2019

30

matplotlib가 있으면 다음을 수행 할 수 있습니다.

import matplotlib.pyplot as plt
plt.imshow(matrix) #Needs to be in row,col order
plt.savefig(filename)

이미지 자체가 아닌 플롯이 저장됩니다. 여기에 이미지 설명을 입력하십시오


10
pyplot 인터페이스의 경우 plt.figure ()는 불필요합니다. 또한 Figure 창을 보려면 plt.show () 만 있으면됩니다.이 경우 이미지 파일 만 저장하면되므로 show ()를 호출 할 필요가 없었습니다.
DopplerShift

7
결과 이미지 파일에는 픽셀 데이터뿐만 아니라 matlplotlib 그림의 축과 회색 영역이 포함됩니다.
Dave

1
그래픽 인터페이스를 지원하지 않고 원격 호스트에서 스크립트를 실행하면 작동하지 않습니다.
Temak

노트북에 이미지를 표시하려면 다음을 추가하십시오. >> "from IPython.display import Image"및 >> "Image (filename = filename)"
Robert

축을 제거하려면 :plt.axis('off')
yakout

15

파이썬에서 'skimage'라이브러리를 사용할 수 있습니다

예:

from skimage.io import imsave
imsave('Path_to_your_folder/File_name.jpg',your_array)

15

scipy.miscimsave기능 에 대한 사용 중단 경고를 표시하고 imageio대신 사용을 제안합니다 .

import imageio
imageio.imwrite('image_name.png', img)

12

@ ideasman42의 답변에 대한 부록 :

def saveAsPNG(array, filename):
    import struct
    if any([len(row) != len(array[0]) for row in array]):
        raise ValueError, "Array should have elements of equal size"

                                #First row becomes top row of image.
    flat = []; map(flat.extend, reversed(array))
                                 #Big-endian, unsigned 32-byte integer.
    buf = b''.join([struct.pack('>I', ((0xffFFff & i32)<<8)|(i32>>24) )
                    for i32 in flat])   #Rotate from ARGB to RGBA.

    data = write_png(buf, len(array[0]), len(array))
    f = open(filename, 'wb')
    f.write(data)
    f.close()

그래서 당신은 할 수 있습니다 :

saveAsPNG([[0xffFF0000, 0xffFFFF00],
           [0xff00aa77, 0xff333333]], 'test_grid.png')

제작 test_grid.png:

빨강, 노랑, 어두운 아쿠아, 그레이 그리드

(에서 높은 바이트를 줄여 투명도 작동합니다 0xff.)


8

직접 완전히 작동하는 예제를 찾는 사람들에게 :

from PIL import Image
import numpy

w,h = 200,100
img = numpy.zeros((h,w,3),dtype=numpy.uint8) # has to be unsigned bytes

img[:] = (0,0,255) # fill blue

x,y = 40,20
img[y:y+30, x:x+50] = (255,0,0) # 50x30 red box

Image.fromarray(img).convert("RGB").save("art.png") # don't need to convert

또한 고품질 jpeg를 원한다면
.save(file, subsampling=0, quality=100)


6

matplotlib svn에는 이미지를 이미지처럼 이미지로 저장하는 새로운 기능이 있습니다. 간결함을위한 docstring) :

def imsave(fname, arr, vmin=None, vmax=None, cmap=None, format=None, origin=None):
    from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
    from matplotlib.figure import Figure

    fig = Figure(figsize=arr.shape[::-1], dpi=1, frameon=False)
    canvas = FigureCanvas(fig)
    fig.figimage(arr, cmap=cmap, vmin=vmin, vmax=vmax, origin=origin)
    fig.savefig(fname, dpi=1, format=format)

3

세계는 아마도 numpy 배열을 PNG 파일에 쓰는 데 아직 또 다른 패키지가 필요하지 않지만 충분하지 않은 사람들을 위해 최근 numpngw에 github을 사용했습니다.

https://github.com/WarrenWeckesser/numpngw

그리고 pypi에서 : https://pypi.python.org/pypi/numpngw/

유일한 외부 의존성은 numpy입니다.

다음 examples은 저장소 디렉토리의 첫 번째 예입니다 . 필수 라인은 단순히

write_png('example1.png', img)

imgnumpy 배열은 어디에 있습니까 ? 해당 줄 앞의 모든 코드는 import 문과 create code img입니다.

import numpy as np
from numpngw import write_png


# Example 1
#
# Create an 8-bit RGB image.

img = np.zeros((80, 128, 3), dtype=np.uint8)

grad = np.linspace(0, 255, img.shape[1])

img[:16, :, :] = 127
img[16:32, :, 0] = grad
img[32:48, :, 1] = grad[::-1]
img[48:64, :, 2] = grad
img[64:, :, :] = 127

write_png('example1.png', img)

생성 한 PNG 파일은 다음과 같습니다.

example1.png


궁금합니다. lib가 다른 라이브러리와 어떻게 다른가요? 더 빠릅니까? 멋진 기능이 있습니까?
F Lekschas

몇 가지 특징 : (1) numpy 배열을 사용합니다. (2) python과 numpy를 사용하여 작성되었으므로 C 라이브러리를 설치할 필요가 없습니다. (3) 애니메이션 PNG 파일을 만들 수 있습니다. (4) matplotlib 애니메이션을 애니메이션 PNG 파일로 작성하는 클래스를 제공합니다.
Warren Weckesser

감사! 순수한 파이썬 인 성능면 에서 stackoverflow.com/a/19174800/981933 과 비교하는 방법이 궁금합니다 . 전자의 방법은 PIL보다 2 배 이상 빠릅니다. 그것이 당신의 목표가 아니라면 신경 쓰지 마십시오 :)
F Lekschas

2

회색조 이미지를 원한다고 가정합니다.

im = Image.new('L', (width, height))
im.putdata(an_array.flatten().tolist())
im.save("image.tiff")

2

Imageio 는 애니메이션 이미지, 비디오, 볼륨 데이터 및 과학적 형식을 포함하여 광범위한 이미지 데이터를 읽고 쓸 수있는 쉬운 인터페이스를 제공하는 Python 라이브러리입니다. 크로스 플랫폼이며 Python 2.7 및 3.4+에서 실행되며 설치가 쉽습니다.

이것은 회색조 이미지의 예입니다.

import numpy as np
import imageio

# data is numpy array with grayscale value for each pixel.
data = np.array([70,80,82,72,58,58,60,63,54,58,60,48,89,115,121,119])

# 16 pixels can be converted into square of 4x4 or 2x8 or 8x2
data = data.reshape((4, 4)).astype('uint8')

# save image
imageio.imwrite('pic.jpg', data)

1

[Py] Qt를 이미 사용하고 있다면 qimage2ndarray에 관심이있을 수 있습니다 . 버전 1.4 (방금 출시)부터 PySide도 지원되며 imsave(filename, array)scipy와 비슷한 작은 기능이 있지만 PIL 대신 Qt를 사용합니다. 1.3에서는 다음과 같은 것을 사용하십시오.

qImage = array2qimage(image, normalize = False) # create QImage from ndarray
success = qImage.save(filename) # use Qt's image IO functions for saving PNG/JPG/..

(1.4의 또 다른 장점은 순수한 파이썬 솔루션이라는 점입니다.이 기능은 훨씬 가볍습니다.)


1.4 릴리스가 나왔습니다. :-) (나는 그에 따라 답을 편집했다.)
hans_meine

1

Python 환경 Spyder에서 작업하는 경우 변수 탐색기에서 배열을 마우스 오른쪽 버튼으로 클릭하고 이미지 표시 옵션을 선택하는 것보다 더 쉬울 수 없습니다.

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

이것은 대부분 PNG 형식으로 이미지를 dsik에 저장하도록 요청합니다.

이 경우 PIL 라이브러리가 필요하지 않습니다.


1

사용하십시오 cv2.imwrite.

import cv2
assert mat.shape[2] == 1 or mat.shape[2] == 3, 'the third dim should be channel'
cv2.imwrite(path, mat) # note the form of data should be height - width - channel  

0

numpy 배열을 이미지로 저장하기 위해 U에는 여러 가지 선택이 있습니다.

1) 다른 최고 : OpenCV

 import cv2   
 cv2.imwrite('file name with extension(like .jpg)', numpy_array)

2) Matplotlib

  from matplotlib import pyplot as plt
  plt.imsave('file name with extension(like .jpg)', numpy_array)

3) 필

  from PIL import Image
  image = Image.fromarray(numpy_array)
  image.save('file name with extension(like .jpg)')

4) ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.