358

Numpy 配列の型の行列があります。イメージとしてディスクに書き込むにはどうすればよいですか? 任意の形式 (png、jpeg、bmp...) で動作します。1 つの重要な制約は、PIL が存在しないことです。

4

20 に答える 20

363

PILを使用した回答(便利な場合に備えて)。

numpy 配列 "A" が与えられた場合:

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

「jpeg」は、ほぼすべての形式に置き換えることができます。フォーマットの詳細はこちら

于 2011-12-16T18:21:39.423 に答える
273

これは PIL を使用していますが、便利だと思う人もいるかもしれません:

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

EDIT : 現在のscipyバージョンでは、min(データ) が黒になり、max(データ) が白になるように、すべての画像の正規化が開始されました。データが正確なグレー レベルまたは正確な RGB チャネルである必要がある場合、これは望ましくありません。ソリューション:

import scipy.misc
scipy.misc.toimage(image_array, cmin=0.0, cmax=...).save('outfile.jpg')
于 2009-11-11T04:53:29.880 に答える
78

opencvPython用があります(ドキュメントはこちら)。

import cv2
import numpy as np

img = ... # Your image as a numpy array 

cv2.imwrite("filename.png", img)

保存以外の処理が必要な場合に便利です。

于 2014-11-24T23:10:45.907 に答える
65

PyPNGを使用できます。これは純粋な Python (依存関係なし) のオープン ソース PNG エンコーダー/デコーダーであり、NumPy 配列を画像として書き込むことをサポートしています。

于 2009-05-24T00:26:05.093 に答える
32

matplotlib がある場合は、次のことができます。

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

これにより、プロットが保存されます (画像自体ではありません)。 ここに画像の説明を入力

于 2009-06-10T17:29:37.580 に答える
24

numpy 配列を画像として保存するには、いくつかの選択肢があります。

1) その他のベスト: OpenCV

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

2) マトプロットライブラリ

  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) ...

于 2020-06-14T04:17:36.280 に答える
13

@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ます。)

于 2014-01-10T00:33:20.280 に答える
6

matplotlib svnには、画像を単なる画像として保存する新しい機能があります-軸などはありません。svnをインストールしたくない場合は、バックポートも非常に簡単な機能です(matplotlib svnのimage.pyから直接コピーし、簡潔にするために 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)
于 2009-06-10T21:43:06.447 に答える
4

世界はおそらく、numpy 配列を PNG ファイルに書き込むための別のパッケージを必要としませんが、十分に得られない人のために、最近numpngwgithub に投稿しました:

https://github.com/WarrenWeckesser/numpngw

および pypi: https://pypi.python.org/pypi/numpngw/

唯一の外部依存関係は numpy です。

examplesこれは、リポジトリのディレクトリからの最初の例です。本質的な行は単純です

write_png('example1.png', img)

どこimgで numpy 配列です。その行の前のすべてのコードは、インポート ステートメントと作成するコード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

また、マンハッタン メトリックのボロノイ図でnumpngw.write_apngアニメーションを作成していました。

于 2015-09-29T20:56:04.150 に答える