ম্যাটপ্ল্লোলিব রঙিনম্যাপ প্রয়োগ করে কীভাবে একটি নুমপি অ্যারে পিআইএল ইমেজে রূপান্তর করবেন


132

আমার একটি সাধারণ সমস্যা আছে তবে আমি এর ভাল সমাধান খুঁজে পাচ্ছি না।

আমি একটি নম্পপি 2 ডি অ্যারে নিতে চাই যা গ্রেস্কেল চিত্রটি উপস্থাপন করে এবং ম্যাটপ্ল্লোটিব রঙিনম্যাপগুলি প্রয়োগ করার সময় এটি একটি আরজিবি পিআইএল চিত্রে রূপান্তরিত করতে চাই।

pyplot.figure.figimageকমান্ডটি ব্যবহার করে আমি যুক্তিসঙ্গত পিএনজি আউটপুট পেতে পারি :

dpi = 100.0
w, h = myarray.shape[1]/dpi, myarray.shape[0]/dpi
fig = plt.figure(figsize=(w,h), dpi=dpi)
fig.figimage(sub, cmap=cm.gist_earth)
plt.savefig('out.png')

যদিও আমি যা চাই তা পাওয়ার জন্য আমি এটি খাপ খাইয়ে নিতে পেরেছি (সম্ভবত স্ট্রিংআইও ব্যবহার করে পিআইএল চিত্রটি পেতে পারি) তবে আমি ভাবছি যে এটি করার সহজতর কোনও উপায় নেই কিনা, কারণ এটি চিত্রকল্পের খুব স্বাভাবিক সমস্যা বলে মনে হয়। আসুন বলি, এরকম কিছু:

colored_PIL_image = magic_function(array, cmap)

উত্তর:


220

বেশ ব্যস্ত ওয়ান-লাইনার, তবে এটি এখানে:

  1. প্রথমে আপনার NumPy অ্যারের নিশ্চিত করা, myarrayএ সর্বোচ্চ মান স্বাভাবিক হয় 1.0
  2. সরাসরি রঙিন্যাপ প্রয়োগ করুন myarray
  3. থেকে Rescale 0-255পরিসীমা।
  4. ব্যবহার করে পূর্ণসংখ্যায় রূপান্তর করুন np.uint8()
  5. ব্যবহার Image.fromarray()

এবং তুমি করে ফেলেছ:

from PIL import Image
from matplotlib import cm
im = Image.fromarray(np.uint8(cm.gist_earth(myarray)*255))

সাথে plt.savefig():

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

সাথে im.save():

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


7
"রঙিনম্যাপটি সরাসরি প্রয়োগ করুন myarray" অংশটি সরাসরি হৃদয়ে কাটা! আমি জানতাম না এটি সম্ভব, ধন্যবাদ!
হেলটনবাইকার

34
লিনিয়ারসাইগমেন্টেড কলারম্যাপ (যা থেকে cm.gist_earth একটি উদাহরণ) সম্পর্কে ডক্স অধ্যয়ন করে আমি আবিষ্কার করেছি যে এটি "বাইটস" যুক্তি দিয়ে কল করা সম্ভব যা এটি ইতিমধ্যে uint8 এ রূপান্তর করে। তারপরে, ওয়ান- im = Image.fromarray(cm.gist_earth(myarray, bytes=True))
লাইনারটি

1
@ সিপ্রিয়ানটোমিয়াগা, অ্যারের আকৃতিটি আপনি চান চিত্রের মাত্রা হওয়া উচিত। উদাহরণস্বরূপ, একটি ভিজিএ চিত্র আকৃতি (1024,768) সহ একটি অ্যারে থেকে উত্পন্ন হবে। আপনার মনোযোগ দেওয়া উচিত এটি একরঙা চিত্রগুলির জন্য প্রযোজ্য। এটি গুরুত্বপূর্ণ কারণ সাধারণত আপনি যখন কোনও আরজিবি চিত্রকে একটি অ্যারে রূপান্তর করেন তখন এর আকারটি উদাহরণস্বরূপ (1024,768,3) হয়, কারণ এর তিনটি চ্যানেল রয়েছে।
হেলটনবাইকার

5
আমি ত্রুটি NameError: name 'cm' is not defined
পাচ্ছি

10
@ এমএসওfrom matplotlib import cm
কোয়ান্টাম 7

10
  • ইনপুট = numpy_image
  • np.unit8 -> পূর্ণসংখ্যায় রূপান্তর করে
  • রূপান্তর ('আরজিবি') -> আরজিবিতে রূপান্তর করে
  • চিত্র.ফ্রোমারে -> একটি চিত্র অবজেক্ট প্রদান করে

    from PIL import Image
    import numpy as np
    
    PIL_image = Image.fromarray(np.uint8(numpy_image)).convert('RGB')
    
    PIL_image = Image.fromarray(numpy_image.astype('uint8'), 'RGB')

5
আশা করি এটি সমস্যার সমাধান করবে তবে দয়া করে এটি দিয়ে আপনার কোডের ব্যাখ্যা যুক্ত করুন যাতে ব্যবহারকারী সঠিকভাবে বুঝতে পারে যা সে / সে সত্যই চায়।
জামিল প্যাটেল

1
ভাল, আপডেট উত্তর। আগেরগুলি বেশ কয়েক বছর আগে থেকেই।
কাতালিনা চিরচু

7

গৃহীত উত্তরে বর্ণিত পদ্ধতিটি তার মন্তব্যে উল্লিখিত পরিবর্তনগুলি প্রয়োগ করার পরেও আমার পক্ষে কার্যকর হয়নি। তবে নীচের সহজ কোডটি কাজ করেছে:

import matplotlib.pyplot as plt
plt.imsave(filename, np_array, cmap='Greys')

np_array হয় 2 ডি অ্যারে হতে পারে যার মান 0.1 ফ্লোট o2 0..255 uint8 হতে পারে, এবং সেই ক্ষেত্রে এটির জন্য cmap দরকার p 3 ডি অ্যারেগুলির জন্য, cmap উপেক্ষা করা হবে।

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