У мене є матриця типу масиву Numpy. Як би я записав це на диск, як зображення? Будь-який формат працює (png, jpeg, bmp ...). Одне важливе обмеження полягає в тому, що PIL відсутній.
У мене є матриця типу масиву Numpy. Як би я записав це на диск, як зображення? Будь-який формат працює (png, jpeg, bmp ...). Одне важливе обмеження полягає в тому, що PIL відсутній.
Відповіді:
Можна використовувати PyPNG . Це чистий датчик / декодер PNG з відкритим кодом Python (без залежностей) і він підтримує запис масивів NumPy у вигляді зображень.
Для цього використовується PIL, але, можливо, деякі можуть вважати його корисним:
import scipy.misc
scipy.misc.imsave('outfile.jpg', image_array)
EDIT : Поточна scipy
версія почала нормалізувати всі зображення, щоб хв (дані) стали чорними, а макс (дані) - білими. Це небажано, якщо дані мають бути точними рівнями сірого чи точними каналами RGB. Рішення:
import scipy.misc
scipy.misc.toimage(image_array, cmin=0.0, cmax=...).save('outfile.jpg')
Відповідь за допомогою PIL (про всяк випадок, коли це корисно).
задано нумерований масив "A":
from PIL import Image
im = Image.fromarray(A)
im.save("your_file.jpeg")
ви можете замінити "jpeg" практично будь-яким потрібним вам форматом. Детальніше про формати тут
from PIL import Image
щоб це було зрозуміло ...
З 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.pyplot.imsave
в matplotlib 2+
import matplotlib.pyplot as plt
а потімplt.imsave('name.png', 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 fh:
fh.write(data)
buf
) має бути? Здається, це не нудний масив ...
Там opencv
для python ( тут документація ).
import cv2
import numpy as np
cv2.imwrite("filename.png", np.zeros((10,10)))
корисно, якщо вам потрібно більше обробити, крім збереження.
np.zeros((10,10))
своїм образом.
cmap="gray"
коли я зберігаю зображення за допомогою cv2?
Якщо у вас є matplotlib, ви можете:
import matplotlib.pyplot as plt
plt.imshow(matrix) #Needs to be in row,col order
plt.savefig(filename)
plt.axis('off')
Ви можете використовувати бібліотеку "skimage" на Python
Приклад:
from skimage.io import imsave
imsave('Path_to_your_folder/File_name.jpg',your_array)
Додаток до відповіді @ Ideman42:
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
.)
Для тих, хто шукає прямий повноцінний приклад:
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)
matplotlib svn має нову функцію для збереження зображень як просто зображення - без осей тощо. Це дуже проста функція для підтримки також, якщо ви не хочете встановлювати svn (скопійовано прямо з image.py в 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)
Світ, мабуть, не потребує ще одного пакету для запису масиву нумерації у файл PNG, але для тих, хто не може отримати достатньо, я нещодавно поставив numpngw
на github:
https://github.com/WarrenWeckesser/numpngw
та на pypi: https://pypi.python.org/pypi/numpngw/
Єдина зовнішня залежність - нумерована.
Ось перший приклад із 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, який він створює:
Припустимо, що ви хочете зображення в градаціях сірого:
im = Image.new('L', (width, height))
im.putdata(an_array.flatten().tolist())
im.save("image.tiff")
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)
Якщо ви вже використовуєте [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 Spyder, тоді це не може бути легше, ніж просто клацнути правою кнопкою миші масив у змінному провіднику, а потім вибрати параметр Показати зображення.
Це попросить зберегти зображення у dsik, переважно у форматі PNG.
Бібліотека PIL у цьому випадку не знадобиться.
для збереження масивного масиву як зображення, U має кілька варіантів:
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) ...