2012-11-25 25 views
11

मेरे पास एक .jpg छवि है जिसे मैं पाइथन सरणी में परिवर्तित करना चाहता हूं, क्योंकि मैंने सादे पायथन एरे को संभालने वाले उपचार दिनचर्या लागू की हैं।पीआईएल छवि सरणी (सरणी के लिए numpy सरणी) - पायथन

ऐसा नहीं है कि जनहित याचिका छवियों समर्थन रूपांतरण सरणी Numpy रहा है, और प्रलेखन के अनुसार मैं इस में लिखा है:

from PIL import Image 
im = Image.open("D:\Prototype\Bikesgray.jpg") 
im.show() 

print(list(np.asarray(im))) 

यह NumPy सरणी की एक सूची लौटा रहा है। इसके अलावा, मैंने

list([list(x) for x in np.asarray(im)]) 

के साथ प्रयास किया जो विफल होने के बाद से कुछ भी वापस नहीं कर रहा है।

मैं पीआईएल से सरणी में कैसे परिवर्तित कर सकता हूं, या बस numpy array से Python array में कैसे परिवर्तित कर सकता हूं?

+2

आप की कोशिश की numpy सरणी के' tolist() 'विधि है? – joeln

उत्तर

11

मुझे लगता है कि आप के लिए देख रहे हैं:

list(im.getdata()) 

या, यदि छवि स्मृति में पूरी तरह से लोड करने के लिए बहुत बड़ा है, तो यह है कि जैसे कुछ:

for pixel in iter(im.getdata()): 
    print pixel 

PIL documentation से:

गेटडाटा

im.getdata() => अनुक्रम

एक छवि की सामग्री को अनुक्रम ऑब्जेक्ट के रूप में देता है जिसमें पिक्सेल मान होते हैं। अनुक्रम ऑब्जेक्ट फ़्लैट किया गया है, ताकि लाइन 0 के लिए मान लाइन शून्य के मानों के बाद सीधे अनुसरण करें, और इसी तरह।

ध्यान दें कि इस विधि द्वारा अनुक्रमित अनुक्रम वस्तु एक आंतरिक पीआईएल डेटा प्रकार है, जो केवल कुछ अनुक्रम संचालन का समर्थन करता है, पुनरावृत्ति और मूल अनुक्रम पहुंच सहित। इसे सामान्य अनुक्रम (उदाहरण के लिए प्रिंटिंग के लिए) में परिवर्तित करने के लिए, सूची (im.getdata()) का उपयोग करें।

+0

डॉक्टर में अच्छा लग रहा है लेकिन अभी भी काम नहीं कर रहा है। मुझे प्रक्रिया को रोकना पड़ा। कोई उपाय?धन्यवाद – octoback

+0

पहले एक छोटी छवि के साथ प्रयास करें, यह देखने के लिए कि आपको वांछित परिणाम मिल रहे हैं, फिर आप पूरी छवि को किसी सूची में लोड करने और इसे प्रिंट करने की कोशिश कर स्मृति समस्याओं को संभाल सकते हैं। – zenpoy

+0

मैं इन स्मृति समस्याओं का प्रबंधन कैसे कर सकता हूं? – octoback

4

zenpoys के आधार पर उत्तर दें:

import Image 
import numpy 

def image2pixelarray(filepath): 
    """ 
    Parameters 
    ---------- 
    filepath : str 
     Path to an image file 

    Returns 
    ------- 
    list 
     A list of lists which make it simple to access the greyscale value by 
     im[y][x] 
    """ 
    im = Image.open(filepath).convert('L') 
    (width, height) = im.size 
    greyscale_map = list(im.getdata()) 
    greyscale_map = numpy.array(greyscale_map) 
    greyscale_map = greyscale_map.reshape((height, width)) 
    return greyscale_map 
2

मैं numpy.fromiter का उपयोग एक 8 ग्रेस्केल बिटमैप को उलटने के लिए, फिर भी दुष्प्रभाव के कोई संकेत नहीं

import Image 
import numpy as np 

im = Image.load('foo.jpg') 
im = im.convert('L') 

arr = np.fromiter(iter(im.getdata()), np.uint8) 
arr.resize(im.height, im.width) 

arr ^= 0xFF # invert 
inverted_im = Image.fromarray(arr, mode='L') 
inverted_im.show() 
11

मैं अत्यधिक तुम का उपयोग करें tobytesImage ऑब्जेक्ट का फ़ंक्शन। कुछ समय जांच के बाद यह अधिक कुशल है।

def jpg_image_to_array(image_path): 
    """ 
    Loads JPEG image into 3D Numpy array of shape 
    (width, height, channels) 
    """ 
    with Image.open(image_path) as image:   
    im_arr = np.fromstring(image.tobytes(), dtype=np.uint8) 
    im_arr = im_arr.reshape((image.size[1], image.size[0], 3))         
    return im_arr 

समय मैं अपने लैपटॉप शो पर भाग गया

In [76]: %timeit np.fromstring(im.tobytes(), dtype=np.uint8) 
1000 loops, best of 3: 230 µs per loop 

In [77]: %timeit np.array(im.getdata(), dtype=np.uint8) 
10 loops, best of 3: 114 ms per loop 

`` `

संबंधित मुद्दे