我有一个Numpy数组类型的矩阵.我如何将其作为图像写入磁盘?任何格式都有效(png,jpeg,bmp ......).一个重要的限制是PIL不存在.
这使用PIL,但也许有些人可能会发现它很有用:
import scipy.misc scipy.misc.imsave('outfile.jpg', image_array)
编辑:当前scipy
版本开始标准化所有图像,以便min(数据)变为黑色,max(数据)变为白色.如果数据应该是精确的灰度级或精确的RGB通道,则这是不希望的.解决方案:
import scipy.misc scipy.misc.toimage(image_array, cmin=0.0, cmax=...).save('outfile.jpg')
使用PIL的答案(以防它有用).
给出一个numpy数组"A":
from PIL import Image im = Image.fromarray(A) im.save("your_file.jpeg")
您可以用几乎任何您想要的格式替换"jpeg".有关格式的详细信息在这里
用matplotlib
:
import matplotlib matplotlib.image.imsave('name.png', array)
使用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.
纯Python(2和3),没有第三方依赖的片段.
此函数写入压缩的真彩色(每像素4个字节)RGBA
PNG.
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 fd: fd.write(data)
原始来源
另请参阅:此问题的Rust端口.
感谢@Evgeni Sergeev的示例用法:https://stackoverflow.com/a/21034111/432509
你可以使用PyPNG.它是纯Python(无依赖性)开源PNG编码器/解码器,它支持将NumPy数组编写为图像.
有opencv
python(文档在这里).
import cv2 import numpy as np cv2.imwrite("filename.png", np.zeros((10,10)))
如果您需要进行除保存以外的更多处理,则非常有用.
如果你有matplotlib,你可以这样做:
import matplotlib.pyplot as plt plt.imshow(matrix) #Needs to be in row,col order plt.savefig(filename)
这将保存绘图(不是图像本身).
您可以在Python中使用'skimage'库
例:
from skimage.io import imsave imsave('Path_to_your_folder/File_name.jpg',your_array)
@ 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
.)
scipy.misc
给出有关imsave
功能的弃用警告,并建议使用imageio
替代功能。
import imageio imageio.imwrite('image_name.png', img)