मेरे पास एक Numpy सरणी के प्रकार में एक मैट्रिक्स है। मैं इसे एक छवि के रूप में डिस्क करने के लिए कैसे लिखूंगा? कोई भी प्रारूप काम करता है (png, jpeg, bmp ...)। एक महत्वपूर्ण बाधा यह है कि पीआईएल मौजूद नहीं है।
मेरे पास एक Numpy सरणी के प्रकार में एक मैट्रिक्स है। मैं इसे एक छवि के रूप में डिस्क करने के लिए कैसे लिखूंगा? कोई भी प्रारूप काम करता है (png, jpeg, bmp ...)। एक महत्वपूर्ण बाधा यह है कि पीआईएल मौजूद नहीं है।
जवाबों:
आप PyPNG का उपयोग कर सकते हैं । यह एक शुद्ध पायथन (कोई निर्भरता नहीं) खुला स्रोत PNG एनकोडर / डिकोडर है और यह इमेज के रूप में NumPy सरणियों को लिखने का समर्थन करता है ।
यह पीआईएल का उपयोग करता है, लेकिन हो सकता है कि कुछ को यह उपयोगी लगे:
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 का उपयोग कर एक उत्तर (बस मामले में यह उपयोगी है)।
"ए" को एक सुव्यवस्थित सारणी दी गई है:
from PIL import Image
im = Image.fromarray(A)
im.save("your_file.jpeg")
आप "जेपीईजी" को अपने इच्छित किसी भी प्रारूप से बदल सकते हैं। यहाँ स्वरूपों के बारे में अधिक जानकारी
from PIL import Image
इसे स्पष्ट रखने के लिए उपयोग करूंगा ...
के साथ 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.
matplotlib.pyplot.imsave
Matplotlib 2+ में
import matplotlib.pyplot as plt
और फिरplt.imsave('name.png', array)
शुद्ध पायथन (2 और 3), 3 पार्टी पर निर्भरता के बिना एक स्निपेट।
यह फ़ंक्शन कंप्रेस्ड, ट्रू-कलर (4 बाइट्स प्रति पिक्सेल) RGBA
पीएनजी की लिखता है ।
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
(अजगर के लिए यहाँ प्रलेखन )।
import cv2
import numpy as np
cv2.imwrite("filename.png", np.zeros((10,10)))
यदि आपको बचत के अलावा अन्य प्रसंस्करण करने की आवश्यकता है तो उपयोगी है।
np.zeros((10,10))
में अपनी छवि के साथ बदलें ।
cmap="gray"
जब मैं छवि को cv2 का उपयोग करके सहेजता हूं तो मैं कुछ कैसे जोड़ सकता हूं ?
यदि आपके पास माटाप्लोटिब है, तो आप कर सकते हैं:
import matplotlib.pyplot as plt
plt.imshow(matrix) #Needs to be in row,col order
plt.savefig(filename)
plt.axis('off')
आप पायथन में 'स्किमेज' लाइब्रेरी का उपयोग कर सकते हैं
उदाहरण:
from skimage.io import imsave
imsave('Path_to_your_folder/File_name.jpg',your_array)
Addendum @ @ 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
।)
प्रत्यक्ष प्रत्यक्ष काम करने वाले उदाहरण की तलाश करने वालों के लिए:
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 को स्थापित नहीं करना चाहते हैं (matplotlib svn में image.py से सीधे कॉपी किया गया, हटा दिया गया) संक्षिप्तता के लिए 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
पर रखा है :
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 पुस्तकालय है जो कि एनिमेटेड डेटा, वीडियो, वॉल्यूमेट्रिक डेटा और वैज्ञानिक स्वरूपों सहित छवि डेटा की एक विस्तृत श्रृंखला को पढ़ने और लिखने के लिए एक आसान इंटरफ़ेस प्रदान करता है। यह क्रॉस-प्लेटफ़ॉर्म है, पायथन 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 के समान एक छोटे से कार्य होगा , लेकिन PIL के बजाय Qt का उपयोग करना। 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 का एक अन्य लाभ यह है कि यह एक शुद्ध अजगर समाधान है, जो इसे और भी हल्का बनाता है।)
यदि आप अजगर पर्यावरण स्पाइडर में काम कर रहे हैं, तो यह केवल चर एक्सप्लोरर में सरणी पर राइट क्लिक करने से ज्यादा आसान नहीं हो सकता है, और फिर शो इमेज विकल्प चुनें।
यह आपको dsik में इमेज सेव करने के लिए कहेगा, ज्यादातर PNG फॉर्मेट में।
इस मामले में पीआईएल लाइब्रेरी की जरूरत नहीं होगी।
का उपयोग करें 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) अन्य का सबसे अच्छा: 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) ...