একটি নম্পি অ্যারের চিত্র হিসাবে সংরক্ষণ করা হচ্ছে


260

আমার কাছে নম্পি অ্যারের ধরণের একটি ম্যাট্রিক্স রয়েছে। আমি কীভাবে এটি চিত্র হিসাবে এটি ডিস্কে লিখব? যে কোনও বিন্যাস কাজ করে (png, jpeg, bmp ...)। একটি গুরুত্বপূর্ণ বাধা হ'ল পিআইএল উপস্থিত নেই।


12
আমি কেবল নীচে লক্ষ্য করতে চাই যে, এবং অবশ্যই কিছু লোক আসছেন এবং এই প্রশ্নটি সন্ধান করছেন, পিআইএল ছাড়াই উপরে তালিকাবদ্ধ সীমাবদ্ধতা পূরণ করেন না । যেহেতু কিছু প্রশ্নকারী এবং কিছু উত্তর উভয়ই এই সীমাবদ্ধতা এড়ায়, তাই আমি এখানে উপস্থিত কাউকেই উত্সাহিত করি এবং পিআইএল থাকা নীচে দেখতে কোনও আপত্তি করি না, এবং কোনও পিআইএল উত্তর (নতুন বা পুরাতন) উল্লেখ করে যে তারা পিআইএল-ব্যবহৃত হয়েছে উত্তরের ধরণ, মূল সীমাবদ্ধতার সাথে মিল রেখে উত্তরগুলি থেকে আলাদা করতে।
লিন্ডস

সম্পর্কিত বলে মনে হচ্ছে: স্ট্যাকওভারফ্লো
---

উত্তর:


54

আপনি পাইপএনজি ব্যবহার করতে পারেন । এটি খাঁটি পাইথন (কোনও নির্ভরতা নেই) ওপেন সোর্স পিএনজি এনকোডার / ডিকোডার এবং এটি চিত্র হিসাবে NumPy অ্যারে লেখার পক্ষে সমর্থন করে।


4
পিএনজি-র জন্য সঠিক মানের জন্য মানগুলি স্কেল করতে মনে রাখবেন, সাধারণত 0..255। নিউরাল নেটওয়ার্কগুলির মান পরিসীমা প্রায়শই ০.১ বা -১.১ হয়।
টমো গ্যাভেনিয়াক

8
পাইপএনজি খাঁটি পাইথন, এটি তার বাহ্যিক নির্ভরতা হ্রাস করে তবে এটি পিআইএল এবং এর উত্পন্ন ক্লাসগুলির চেয়ে অনেক ধীর করে তোলে। উদাহরণস্বরূপ, আমার মেশিনে একটি 3000x4000 চিত্র সংরক্ষণ করতে পাইপএনজি দিয়ে 4.05 সেকেন্ড সময় লেগেছে তবে স্কিপি.মিস্ক.আইমসেভ (6x দ্রুত) দিয়ে মাত্র 0.59 সেকেন্ডে।
Zvika 11

@ টোমগ্যাভেনিয়াক - scipy.misc.imsave এখন স্কপির নতুন সংস্করণগুলিতে হ্রাস করা হয়েছে। নীচে কয়েকটি মন্তব্যের বিকল্প হ'ল ইমেজ.আইমরাইট ('ইমেজ_ফিল.জপিজি', অ্যারে) ব্যবহার করা
-এড

258

এটি পিআইএল ব্যবহার করে তবে কিছুকে এটি কার্যকর হতে পারে:

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')

19
মধ্যে imsave জীবন ... / scipy / বিবিধ / pilutil.py যা PIL ব্যবহার
ডেনিস

5
Jpg এ রূপান্তর করার সময় সতর্কতা অবলম্বন করুন যেহেতু এটি ক্ষতিকারক এবং তাই আপনি চিত্রটি তৈরি করতে ব্যবহৃত সঠিক তথ্য পুনরুদ্ধার করতে পারবেন না।
Feanil

8
এটি এখন স্কিপি 0.19 ব্যবহারে নষ্ট করা হয়েছে - scipy.io.imwrite
g.stevo

6
"ইমস্যাভটি সায়পাই ১.০.০ এ অবচয় করা হয়েছে, এবং ১.২.০ এ মুছে ফেলা হবে" ( স্কিপি ১.১.০ ডক )
নুবার

15
scipy.misc.imsave হ্রাস করা হয়েছে। আমদানি চিত্র ব্যবহার; imageio.imwrite ('file_name.jpg', nmupy_array)
বিশৃঙ্খলাবিদ

228

পিআইএল ব্যবহার করে একটি উত্তর (কেবলমাত্র এটি কার্যকর হলে)।

একটি অদ্ভুত অ্যারে "এ" দেওয়া হয়েছে:

from PIL import Image
im = Image.fromarray(A)
im.save("your_file.jpeg")

আপনি চান প্রায় কোনও বিন্যাসের সাথে আপনি "জেপেইগ" প্রতিস্থাপন করতে পারেন। ফর্ম্যাটগুলি সম্পর্কে আরও বিশদ এখানে


5
চিত্রটি পিআইএল-এর একটি মডিউল। "চিত্র ছাপুন __ ফাইল __"
জুহ_

10
আমরা যারা এখানে ঘোরাফেরা করেছি এবং পিআইএল করেছি তাদের জন্য খুব সহায়ক - আমি মনে করি আমি from PIL import Imageএটি পরিষ্কার রাখতে ব্যবহার করব ...
age

4
আপনি যদি কোনও আরজিবি চিত্র পেয়ে থাকেন তবে im = চিত্র.fromarray (A)। কনভার্ট ('আরজিবি') ব্যবহার করে ছবিটি পেতে পারেন আরও তথ্য: stackoverflow.com/questions/4711880/…
রজার ভিসিয়ানা

আরজিবি কোড করতে uint8 এর অ্যারের তৃতীয় অক্ষটি ব্যবহার করে এই পদ্ধতিটি ব্যবহার করে। মডিউল পিআইএল "পিপ ইনস্টল বালিশ" ব্যবহার করে ইনস্টল করা যেতে পারে।
bli

1
@ লুডোভিচো ভার্নিয়ানি এটি চিত্রগুলিকে বিকৃত করে না, তবে এটি কিছুটা অস্বাভাবিক রঙের এনকোডিং ব্যবহার করে যাতে রঙগুলির ক্রম আরজিবি পরিবর্তে বিজিআর হয়।
জভিকা

86

সাথে 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.imsave () নতুন সংস্করণগুলিতে
বিনয় লোধ

6
এটি matplotlib.pyplot.imsaveম্যাটপ্ল্লোব 2+-এ রয়েছে
আলেক্সেই পেট্রেনকো

1
@HughPerkins চেষ্টা বালিশ পাইথন 3 PIL পরিবর্তে
christianbrodbeck

10
import matplotlib.pyplot as pltএবং তারপরেplt.imsave('name.png', array)
আলেসান্দ্রো জ্যাকসন

61

খাঁটি পাইথন (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)


2
এটি ঠিক যা খুঁজছি তা মনে হচ্ছে তবে আপনি কি কিছু মন্তব্য যুক্ত করতে পারেন? আমি দেখতে পাচ্ছি না কীভাবে এটি কোনও ফাইলে লেখেন। আপনি কি পূর্বে খোলা ফাইলটিতে আউটপুট লিখতে হবে? ধন্যবাদ!
ফিলম্যাকেকে

1
@ ফিলম্যাককে, ডেটা কেবল একটি বাইনারি ফাইলে লিখতে হবে। যুক্ত মন্তব্য।
ধারণাগুলি 42

1
চিত্রটি কোন বিন্যাসে থাকা উচিত তা নির্দিষ্ট করে কেউ bufবলতে পারে? এটি কোনও শূন্য অ্যারে বলে মনে হচ্ছে না ...
খ্রিস্টিয়ানব্রোডবেক

1
@ ক্রিশ্চিয়ানম্ব্রোডবেক, একটি বাইটায়ারে (আরজিবিআরজিবিএ ...)
ধারণাগুলি 42

1
ধন্যবাদ @ ধারনা 42 আমি ব্লেন্ডারে ব্যবহারের জন্য এই কোডটি পোর্ট করেছি ।
ইমালকি

57

আছে opencv(পাইথন জন্য এখানে ডকুমেন্টেশন )।

import cv2
import numpy as np

cv2.imwrite("filename.png", np.zeros((10,10)))

আপনার যদি সংরক্ষণ ব্যতীত আরও বেশি প্রক্রিয়াজাতকরণ করতে হয় তবে দরকারী।


1
10 মাপের অ্যারে কেন? এই সমাধানে ব্যবহৃত 10 টির পছন্দ কী হয়েছিল?
গাথাইড

3
@ গ্যাথাইড ঠিক তেমন উদাহরণ হিসাবে ফাইলটিতে কিছু স্বেচ্ছাসেবী নামী ম্যাট্রিক্স লেখার জন্য। বাস্তব জীবনে np.zeros((10,10))আপনার ইমেজ সঙ্গে প্রতিস্থাপন ।
Xocoatzin

5
আমি cmap="gray"যখন সিভি 2 ব্যবহার করে চিত্রটি সংরক্ষণ করি তখন এর জন্য আমি কীভাবে কিছু যুক্ত করতে পারি ?
মোনা জালাল

@ এক্সোকাটজিন ব্রোকন লিঙ্ক?
jtlz2

1
@ jtlz2 আপডেট লিঙ্ক।
Xocoatzin

30

আপনার যদি ম্যাটপ্ল্লিটিব থাকে তবে আপনি এটি করতে পারেন:

import matplotlib.pyplot as plt
plt.imshow(matrix) #Needs to be in row,col order
plt.savefig(filename)

এটি প্লটটি সংরক্ষণ করবে (চিত্রগুলি নিজেরাই নয়)। এখানে চিত্র বর্ণনা লিখুন


10
না, পাইপ্লট ইন্টারফেসের জন্য, plt.figure () অতিমাত্রায়। এছাড়াও, আপনার কেবলমাত্র plt.show () দরকার যদি আপনি পাশাপাশি একটি চিত্র চিত্র উইন্ডো দেখতে চান - এই ক্ষেত্রে কেবল একটি চিত্র ফাইল সংরক্ষণ করা পছন্দসই ছিল, সুতরাং শো () কল করার প্রয়োজন ছিল না।
ডপলারশিফ্ট

7
মনে রাখবেন যে ফলস্বরূপ চিত্র ফাইলটি কেবল পিক্সেল ডেটা নয় - ম্যাটপ্ল্লোটিব চিত্রের অক্ষ এবং ধূসর অঞ্চল ধারণ করবে।
ডেভ

1
আপনি যদি রিমোট হোস্টে স্ক্রিপ্ট চালনা করেন তবে কাজ করবে না, গ্রাফিকাল ইন্টারফেস সমর্থন ছাড়াই এটিতে ssh-ing।
তেমাক

আপনি যদি ছবিটি কোনও নোটবুকে দেখাতে চান তবে আপনি নিম্নলিখিতগুলি যুক্ত করতে পারেন: >> "আইপিথন থেকে ডিসপ্লে আমদানি করুন চিত্র" এবং তারপরে >> "চিত্র (ফাইলের নাম = ফাইলের নাম)"
রবার্ট

অক্ষটি সরাতে:plt.axis('off')
ইয়াকআউট


15

scipy.miscimsaveফাংশন সম্পর্কে অবমূল্যায়ন সতর্কতা দেয় এবং imageioপরিবর্তে এর ব্যবহারের পরামর্শ দেয় ।

import imageio
imageio.imwrite('image_name.png', img)

12

@ ধারণাগুলি 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:

লাল, হলুদ, গা dark়-একোয়া, ধূসর রঙের গ্রিড

(স্বচ্ছতা এছাড়াও উচ্চ বাইট থেকে হ্রাস করে কাজ করে 0xff।)


8

যারা সরাসরি পুরোপুরি কার্যকরী উদাহরণ খুঁজছেন তাদের জন্য:

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)


6

ম্যাটপ্ল্লোলিব এসএনএন-তে কেবল একটি চিত্র হিসাবে চিত্রগুলি সংরক্ষণ করার জন্য একটি নতুন ফাংশন রয়েছে - কোনও অক্ষ নেই ইত্যাদি ব্যাকপোর্টের পক্ষেও খুব সাধারণ কাজ, যদি আপনি এসএনএন ইনস্টল করতে না চান (ম্যাটপ্লটলিব এসএনএন-তে চিত্র.পি থেকে সোজা অনুলিপি করা হয়), বংশবৃদ্ধির জন্য ডকস্ট্রিং):

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)

3

পিএনজি ফাইলে একটি নম্পি অ্যারে লেখার জন্য সম্ভবত পৃথিবীর আর কোনও প্যাকেজ দরকার নেই, তবে যারা যথেষ্ট পরিমাণে অর্জন করতে পারে না তাদের জন্য আমি সম্প্রতি গিথুব রেখেছি 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)

এটি তৈরি করা পিএনজি ফাইলটি এখানে:

example1.png


আমি কৌতূহলী, আপনার লিবিব অন্যদের থেকে আলাদা কীভাবে? এটা কি দ্রুত? এটিতে অভিনব বৈশিষ্ট্য রয়েছে?
এফ লেকচাস

কয়েকটি বৈশিষ্ট্য: (1) এতে অলস অ্যারে ব্যবহার করা হয়। (২) এটি কেবল পাইথন এবং নম্পি ব্যবহার করে লেখা হয়েছে, সুতরাং এটির জন্য সি লাইব্রেরি ইনস্টল করার প্রয়োজন হয় না। (3) এটি অ্যানিমেটেড পিএনজি ফাইল তৈরি করতে পারে। (4) এটি অ্যানিমেটেড পিএনজি ফাইল হিসাবে matplotlib অ্যানিমেশন লেখার জন্য একটি ক্লাস সরবরাহ করে।
ওয়ারেন উইক্কেসার

ধন্যবাদ! আমি কীভাবে এর সাথে তুলনা করব তা জানতে আগ্রহী স্ট্যাকওভারফ্লো . com/a/19174800/981933 এর তুলনার যা খাঁটি অজগর। পূর্বের পদ্ধতিটি পিআইএল এর চেয়ে 2x দ্রুতগতির, যা দুর্দান্ত। এটি যদি আপনার লক্ষ্য না হয় তবে
কোনও বিষয় নেই


2

ইমেজিও একটি পাইথন গ্রন্থাগার যা অ্যানিমেটেড চিত্র, ভিডিও, ভলিউম্যাট্রিক ডেটা এবং বৈজ্ঞানিক ফর্ম্যাট সহ চিত্রের বিস্তৃত তথ্য পড়ার এবং লেখার জন্য একটি সহজ ইন্টারফেস সরবরাহ করে। এটি ক্রস প্ল্যাটফর্ম, পাইথন ২.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

আপনি যদি ইতিমধ্যে [পাই] কিউটি ব্যবহার করেন তবে আপনি কিমাজে টুন্ডারে আগ্রহী হতে পারেন । সংস্করণ 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 এর আরেকটি সুবিধা হ'ল এটি একটি খাঁটি অজগর সমাধান যা এটি আরও হালকা করে তোলে))


1.4 প্রকাশটি এখন বাইরে out :-) (আমি সেই অনুযায়ী উত্তরটি সম্পাদনা করেছি))
হ্যান্স_মাইন

1

আপনি যদি অজগর পরিবেশ স্পাইডারে কাজ করছেন, তবে ভেরিয়েবল এক্সপ্লোরারটিতে অ্যারেটি ডান ক্লিক করতে হবে, এবং তারপরে চিত্র প্রদর্শনী বিকল্পটি বেছে নেওয়ার চেয়ে আরও সহজ কিছু হতে পারে না।

এখানে চিত্র বর্ণনা লিখুন

এটি আপনাকে বেশিরভাগ পিএনজি ফর্ম্যাটে চিত্রটি ডিএসিকে সংরক্ষণ করতে বলবে।

এক্ষেত্রে পিআইএল লাইব্রেরির প্রয়োজন হবে না।


1

ব্যবহার 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  

0

চিত্র হিসাবে একটি নম্পী অ্যারে সংরক্ষণ করার জন্য, আপনার কয়েকটি পছন্দ আছে:

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) ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.