Сохранение массива Numpy в виде изображения - PullRequest
213 голосов
/ 24 мая 2009

У меня есть матрица в виде массива Numpy. Как бы я записал его на диск как образ? Работает любой формат (png, jpeg, bmp ...). Одним из важных ограничений является то, что PIL отсутствует.

Ответы [ 18 ]

4 голосов
/ 27 декабря 2018

Для тех, кто ищет прямой полностью рабочий пример:

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)

4 голосов
/ 11 июня 2009

matplotlib svn имеет новую функцию для сохранения изображений как просто изображения - без осей и т. Д. Это также очень простая функция для бэкпорта, если вы не хотите устанавливать svn (скопировано прямо из image.py в matplotlib svn , убрал документацию для краткости):

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)
2 голосов
/ 02 мая 2017

Если вы хотите получить изображение в градациях серого:

im = Image.new('L', (width, height))
im.putdata(an_array.flatten().tolist())
im.save("image.tiff")
2 голосов
/ 29 сентября 2015

Мир, вероятно, не нуждается в еще одном пакете для записи массива в PNG-файл, но для тех, кто не может насытиться, я недавно поставил numpngw на github:

https://github.com/WarrenWeckesser/numpngw

и по pypi: https://pypi.python.org/pypi/numpngw/

Единственная внешняя зависимость - numpy.

Вот первый пример из каталога examples хранилища. Основная линия просто

write_png('example1.png', img)

, где img - массив пустышек. Весь код перед этой строкой - операторы импорта и код для создания 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

1 голос
/ 08 октября 2018

Использование 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  
1 голос
/ 19 августа 2014

Если вы уже используете [Py] Qt, вас может заинтересовать qimage2ndarray . Начиная с версии 1.4 (только что выпущенной), PySide также поддерживается, и будет крошечная imsave(filename, array) функция, похожая на scipy, но использующая Qt вместо PIL. В версии 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 заключается в том, что это чисто Python-решение, которое делает его еще более легким.)

0 голосов
/ 12 января 2019

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)
0 голосов
/ 02 июля 2018

Если вы работаете в среде Python Spyder, то это не может быть проще, чем просто щелкнуть правой кнопкой мыши массив в проводнике переменных и затем выбрать параметр Показать изображение.

enter image description here

Это попросит вас сохранить изображение в dsik, в основном в формате PNG.

В этом случае библиотека PIL не понадобится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...