PIL का उपयोग करके पिक्सेल का RGB प्राप्त करें


93

क्या पीआईएल का उपयोग करके पिक्सेल का आरजीबी रंग प्राप्त करना संभव है? मैं इस कोड का उपयोग कर रहा हूं:

im = Image.open("image.gif")
pix = im.load()
print(pix[1,1])

हालांकि, यह केवल एक संख्या (उदाहरण के लिए ) 0या 1तीन नंबर (जैसे 60,60,60आर, जी, बी) के लिए आउटपुट देता है । मुझे लगता है कि मैं फ़ंक्शन के बारे में कुछ नहीं समझ रहा हूं। मुझे कुछ स्पष्टीकरण पसंद आएगा।

बहुत बहुत धन्यवाद।

जवाबों:


147

हां, इस तरह से:

im = Image.open('image.gif')
rgb_im = im.convert('RGB')
r, g, b = rgb_im.getpixel((1, 1))

print(r, g, b)
(65, 100, 137)

इसका कारण आपको पहले एक मान मिल रहा था pix[1, 1]क्योंकि GIF पिक्सेल GIF रंग पैलेट में 256 मानों में से एक को संदर्भित करता है।

इस SO पोस्ट को भी देखें: GIF और JPEG के लिए पायथन और PIL पिक्सेल मान भिन्न हैं और इस PIL संदर्भ पृष्ठ में convert()फ़ंक्शन की अधिक जानकारी है ।

वैसे, आपका कोड .jpgछवियों के लिए ठीक काम करेगा ।


1
क्या यह कंप्यूटर स्क्रीन के लिए किया जा सकता है, न कि केवल एक छवि फ़ाइल के लिए?
18ix पर Musixauce3000

1
Image.getpixel () 0-आधारित या 1-आधारित है? मेरा मतलब है, ऊपरी-बाएं-सबसे पिक्सेल (0,0) है या यह (1, 1) है?

2
@NimaBavari यह 0-आधारित है।
नोलन

3

जीआईएफ रंगों को एक पैलेट में संभावित रंगों की संख्या में से एक के रूप में संग्रहीत करता है। जीआईएफ सीमित रंग पैलेट के बारे में पढ़ें । इसलिए पीआईएल आपको पैलेट इंडेक्स दे रहा है, न कि उस पैलेट के कलर की जानकारी।

संपादित करें: एक ब्लॉग पोस्ट समाधान के लिए हटाए गए लिंक जिसमें एक टाइपो था। अन्य उत्तर टाइपो के बिना एक ही काम करते हैं।


2

छवि को परिवर्तित करने का एक विकल्प पैलेट से एक आरजीबी सूचकांक बनाना है।

from PIL import Image

def chunk(seq, size, groupByList=True):
    """Returns list of lists/tuples broken up by size input"""
    func = tuple
    if groupByList:
        func = list
    return [func(seq[i:i + size]) for i in range(0, len(seq), size)]


def getPaletteInRgb(img):
    """
    Returns list of RGB tuples found in the image palette
    :type img: Image.Image
    :rtype: list[tuple]
    """
    assert img.mode == 'P', "image should be palette mode"
    pal = img.getpalette()
    colors = chunk(pal, 3, False)
    return colors

# Usage
im = Image.open("image.gif")
pal = getPalletteInRgb(im)

2

पीआईएल नहीं, लेकिन imageio.imreadफिर भी दिलचस्प हो सकता है:

import imageio
im = scipy.misc.imread('um_000000.png', flatten=False, mode='RGB')
im = imageio.imread('Figure_1.png', pilmode='RGB')
print(im.shape)

देता है

(480, 640, 3)

तो यह है (ऊंचाई, चौड़ाई, चैनल)। तो स्थिति में पिक्सेल (x, y)है

color = tuple(im[y][x])
r, g, b = color

रगड़ा हुआ

scipy.misc.imreadहै 1.0.0 SciPy में पदावनत (अनुस्मारक के लिए धन्यवाद, fbahr !)


PSA: scipy.misc.imreadपदावनत है! imreadSciPy 1.0.0 में पदावनत किया गया है, और 1.2.0 में हटा दिया जाएगा। imageio.imreadइसके बजाय उपयोग करें ।
fbahr

1
अनुस्मारक के लिए धन्यवाद, fbahr! (मैं वास्तव में इसे अपदस्थ करने में शामिल था - github.com/scipy/scipy/issues/6242 in )
मार्टिन थोमा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.