2008-09-26 12 views
89

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

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

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

उत्तर

142

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

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 

वैकल्पिक रूप से, ImageDraw जो बनाने के लिए एक अधिक बेहतर एपीआई देता है पर देखने के:

सबसे आसान तरीका है कि आप क्या चाहते हैं load() method on the Image object जो एक पिक्सेल पहुँच वस्तु जो आप एक सरणी की तरह फेरबदल कर सकते हैं देता है के माध्यम से है क्या करने के लिए इमेजिस।

+0

सौभाग्य से स्थापित करने जनहित याचिका – heltonbiker

+6

मैक पर जनहित याचिका स्थापित कर रहा है मुझे जिस तरह से भी लानत समय लगा लिनक्स और विंडोज (मैक के बारे में पता नहीं है) में बहुत सीधा है । –

+3

@ आर्टूरस्पेक, मैंने पीआईएल को 'पीआईपी' द्वारा स्थापित किया जो काफी आसान था। – michaelliu

2

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

+0

किसी को भी पता है क्यों यह downvoted किया गया था? क्या libgd या कुछ के साथ एक ज्ञात समस्या है? (मैं इसे पर कभी नहीं देखा था, लेकिन यह हमेशा वहाँ जनहित याचिका के लिए एक विकल्प है पता करने के लिए अच्छा है) –

3

wiki.wxpython.org पर Working With Images पर एक बहुत अच्छा लेख है। लेख में WxWidgets (WxImage), PIL या PythonMagick का उपयोग करने की संभावना का उल्लेख है। व्यक्तिगत रूप से, मैंने पीआईएल और wxwidgets का उपयोग किया है और दोनों छवि कुशलता काफी आसान बनाते हैं।

20

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

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

यहाँ PyPNG module का उपयोग कर पढ़ने और लिखने के लिए कैसे पीएनजी पिक्सल है:

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 लाइनों लंबे, परीक्षण और टिप्पणियाँ होती हैं है।

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

3

आप pygame के surfarray मॉड्यूल का उपयोग कर सकते हैं। इस मॉड्यूल में 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 

मैं उपयोगी है उम्मीद: मैं नीचे उपयोग दिखाया है। अंतिम शब्द: स्क्रीनपिक्स के जीवनकाल के लिए स्क्रीन लॉक है।

10

डेव वेब के रूप में कहा।

यहाँ मेरे कार्य कोड स्निपेट एक छवि से पिक्सेल रंग मुद्रण है:

import os, sys 
import Image 

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

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

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

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 मॉड्यूल है, जो टी जीयूआई टूलकिट और आप के लिए मानक अजगर इंटरफेस है इस्तेमाल कर सकते हैं देखने के लिए एक फाइल करने के लिए उत्पादन अनुप्रेषित अतिरिक्त डाउनलोड की आवश्यकता नहीं है। https://docs.python.org/2/library/tkinter.html देखें।

(अजगर 3 के लिए, Tkinter tkinter नाम दिया है)

यहाँ आरजीबी मूल्यों को निर्धारित करने के लिए कैसे है:

#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() 

और आरजीबी मिलती है:

#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(" "))) 
12

Pillow का उपयोग करना (जो काम करता है

: अजगर 3.X के साथ-साथ अजगर 2.7+) के साथ, आप निम्न कर सकते

अब आप सभी पिक्सेल मान हैं। यदि यह आरजीबी है या अन्य मोड 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] 

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

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 
+0

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

4
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 
0
है
import matplotlib.pyplot as plt 
import matplotlib.image as mpimg 

img=mpimg.imread('Cricket_ACT_official_logo.png') 
imgplot = plt.imshow(img) 
संबंधित मुद्दे