将Numpy数组保存为图像

M45*_*456 228 python numpy image

我有一个Numpy数组类型的矩阵.我如何将其作为图像写入磁盘?任何格式都有效(png,jpeg,bmp ......).一个重要的限制是PIL不存在.

Ste*_*joa 247

这使用PIL,但也许有些人可能会发现它很有用:

import scipy.misc
scipy.misc.imsave('outfile.jpg', image_array)
Run Code Online (Sandbox Code Playgroud)

编辑:当前scipy版本开始标准化所有图像,以便min(数据)变为黑色,max(数据)变为白色.如果数据应该是精确的灰度级或精确的RGB通道,则这是不希望的.解决方案:

import scipy.misc
scipy.misc.toimage(image_array, cmin=0.0, cmax=...).save('outfile.jpg')
Run Code Online (Sandbox Code Playgroud)

  • imsave生活在.../scipy/misc/pilutil.py中使用PIL (18认同)
  • 这个现在在scipy 0.19中被弃用 - scipy.io.imwrite (8认同)
  • 转换为jpg时要小心,因为它有损,因此您可能无法恢复用于生成图像的确切数据. (5认同)
  • "imsave在SciPy 1.0.0中已弃用,将在1.2.0中删除"([Scipy 1.1.0 doc](https://docs.scipy.org/doc/scipy-1.1.0/reference/generated/ scipy.misc.imsave.html)) (4认同)
  • scipy.misc.imsave已过时。使用导入图像 imageio.imwrite('file_name.jpg',nmupy_array) (4认同)

mig*_*gas 189

使用PIL的答案(以防它有用).

给出一个numpy数组"A":

from PIL import Image
im = Image.fromarray(A)
im.save("your_file.jpeg")
Run Code Online (Sandbox Code Playgroud)

您可以用几乎任何您想要的格式替换"jpeg".有关格式的详细信息在这里

  • 非常有帮助我们这些在这里徘徊并且有PIL的人 - 我想我会使用`来自PIL import Image`以保持清晰...... (10认同)
  • 图像是PIL的模块.做"打印图像.__文件___" (5认同)
  • 如果您有RGB图像,可以使用im = Image.fromarray(A).convert('RGB')获取图像更多信息:http://stackoverflow.com/questions/4711880/pil-using-fromarray -with二进制数据和写入色文本 (4认同)

chr*_*eck 73

matplotlib:

import matplotlib

matplotlib.image.imsave('name.png', array)
Run Code Online (Sandbox Code Playgroud)

使用matplotlib 1.3.1,我不知道降低版本.从文档字符串:

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.
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 它是matplotlib 2+中的`matplotlib.pyplot.imsave` (5认同)
  • 将matplotlib.pyplot导入为plt然后将plt.imsave('name.png',数组)导入 (5认同)

ide*_*n42 56

纯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'')])
Run Code Online (Sandbox Code Playgroud)

...数据应直接写入以二进制形式打开的文件,如:

data = write_png(buf, 64, 64)
with open("my_image.png", 'wb') as fd:
    fd.write(data)
Run Code Online (Sandbox Code Playgroud)

  • 这似乎正是我正在寻找的,但你可以添加一些评论吗?我没看到这是如何写入文件的.您是否必须在先前打开的文件中写入输出?谢谢! (2认同)

dF.*_*dF. 53

你可以使用PyPNG.它是纯Python(无依赖性)开源PNG编码器/解码器,它支持将NumPy数组编写为图像.

  • PyPNG是纯Python,它减少了它的外部依赖性,但使它比PIL及其派生类慢得多.例如,使用PyPNG在我的机器上保存3000x4000图像需要4.05秒,而使用scipy.misc.imsave只需0.59秒(快6倍). (6认同)
  • 请记住将值缩放到PNG的正确范围,通常为0..255.神经网络中的值范围通常为0..1或-1..1. (4认同)

Xoc*_*zin 44

opencvpython(文档在这里).

import cv2
import numpy as np

cv2.imwrite("filename.png", np.zeros((10,10)))
Run Code Online (Sandbox Code Playgroud)

如果您需要进行除保存以外的更多处理,则非常有用.

  • 当我使用cv2保存图像时,如何添加类似`cmap ="gray"的内容? (5认同)
  • @Gathide就像将一些任意的numpy矩阵写入文件的示例。在现实生活中,将`np.zeros((10,10))`替换为您的图片。 (3认同)

Dop*_*ift 29

如果你有matplotlib,你可以这样做:

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

这将保存绘图(不是图像本身). 在此输入图像描述

  • 不,对于pyplot接口,plt.figure()是多余的.此外,如果您还想要查看图形窗口,则只需要plt.show() - 在这种情况下,只需要保存图像文件,因此无需调用show(). (10认同)
  • 请注意,生成的图像文件将包含matlplotlib图形的轴和灰色区域 - 而不仅仅是像素数据. (5认同)

nim*_*adi 20

要将 numpy 数组保存为图像,您有多种选择:

1)最好的:OpenCV

 import cv2   
 cv2.imwrite('file name with extension(like .jpg)', numpy_array)
Run Code Online (Sandbox Code Playgroud)

2) Matplotlib

  from matplotlib import pyplot as plt
  plt.imsave('file name with extension(like .jpg)', numpy_array)
Run Code Online (Sandbox Code Playgroud)

3) PIL

  from PIL import Image
  image = Image.fromarray(numpy_array)
  image.save('file name with extension(like .jpg)')
Run Code Online (Sandbox Code Playgroud)

4) ...


PUR*_*HRA 12

您可以在Python中使用'skimage'库

例:

from skimage.io import imsave
imsave('Path_to_your_folder/File_name.jpg',your_array)
Run Code Online (Sandbox Code Playgroud)


Evg*_*eev 11

@ 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()
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

saveAsPNG([[0xffFF0000, 0xffFFFF00],
           [0xff00aa77, 0xff333333]], 'test_grid.png')
Run Code Online (Sandbox Code Playgroud)

制作test_grid.png:

网格的红色,黄色,深色浅绿色,灰色

(透明度也可以,通过减少高字节0xff.)


Pud*_*dle 11

对于那些正在寻找直接完整工作示例的人:

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
Run Code Online (Sandbox Code Playgroud)

另外,如果你想要高质量的 jpeg
.save(file, subsampling=0, quality=100)


小智 9

scipy.misc给出有关imsave功能的弃用警告,并建议使用imageio替代功能。

import imageio
imageio.imwrite('image_name.png', img)
Run Code Online (Sandbox Code Playgroud)


Aut*_*tic 6

matplotlib svn 有一个新函数可以将图像保存为一个图像——没有轴等。如果你不想安装 svn(直接从 matplotlib svn 中的 image.py 复制,删除了为简洁起见,文档字符串):

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)
Run Code Online (Sandbox Code Playgroud)


War*_*ser 5

世界可能不需要另一个包来将 numpy 数组写入 PNG 文件,但对于那些还不够的人,我最近numpngw在 github 上发布了:

https://github.com/WarrenWeckesser/numpngw

在 pypi 上: https: //pypi.python.org/pypi/numpngw/

唯一的外部依赖是 numpy。

examples这是存储库目录中的第一个示例。基本路线很简单

write_png('example1.png', img)
Run Code Online (Sandbox Code Playgroud)

其中img是 numpy 数组。该行之前的所有代码都是 import 语句和 create 代码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)
Run Code Online (Sandbox Code Playgroud)

这是它创建的 PNG 文件:

示例1.png

另外,我曾经在曼哈顿度量的 Voronoi 图numpngw.write_apng中创建动画。


Den*_*lev 5

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)
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

450115 次

最近记录:

6 年,8 月 前