Numpy dizi türünde bir matris var. Bir görüntü olarak diske nasıl yazarım? Herhangi bir format çalışır (png, jpeg, bmp ...). Önemli bir kısıtlama, PIL'in mevcut olmamasıdır.
Numpy dizi türünde bir matris var. Bir görüntü olarak diske nasıl yazarım? Herhangi bir format çalışır (png, jpeg, bmp ...). Önemli bir kısıtlama, PIL'in mevcut olmamasıdır.
Yanıtlar:
PyPNG kullanabilirsiniz . Saf bir Python (bağımlılık yok) açık kaynaklı PNG kodlayıcı / kod çözücüdür ve NumPy dizilerini görüntü olarak yazmayı destekler .
Bu PIL kullanır, ancak bazıları bunu yararlı bulabilir:
import scipy.misc
scipy.misc.imsave('outfile.jpg', image_array)
EDIT : Geçerli scipy
sürüm, min (veri) siyah ve max (veri) beyaz olacak şekilde tüm görüntüleri normalleştirmeye başladı. Verilerin tam gri seviyeleri veya tam RGB kanalları olması durumunda bu istenmeyen bir durumdur. Çözüm:
import scipy.misc
scipy.misc.toimage(image_array, cmin=0.0, cmax=...).save('outfile.jpg')
PIL kullanarak bir cevap (yararlı olması durumunda).
"A" numpy dizisi verildi:
from PIL import Image
im = Image.fromarray(A)
im.save("your_file.jpeg")
"jpeg" yerine istediğiniz her formatı koyabilirsiniz. Buradaki biçimler hakkında daha fazla ayrıntı
from PIL import Image
bunu açık tutmak için kullanacağını düşünüyorum ...
İle matplotlib
:
import matplotlib
matplotlib.image.imsave('name.png', array)
Matplotlib 1.3.1 ile çalışır, daha düşük sürüm hakkında bilmiyorum. Öğretiden:
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
2+ matplotlib içinde
import matplotlib.pyplot as plt
ve sonraplt.imsave('name.png', array)
Saf Python (2 ve 3), 3. taraf bağımlılığı olmayan bir snippet.
Bu işlev sıkıştırılmış, gerçek renkli (piksel başına 4 bayt) RGBA
PNG'ler yazar.
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'')])
... Veriler, aşağıdaki gibi doğrudan ikili olarak açılan bir dosyaya yazılmalıdır:
data = write_png(buf, 64, 64)
with open("my_image.png", 'wb') as fh:
fh.write(data)
buf
) hangi formatta olması gerektiğini belirtebilir mi? Numpy dizi gibi görünmüyor ...
Orada opencv
(piton için buraya belgelerine ).
import cv2
import numpy as np
cv2.imwrite("filename.png", np.zeros((10,10)))
kaydetmekten başka daha fazla işlem yapmanız gerekiyorsa yararlıdır.
np.zeros((10,10))
resminizle değiştirin .
cmap="gray"
Resmi cv2 kullanarak kaydettiğimde nasıl bir şey ekleyebilirim ?
Matplotlib'iniz varsa şunları yapabilirsiniz:
import matplotlib.pyplot as plt
plt.imshow(matrix) #Needs to be in row,col order
plt.savefig(filename)
plt.axis('off')
Python'da 'skimage' kütüphanesini kullanabilirsiniz
Misal:
from skimage.io import imsave
imsave('Path_to_your_folder/File_name.jpg',your_array)
@ İdeasman42'nin cevabına ek:
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()
Böylece şunları yapabilirsiniz:
saveAsPNG([[0xffFF0000, 0xffFFFF00],
[0xff00aa77, 0xff333333]], 'test_grid.png')
Üreten test_grid.png
:
(Şeffaflık ayrıca yüksek baytı azaltarak da çalışır 0xff
.)
Doğrudan çalışan tam bir örnek arayanlar için:
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
Ayrıca, yüksek kaliteli jpeg'ler istiyorsanız
.save(file, subsampling=0, quality=100)
matplotlib svn, görüntüleri sadece görüntü olarak kaydetmek için yeni bir işleve sahiptir - eksen yok vb. svn'yi yüklemek istemiyorsanız (matplotlib svn'de doğrudan image.py'dan kopyalanırsa, kısalık için öğreti):
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)
Dünya muhtemelen bir PNG dosyasına sayısal bir dizi yazmak için başka bir pakete ihtiyaç duymaz, ancak yeterince alamayanlar için son zamanlarda numpngw
github'a koydum :
https://github.com/WarrenWeckesser/numpngw
ve pypi'de: https://pypi.python.org/pypi/numpngw/
Tek dış bağımlılık numpy.
İşte examples
deponun dizininden ilk örnek . Temel çizgi basitçe
write_png('example1.png', img)
img
nümerik bir dizi nerede . Bu satırdan önceki tüm kod, içe aktarma ifadeleri ve oluşturulacak koddur 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)
İşte oluşturduğu PNG dosyası:
Gri tonlamalı bir görüntü istediğinizi varsayarsak:
im = Image.new('L', (width, height))
im.putdata(an_array.flatten().tolist())
im.save("image.tiff")
Imageio , animasyonlu görüntüler, video, hacimsel veriler ve bilimsel formatlar dahil olmak üzere çok çeşitli görüntü verilerini okumak ve yazmak için kolay bir arayüz sağlayan bir Python kütüphanesidir. Çapraz platformdur, Python 2.7 ve 3.4+ üzerinde çalışır ve kurulumu kolaydır.
Bu, gri tonlamalı görüntü için bir örnektir:
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)
Zaten [Py] Qt kullanıyorsanız, qimage2ndarray ile ilgilenebilirsiniz . 1.4 sürümünden (yeni çıkacak) başlayarak, PySide da destekleniyor ve imsave(filename, array)
scipy's'e benzer küçük bir işlev olacak , ancak PIL yerine Qt kullanacak. 1.3 ile aşağıdaki gibi bir şey kullanın:
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'ün bir başka avantajı, bunun daha da hafif olmasını sağlayan saf bir python çözümü olmasıdır.)
Python ortamı Spyder'da çalışıyorsanız, değişken explorer'da diziyi sağ tıklatıp Görüntüyü Göster seçeneğini seçmekten daha kolay olamaz.
Bu, görüntüyü çoğunlukla PNG formatında dsik'e kaydetmenizi isteyecektir.
Bu durumda PIL kütüphanesine ihtiyaç duyulmaz.
Kullanın 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
Numpy diziyi resim olarak kaydetmek için U'nun birkaç seçeneği vardır:
1) En iyisi: OpenCV
import cv2 cv2.imwrite('file name with extension(like .jpg)', numpy_array)
2) Matplotlib
from matplotlib import pyplot as plt plt.imsave('file name with extension(like .jpg)', numpy_array)
3) PIL
from PIL import Image image = Image.fromarray(numpy_array) image.save('file name with extension(like .jpg)')
4) ...