पायथन में दिए गए पिक्सेल का RGB मान कैसे पढ़ें?


140

अगर मैं एक छवि के साथ खोलता open("image.jpg")हूं, तो मुझे लगता है कि मेरे पास पिक्सेल के निर्देशांक हैं एक पिक्सेल के आरजीबी मान कैसे प्राप्त कर सकते हैं?

फिर, मैं इसके विपरीत कैसे कर सकता हूं? एक रिक्त ग्राफ़िक के साथ शुरू, एक निश्चित RGB मान के साथ एक पिक्सेल 'लिखना'?

अगर मुझे कोई अतिरिक्त लाइब्रेरी डाउनलोड नहीं करनी है तो मैं पसंद करूंगा।

जवाबों:


213

शायद ऐसा करने के लिए पायथन इमेज लाइब्रेरी का उपयोग करना सबसे अच्छा है जो मुझे डर है कि यह एक अलग डाउनलोड है।

छवि ऑब्जेक्ट पर लोड () विधि के माध्यम से जो आप चाहते हैं वह करने का सबसे आसान तरीका है जो एक पिक्सेल एक्सेस ऑब्जेक्ट देता है जिसे आप किसी सरणी की तरह हेरफेर कर सकते हैं:

from PIL import Image

im = Image.open('dead_parrot.jpg') # Can be many different formats.
pix = im.load()
print im.size  # Get the width and hight of the image for iterating over
print pix[x,y]  # Get the RGBA Value of the a pixel of an image
pix[x,y] = value  # Set the RGBA Value of the image (tuple)
im.save('alive_parrot.png')  # Save the modified pixels as .png

वैकल्पिक रूप से, इमेजड्रॉ को देखें जो छवियों को बनाने के लिए बहुत समृद्ध एपीआई देता है।


1
सौभाग्य से पीआईएल को स्थापित करना लिनक्स और विंडोज में बहुत सीधा है (मैक के बारे में नहीं जानते)
हेल्टनबीकर

6
@ArturSapek, मैंने पीआईएल स्थापित किया pipजिसके द्वारा काफी आसान था।
मिचेलियु

1
मैंने अपने मैक (Pypi) पर इसका इस्तेमाल किया:easy_install --find-links http://www.pythonware.com/products/pil/ Imaging
Mazyod

15
भविष्य के पाठकों के लिए: pip install pillowपीआईएल को सफलतापूर्वक और काफी जल्दी स्थापित करेगा (आवश्यकता हो सकती है sudoयदि वर्चुअन में नहीं)।
क्रिस्टोफर Shroba

window.readthedocs.io/en/latest/… विंडोज़ इंस्टॉलेशन चरणों में बैश कमांड दिखाता है। वास्तव में सुनिश्चित नहीं है कि आगे कैसे बढ़ना है।
Musixauce3000

31

तकिया का उपयोग करना (जो कि पायथन 3. एक्स के साथ-साथ पायथन 2.7+ के साथ काम करता है), आप निम्न कार्य कर सकते हैं:

from PIL import Image
im = Image.open('image.jpg', 'r')
width, height = im.size
pixel_values = list(im.getdata())

अब आपके पास सभी पिक्सेल मान हैं। यदि यह RGB है या किसी अन्य मोड द्वारा पढ़ा जा सकता है im.mode। तब आप पिक्सेल प्राप्त कर सकते हैं (x, y):

pixel_values[width*y+x]

वैकल्पिक रूप से, आप Numpy का उपयोग कर सकते हैं और सरणी को फिर से खोल सकते हैं:

>>> pixel_values = numpy.array(pixel_values).reshape((width, height, 3))
>>> x, y = 0, 1
>>> pixel_values[x][y]
[ 18  18  12]

समाधान का उपयोग करने के लिए एक पूर्ण, सरल है

# Third party modules
import numpy
from PIL import Image


def get_image(image_path):
    """Get a numpy array of an image so that one can access values[x][y]."""
    image = Image.open(image_path, "r")
    width, height = image.size
    pixel_values = list(image.getdata())
    if image.mode == "RGB":
        channels = 3
    elif image.mode == "L":
        channels = 1
    else:
        print("Unknown mode: %s" % image.mode)
        return None
    pixel_values = numpy.array(pixel_values).reshape((width, height, channels))
    return pixel_values


image = get_image("gradient.png")

print(image[0])
print(image.shape)

कोड का परीक्षण धुआँ

आप चौड़ाई / ऊँचाई / चैनल के क्रम के बारे में अनिश्चित हो सकते हैं। इस कारण से मैंने यह ग्रेडिएंट बनाया है:

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

छवि की चौड़ाई 100px और ऊंचाई 26px है। इसका रंग ढाल #ffaa00(पीला) से #ffffff(सफ़ेद) होता है। आउटपुट है:

[[255 172   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 171   5]
 [255 171   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 171   5]
 [255 172   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 172   5]
 [255 172   5]
 [255 171   5]
 [255 171   5]
 [255 172   4]
 [255 172   5]
 [255 171   5]
 [255 171   5]
 [255 172   5]]
(100, 26, 3)

ध्यान देने योग्य बातें:

  • आकार है (चौड़ाई, ऊंचाई, चैनल)
  • image[0], इसलिए पहली पंक्ति, एक ही रंग के 26 ट्रिपल है

पिल्ले macosx पर अजगर 2.7 का समर्थन करता है, जबकि मुझे केवल पीआईएल पर अजगर 2.5 समर्थन मिलता है। धन्यवाद!
कंगारू

2
सावधान रहें, careful रिशेप ’परम्स की सूची (ऊंचाई, चौड़ाई, चैनल) होनी चाहिए। और rgba छवियों के लिए आप चैनलों के साथ image.mode = RGBA को शामिल कर सकते हैं = 4
gmarsi

क्या चौड़ाई और ऊंचाई पर @gmarsi की बात सही है? क्या वास्तव में यह मामला है कि दोनों वैध हैं? आपको इस बात से अवगत होना चाहिए कि डेटा कैसे आउटपुट होता है इसलिए आप जानते हैं कि आउटपुट सरणी का आकार क्या होगा और छवि की पंक्ति और स्तंभ पिक्सेल डेटा कहाँ होगा।
Kioshiki

@Kioshiki मैंने अपने उत्तर में एक "स्मोक टेस्टिंग" खंड जोड़ा है, इसलिए यह बताना आसान है।
मार्टिन थोमा

24

PyPNG - हल्के पीएनजी विकोडक / एनकोडर

यद्यपि प्रश्न JPG पर संकेत देता है, मुझे आशा है कि मेरा उत्तर कुछ लोगों के लिए उपयोगी होगा।

यहाँ PyPNG मॉड्यूल का उपयोग करके PNG पिक्सेल पढ़ना और लिखना सीखना है :

import png, array

point = (2, 10) # coordinates of pixel to be painted red

reader = png.Reader(filename='image.png')
w, h, pixels, metadata = reader.read_flat()
pixel_byte_width = 4 if metadata['alpha'] else 3
pixel_position = point[0] + point[1] * w
new_pixel_value = (255, 0, 0, 0) if metadata['alpha'] else (255, 0, 0)
pixels[
  pixel_position * pixel_byte_width :
  (pixel_position + 1) * pixel_byte_width] = array.array('B', new_pixel_value)

output = open('image-with-red-dot.png', 'wb')
writer = png.Writer(w, h, **metadata)
writer.write_array(output, pixels)
output.close()

PyPNG एक एकल शुद्ध पायथन मॉड्यूल है जो परीक्षण और टिप्पणियों सहित 4000 लाइनों से कम लंबा है।

पीआईएल एक अधिक व्यापक इमेजिंग पुस्तकालय है, लेकिन यह भी काफी भारी है।


12

जैसा कि डेव वेब ने कहा:

यहाँ एक चित्र से पिक्सेल रंगों को प्रिंट करने का मेरा कार्य कोड स्निपेट है:

import os, sys
import Image

im = Image.open("image.jpg")
x = 3
y = 4

pix = im.load()
print pix[x,y]

6
photo = Image.open('IN.jpg') #your image
photo = photo.convert('RGB')

width = photo.size[0] #define W and H
height = photo.size[1]

for y in range(0, height): #each pixel has coordinates
    row = ""
    for x in range(0, width):

        RGB = photo.getpixel((x,y))
        R,G,B = RGB  #now you can use the RGB value

3

छवि हेरफेर एक जटिल विषय है, और यदि आप लाइब्रेरी का उपयोग करते हैं तो यह सबसे अच्छा है । मैं gdmodule की सिफारिश कर सकता हूं जो पायथन के भीतर से कई अलग-अलग छवि प्रारूपों के लिए आसान पहुंच प्रदान करता है।


किसी को पता है कि यह नीचा क्यों था? Libgd या कुछ और के साथ एक ज्ञात समस्या है? (मैंने इसे कभी नहीं देखा था, लेकिन यह जानने के लिए हमेशा अच्छा है कि पीआईएल का एक विकल्प है)
पीटर हैनली

3

वहाँ wiki.wxpython.org पर एक बहुत अच्छी लेख के हकदार है चित्रों के साथ काम । लेख में wxWidgets (wxImage), PIL या PythonMagick का उपयोग करने की व्याप्ति का उल्लेख है। व्यक्तिगत रूप से, मैंने PIL और wxWidgets का उपयोग किया है और दोनों छवि हेरफेर को काफी आसान बनाते हैं।


3

आप pygame के सर्फरे मॉड्यूल का उपयोग कर सकते हैं । इस मॉड्यूल में एक 3 डी पिक्सेल ऐरर रिटर्निंग विधि है जिसे पिक्स 3 डी (सतह) कहा जाता है। मैंने नीचे उपयोग दिखाया है:

from pygame import surfarray, image, display
import pygame
import numpy #important to import

pygame.init()
image = image.load("myimagefile.jpg") #surface to render
resolution = (image.get_width(),image.get_height())
screen = display.set_mode(resolution) #create space for display
screen.blit(image, (0,0)) #superpose image on screen
display.flip()
surfarray.use_arraytype("numpy") #important!
screenpix = surfarray.pixels3d(image) #pixels in 3d array:
#[x][y][rgb]
for y in range(resolution[1]):
    for x in range(resolution[0]):
        for color in range(3):
            screenpix[x][y][color] += 128
            #reverting colors
screen.blit(surfarray.make_surface(screenpix), (0,0)) #superpose on screen
display.flip() #update display
while 1:
    print finished

मुझे आशा है कि मददगार थे। अंतिम शब्द: पटकथा आजीवन के लिए स्क्रीन लॉक है।


2

"sudo apt-get install python-इमेजिंग" कमांड का उपयोग करके पीआईएल स्थापित करें और निम्नलिखित प्रोग्राम चलाएं। यह छवि के RGB मानों को प्रिंट करेगा। यदि छवि बड़ी है, तो '>' का उपयोग करके फ़ाइल में आउटपुट को पुनर्निर्देशित करें बाद में RGB मान देखने के लिए फ़ाइल खोलें

import PIL
import Image
FILENAME='fn.gif' #image can be in gif jpeg or png format 
im=Image.open(FILENAME).convert('RGB')
pix=im.load()
w=im.size[0]
h=im.size[1]
for i in range(w):
  for j in range(h):
    print pix[i,j]

2

आप Tkinter मॉड्यूल का उपयोग कर सकते हैं, जो Tk GUI टूलकिट के लिए मानक पायथन इंटरफ़ेस है और आपको अतिरिक्त डाउनलोड की आवश्यकता नहीं है। Https://docs.python.org/2/library/tkinter.html देखें ।

(पायथन 3 के लिए, टिंकर का नाम बदलकर टिंकर कर दिया गया है)

यहाँ आरजीबी मान कैसे सेट करें:

#from http://tkinter.unpythonic.net/wiki/PhotoImage
from Tkinter import *

root = Tk()

def pixel(image, pos, color):
    """Place pixel at pos=(x,y) on image, with color=(r,g,b)."""
    r,g,b = color
    x,y = pos
    image.put("#%02x%02x%02x" % (r,g,b), (y, x))

photo = PhotoImage(width=32, height=32)

pixel(photo, (16,16), (255,0,0))  # One lone pixel in the middle...

label = Label(root, image=photo)
label.grid()
root.mainloop()

और RGB प्राप्त करें:

#from http://www.kosbie.net/cmu/spring-14/15-112/handouts/steganographyEncoder.py
def getRGB(image, x, y):
    value = image.get(x, y)
    return tuple(map(int, value.split(" ")))

2
from PIL import Image
def rgb_of_pixel(img_path, x, y):
    im = Image.open(img_path).convert('RGB')
    r, g, b = im.getpixel((x, y))
    a = (r, g, b)
    return a

1
हालांकि यह कोड स्निपेट समाधान हो सकता है, जिसमें स्पष्टीकरण भी शामिल है , जो आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
नरेंद्र जाधव

1
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

img=mpimg.imread('Cricket_ACT_official_logo.png')
imgplot = plt.imshow(img)

1

यदि आप RGB रंग कोड के रूप में तीन अंक होना चाह रहे हैं, तो निम्न कोड को बस यही करना चाहिए।

i = Image.open(path)
pixels = i.load() # this is not a list, nor is it list()'able
width, height = i.size

all_pixels = []
for x in range(width):
    for y in range(height):
        cpixel = pixels[x, y]
        all_pixels.append(cpixel)

यह आपके काम आ सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.