मैं एक छवि के लिए (और प्रदर्शन) एक संख्यात्मक सरणी कैसे परिवर्तित करूं?


227

मैंने इस प्रकार एक सरणी बनाई है:

import numpy as np
data = np.zeros( (512,512,3), dtype=np.uint8)
data[256,256] = [255,0,0]

मैं जो करना चाहता हूं, वह 512x512 छवि के केंद्र में एक एकल लाल बिंदु प्रदर्शित करता है। (कम से कम शुरू करने के लिए ... मुझे लगता है कि मैं वहां से बाकी का पता लगा सकता हूं)


1
यह भी देखें stackoverflow.com/questions/902761/… हालाँकि किसी ने यह विवश कर दिया कि PIL का उपयोग नहीं किया जा सकता।
पीटर हैनसन

क्या आप पीटर के स्वीकृत उत्तर को बदलने पर विचार कर सकते हैं ? यह दोनों सुन्न सरणी के चारों ओर एक वस्तु को लपेटने की आवश्यकता से बचता है और छवि को प्रदर्शित करने के लिए एक अस्थायी फ़ाइल लिखने से बचता है।
जोशियाह योडर

जवाबों:


224

छवि बनाने (और प्रदर्शित करने) के लिए आप PIL का उपयोग कर सकते हैं:

from PIL import Image
import numpy as np

w, h = 512, 512
data = np.zeros((h, w, 3), dtype=np.uint8)
data[0:256, 0:256] = [255, 0, 0] # red patch in upper left
img = Image.fromarray(data, 'RGB')
img.save('my.png')
img.show()

3
ऐसा लगता है कि एक बग है। आप आकार के साथ सरणी बनाते हैं (w,h,3), लेकिन यह होना चाहिए (h,w,3), क्योंकि PIL में अनुक्रमण अलग-अलग अंको में अनुक्रमित होता है। संबंधित प्रश्न है: stackoverflow.com/questions/33725237/…
fdermishin

1
@ user502144: मेरी त्रुटि को इंगित करने के लिए धन्यवाद। मुझे आकार की एक सरणी बनानी चाहिए थी (h,w,3)। (यह अब तय हो गया है, ऊपर।) पहली अक्ष की लंबाई को सरणी में पंक्तियों की संख्या और दूसरी धुरी की लंबाई के रूप में सोचा जा सकता है, स्तंभों की संख्या। तो (h, w)"ऊंचाई" hऔर "चौड़ाई" की एक सरणी से मेल खाती है wImage.fromarrayइस सरणी को ऊंचाई hऔर चौड़ाई की छवि में परिवर्तित करता है w
अप्रयुक्त डिब

1
img.show()ipython नोटबुक में काम न करें। img_pil = Image.fromarray(img, 'RGB') display(img_pil.resize((256,256), PIL.Image.LANCZOS))
मर्गलूम

@unutbu इस विधि से छवियों को विकृत करने के लिए लगता है ... stackoverflow.com/questions/62293077/…
लुडोविको वर्नियानी

284

निम्नलिखित काम करना चाहिए:

from matplotlib import pyplot as plt
plt.imshow(data, interpolation='nearest')
plt.show()

यदि आप Jupyter नोटबुक / लैब का उपयोग कर रहे हैं, तो matplotlib को आयात करने से पहले इस इनलाइन कमांड का उपयोग करें:

%matplotlib inline 

3
यह पीआईएल की तुलना में अधिक सटीक है। पीआईएल सरणी मानों को बचाता / सामान्य करता है, जबकि पिपलॉट वास्तविक आरजीबी मूल्यों का उपयोग करता है जैसे वे हैं।
गैरीओ

21
शायद यह जानना अच्छा है: यदि आप स्केल चित्र प्रदर्शित करना चाहते हैं, तो plt.gray()अपने कोड में एक बार कॉल करने के बाद सभी ग्राफ़ को ग्रेस्केल में बदलना उचित है । ओपी क्या चाहता है लेकिन फिर भी अच्छा नहीं जानता।
सेर्नो

2
इसे कैसे बचाएं?
user334639

फ़ाइल "<ipython-input-29-29c784f62838>", लाइन 39 plt.show () ^ सिंटैक्सएयर: अमान्य वाक्यविन्यास
मोना जलाल

1
@ कर्नो इसके अलावा, स्केल छवियों में एच (एच, डब्ल्यू, 1) के बजाय आकार (एच, डब्ल्यू) होना चाहिए। आप squeeze()तीसरे आयाम को खत्म करने के लिए उपयोग कर सकते हैं :plt.imshow(data.squeeze())
योशिय्याह योडर

51

सबसे छोटा रास्ता scipyइस तरह उपयोग करना है :

from scipy.misc import toimage
toimage(data).show()

इसके लिए पीआईएल या पिलो भी लगाना पड़ता है।

इसी तरह के दृष्टिकोण को भी पीआईएल या पिलो की आवश्यकता होती है, लेकिन जो एक अलग दर्शक को आमंत्रित कर सकता है:

from scipy.misc import imshow
imshow(data)

तो यह विधि अजगर 3.5 के साथ असंगत है ...?
क्रिस्टोफर

@ बोर्डो, यह 3.5 के साथ असंगत क्यों होगा? यह सिर्फ एक आयात और फ़ंक्शन कॉल की एक जोड़ी है।
पीटर हैनसेन

पीआईएल 3.5 के साथ असंगत है (स्थापित नहीं होगा)
क्रिस्टोफर

1
Ftr: आप इसे सीधे उपयोग करके आगे छोटा कर सकते हैं scipy.misc.imshow(data)
dtk 13

3
toimagescipy-1.0.0 में पदावनत किया गया और 1.2.0 में पिलो के पक्ष में हटा दिया गया Image.fromarray
सिड

4

Pygame का उपयोग करके , आप एक विंडो खोल सकते हैं, सतह को पिक्सेल की एक सरणी के रूप में प्राप्त कर सकते हैं, और वहां से जैसा चाहें, हेरफेर कर सकते हैं। आपको अपने समसामयिक सरणी को सतह सरणी में कॉपी करने की आवश्यकता होगी, हालांकि, जो खुद pygame.com पर वास्तविक ग्राफिक्स संचालन करने की तुलना में बहुत धीमा होगा।


3

उदाहरण के साथ संख्यात्मक सरणी में संग्रहीत चित्र दिखाने के लिए (जुपिटर नोटबुक में काम करता है)

मुझे पता है कि सरल उत्तर हैं, लेकिन यह आपको यह समझने में मदद करेगा कि चित्र वास्तव में कैसे सुन्न सरणी से डूब जाते हैं।

लोड उदाहरण

from sklearn.datasets import load_digits
digits = load_digits()
digits.images.shape   #this will give you (1797, 8, 8). 1797 images, each 8 x 8 in size

एक छवि का प्रदर्शन सरणी

digits.images[0]
array([[ 0.,  0.,  5., 13.,  9.,  1.,  0.,  0.],
       [ 0.,  0., 13., 15., 10., 15.,  5.,  0.],
       [ 0.,  3., 15.,  2.,  0., 11.,  8.,  0.],
       [ 0.,  4., 12.,  0.,  0.,  8.,  8.,  0.],
       [ 0.,  5.,  8.,  0.,  0.,  9.,  8.,  0.],
       [ 0.,  4., 11.,  0.,  1., 12.,  7.,  0.],
       [ 0.,  2., 14.,  5., 10., 12.,  0.,  0.],
       [ 0.,  0.,  6., 13., 10.,  0.,  0.,  0.]])

100 छवियों को देखने के लिए खाली 10 x 10 सबप्लॉट बनाएं

import matplotlib.pyplot as plt
fig, axes = plt.subplots(10,10, figsize=(8,8))

100 छवियों को प्लॉट करना

for i,ax in enumerate(axes.flat):
    ax.imshow(digits.images[i])

परिणाम:

यहां छवि विवरण दर्ज करें

क्या करता axes.flatहै? यह सुन्न एन्युमरेटर बनाता है ताकि आप उन पर वस्तुओं को खींचने के लिए अक्ष पर पुनरावृति कर सकें। उदाहरण:

import numpy as np
x = np.arange(6).reshape(2,3)
x.flat
for item in (x.flat):
    print (item, end=' ')

2

उदाहरण के लिए, तकिया के विवर का उपयोग करना:

from PIL import Image
from numpy import *

im = array(Image.open('image.jpg'))
Image.fromarray(im).show()

1

अजगर इमेजिंग लाइब्रेरी को NumPy सरणी का उपयोग कर छवियों को प्रदर्शित कर सकते हैं। नमूना कोड के लिए इस पृष्ठ पर एक नज़र डालें:

संपादित करें: जैसा कि उस पृष्ठ के निचले भाग पर स्थित नोट कहता है, आपको नवीनतम रिलीज़ नोटों की जाँच करनी चाहिए जो इसे बहुत सरल बनाते हैं:

http://effbot.org/zone/pil-changes-116.htm


इस सवाल का जवाब नहीं है
जॉन ktejik

0

Matplotlib के साथ ऐसा करने के लिए अनुपूरक। मैंने पाया कि यह कंप्यूटर विज़न कार्यों को करने में आसान है। मान लीजिए कि आपको dtype = int32 के साथ डेटा मिला है

from matplotlib import pyplot as plot
import numpy as np

fig = plot.figure()
ax = fig.add_subplot(1, 1, 1)
# make sure your data is in H W C, otherwise you can change it by
# data = data.transpose((_, _, _))
data = np.zeros((512,512,3), dtype=np.int32)
data[256,256] = [255,0,0]
ax.imshow(data.astype(np.uint8))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.