আমার কাছে নম্পি অ্যারের ধরণের একটি ম্যাট্রিক্স রয়েছে। আমি কীভাবে এটি চিত্র হিসাবে এটি ডিস্কে লিখব? যে কোনও বিন্যাস কাজ করে (png, jpeg, bmp ...)। একটি গুরুত্বপূর্ণ বাধা হ'ল পিআইএল উপস্থিত নেই।
আমার কাছে নম্পি অ্যারের ধরণের একটি ম্যাট্রিক্স রয়েছে। আমি কীভাবে এটি চিত্র হিসাবে এটি ডিস্কে লিখব? যে কোনও বিন্যাস কাজ করে (png, jpeg, bmp ...)। একটি গুরুত্বপূর্ণ বাধা হ'ল পিআইএল উপস্থিত নেই।
উত্তর:
আপনি পাইপএনজি ব্যবহার করতে পারেন । এটি খাঁটি পাইথন (কোনও নির্ভরতা নেই) ওপেন সোর্স পিএনজি এনকোডার / ডিকোডার এবং এটি চিত্র হিসাবে NumPy অ্যারে লেখার পক্ষে সমর্থন করে।
এটি পিআইএল ব্যবহার করে তবে কিছুকে এটি কার্যকর হতে পারে:
import scipy.misc
scipy.misc.imsave('outfile.jpg', image_array)
সম্পাদনা : বর্তমান scipy
সংস্করণটি সমস্ত চিত্রকে স্বাভাবিক করতে শুরু করে যাতে নূন্যতম (ডেটা) কালো হয়ে যায় এবং সর্বোচ্চ (ডেটা) সাদা হয় white যদি তথ্যটি ধূসর স্তর বা নির্ভুল আরজিবি চ্যানেলগুলির হয় তবে এটি অযাচিত। সমাধান:
import scipy.misc
scipy.misc.toimage(image_array, cmin=0.0, cmax=...).save('outfile.jpg')
পিআইএল ব্যবহার করে একটি উত্তর (কেবলমাত্র এটি কার্যকর হলে)।
একটি অদ্ভুত অ্যারে "এ" দেওয়া হয়েছে:
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
ম্যাটপ্ল্লোব 2+-এ রয়েছে
import matplotlib.pyplot as plt
এবং তারপরেplt.imsave('name.png', array)
খাঁটি পাইথন (2 এবং 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"
যখন সিভি 2 ব্যবহার করে চিত্রটি সংরক্ষণ করি তখন এর জন্য আমি কীভাবে কিছু যুক্ত করতে পারি ?
আপনার যদি ম্যাটপ্ল্লিটিব থাকে তবে আপনি এটি করতে পারেন:
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)
@ ধারণাগুলি 42 এর উত্তরে সংযোজন:
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
এছাড়াও, আপনি যদি উচ্চ মানের মানের জেপিগ চান
.save(file, subsampling=0, quality=100)
ম্যাটপ্ল্লোলিব এসএনএন-তে কেবল একটি চিত্র হিসাবে চিত্রগুলি সংরক্ষণ করার জন্য একটি নতুন ফাংশন রয়েছে - কোনও অক্ষ নেই ইত্যাদি ব্যাকপোর্টের পক্ষেও খুব সাধারণ কাজ, যদি আপনি এসএনএন ইনস্টল করতে না চান (ম্যাটপ্লটলিব এসএনএন-তে চিত্র.পি থেকে সোজা অনুলিপি করা হয়), বংশবৃদ্ধির জন্য ডকস্ট্রিং):
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)
পিএনজি ফাইলে একটি নম্পি অ্যারে লেখার জন্য সম্ভবত পৃথিবীর আর কোনও প্যাকেজ দরকার নেই, তবে যারা যথেষ্ট পরিমাণে অর্জন করতে পারে না তাদের জন্য আমি সম্প্রতি গিথুব রেখেছি numpngw
:
https://github.com/WarrenWeckesser/numpngw
এবং পাইপিতে: 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)
এটি তৈরি করা পিএনজি ফাইলটি এখানে:
ধরে নিচ্ছেন আপনি গ্রেস্কেল চিত্র চান:
im = Image.new('L', (width, height))
im.putdata(an_array.flatten().tolist())
im.save("image.tiff")
ইমেজিও একটি পাইথন গ্রন্থাগার যা অ্যানিমেটেড চিত্র, ভিডিও, ভলিউম্যাট্রিক ডেটা এবং বৈজ্ঞানিক ফর্ম্যাট সহ চিত্রের বিস্তৃত তথ্য পড়ার এবং লেখার জন্য একটি সহজ ইন্টারফেস সরবরাহ করে। এটি ক্রস প্ল্যাটফর্ম, পাইথন ২.7 এবং ৩.৪++ এ চলে এবং এটি ইনস্টল করা সহজ।
এটি গ্রেস্কেল চিত্রের জন্য উদাহরণ:
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)
আপনি যদি ইতিমধ্যে [পাই] কিউটি ব্যবহার করেন তবে আপনি কিমাজে টুন্ডারে আগ্রহী হতে পারেন । সংস্করণ 1.4 (সবেমাত্র প্রকাশিত) দিয়ে শুরু করে পাইসাইডটিও সমর্থিত এবং imsave(filename, array)
স্কিপি'র মতো একটি ছোট্ট ফাংশন থাকবে তবে পিআইএল এর পরিবর্তে কিউটি ব্যবহার করবে। 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 এর আরেকটি সুবিধা হ'ল এটি একটি খাঁটি অজগর সমাধান যা এটি আরও হালকা করে তোলে))
আপনি যদি অজগর পরিবেশ স্পাইডারে কাজ করছেন, তবে ভেরিয়েবল এক্সপ্লোরারটিতে অ্যারেটি ডান ক্লিক করতে হবে, এবং তারপরে চিত্র প্রদর্শনী বিকল্পটি বেছে নেওয়ার চেয়ে আরও সহজ কিছু হতে পারে না।
এটি আপনাকে বেশিরভাগ পিএনজি ফর্ম্যাটে চিত্রটি ডিএসিকে সংরক্ষণ করতে বলবে।
এক্ষেত্রে পিআইএল লাইব্রেরির প্রয়োজন হবে না।
ব্যবহার 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) অন্যান্য সেরা: ওপেনসিভি
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) ...