2017-02-22 29 views
-1

Я хочу написать одноканальное PNG-изображение из массива numpy в python? В Matlab, что будетPython: Как написать одноканальный png-файл из массива numpy?

A = randi(100,100,255) 
imwrite(uint8(A),'myFilename.png','png'); 

Я видел exampels используя from PIL import Image и Image.fromarray(), но они для Jpeg и 3-канальных формате PNG только он появляется ...

я уже нашел решение с помощью OpenCV, я буду разместите его здесь. Надеется, это сократит чужой поиск ...

+1

https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.misc.imsave.html – MaxNoe

+0

это решение будет для rgb, но мне нужен один канал – mcExchange

+0

Если вы передадите ему один канал, он записывает один канал. См. Первый пример, это градиент bw. – MaxNoe

ответ

0

Вот решение с использованием OpenCV/CV2

import cv2 
myImg = np.random.randint(255, size=(200, 400)) # create a random image 
cv2.imwrite('myImage.png',myImg) 
0

Вы можете не использовать OpenCV для простых манипуляций с изображениями. Как было предложено, используйте PIL:

im = Image.fromarray(arr) 
im.save("output.png", "PNG") 

Вы пробовали это? Что здесь не удалось, это привело вас к выводу, что это только JPEG?

+0

это сохраняет 3-канальный pnd, но мне нужен файл с 1 каналом png – mcExchange

+0

. Тогда вам понадобится ваш массив типа uint8. im = изображение.fromarray (arr.astype (numpy.uint8)) – Pearley

1

PIL-х Image.fromarray() автоматически определяет mode использовать from the datatype переданной Numpy массива, например, для 8-битовых градаций серого изображения вы можете использовать:

from PIL import Image 
import numpy as np 

data = np.random.randint(256, size=(100, 100), dtype=np.uint8) 
img = Image.fromarray(data) # uses mode='L' 

Это, однако, работает только если массив использует совместимый тип данных , если вы просто используете data = np.random.randint(256, size=(100, 100)), что может привести к массиву int64 (typestr <i8), который PIL не может обрабатывать.

Вы также можете указать другой режим, например. интерпретировать массив 32bit как RGB изображения:

data = np.random.randint(2**32, size=(100, 100), dtype=np.uint32) 
img = Image.fromarray(data, mode='RGB') 

Внутренне Image.fromarray() просто пытается угадать правильный режим и размер, а затем вызывает Image.frombuffer().

Изображения могут быть сохранены в любом формате PILcan handle например: img.save('filename.png')