Wie der RGB-Wert eines gegebenen Pixel in Python lesen?
Frage
Wenn ich ein Bild mit open("image.jpg")
öffnen, wie kann ich den RGB-Wert eines Pixels erhalte unter der Annahme, ich habe die Koordinaten des Pixels?
Dann, wie kann ich tun das Gegenteil davon? Beginnend mit einem leeren Grafik, ‚write‘ ein Pixel mit einem bestimmten RGB-Wert?
Ich würde es vorziehen, wenn ich keine zusätzliche Bibliotheken herunterladen musste.
Lösung
Es ist wahrscheinlich am besten, den Python Bildbibliothek zu verwenden, um dies zu tun, die mich fürchten, ist ein separater Download.
Der einfachste Weg zu tun, was Sie wollen, ist über den load () -Methode auf dem Image-Objekt das gibt einen Pixelzugriff Objekt, das Sie wie ein Array manipulieren kann:
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
Alternativ sehen ImageDraw , die für die Erstellung von Bildern eine viel reichere API gibt.
Andere Tipps
PyPNG - leicht PNG-Decoder / Encoder
Auch wenn die Frage an JPG Hinweise, ich hoffe, meine Antwort auf einige Leute nützlich sein wird.
Hier ist, wie PNG Pixel mit PyPNG Modul lesen und schreiben:
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 ist ein einziges reines Python-Modul weniger als 4000 Zeilen lang, einschließlich Tests und Kommentare.
PIL ist eine umfassende Imaging-Bibliothek, aber es ist auch deutlich schwerer.
Mit Pillow (die mit Python 3.X sowie Python arbeitet 2.7+), Sie Gehen Sie wie folgt kann:
from PIL import Image
im = Image.open('image.jpg', 'r')
width, height = im.size
pixel_values = list(im.getdata())
Jetzt haben Sie alle Pixelwerte. Wenn es RGB oder ein anderer Modus ist, kann durch im.mode
gelesen werden. Dann können Sie Pixel (x, y)
erhalten durch:
pixel_values[width*y+x]
Alternativ können Sie Numpy verwenden und das Array neu zu gestalten:
>>> pixel_values = numpy.array(pixel_values).reshape((width, height, 3))
>>> x, y = 0, 1
>>> pixel_values[x][y]
[ 18 18 12]
Eine vollständige, einfach zu bedienende Lösung ist
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
Wie Dave Webb sagte:
Hier ist mein Arbeits Code-Schnipsel Drucke die Pixelfarben aus einem Bild:
import os, sys import Image im = Image.open("image.jpg") x = 3 y = 4 pix = im.load() print pix[x,y]
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
Es ist ein wirklich guter Artikel über wiki.wxpython.org berechtigt Arbeiten mit Bildern . Der Artikel erwähnt die Möglichkeit der Verwendung von WxWidgets (wxImage), PIL oder PythonMagick. Persönlich habe ich verwendet, PIL und wxWidgets und beide machen Bildmanipulation ziemlich einfach.
Sie können mit pygame 's surfarray-Modul. Dieses Modul hat einen 3D-Pixel-Array ein Verfahren zum Zurückkehren genannt pixels3d (Oberfläche). Ich habe Nutzung unten dargestellt:
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
Ich hoffe hilfreich gewesen. Letztes Wort:. Bildschirm wird auf Lebenszeit von screenpix gesperrt
Bildmanipulation ist ein komplexes Thema, und es ist am besten, wenn Sie Sie eine Bibliothek verwenden. Ich kann empfehlen gdmodule die einen einfachen Zugang zu vielen verschiedenen Bildformaten aus Python bietet.
installieren PIL den Befehl "sudo apt-get install python-imaging" und führen Sie das folgende Programm. Es wird die RGB-Wert des Bildes drucken. Wenn das Bild groß ist, um die Ausgabe in eine Datei umleiten mit ‚>‘ später die Datei öffnen, um die RGB-Werte finden Sie unter
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]
Sie könnten das Tkinter-Modul verwenden, die die Standard-Python-Schnittstelle zu dem Tk-GUI-Toolkit ist und Sie keine zusätzlichen Download benötigen. Siehe https://docs.python.org/2/library/tkinter.html.
(für Python 3 wird Tkinter zu tkinter umbenannt)
Hier ist, wie RGB-Werte setzen:
#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()
Und erhalten 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(" ")))
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img=mpimg.imread('Cricket_ACT_official_logo.png')
imgplot = plt.imshow(img)
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
Wenn Sie drei Ziffern in Form eines RGB-Farbcode zu haben, suchen, sollten Sie den folgenden Code genau das tun.
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)
Dies kann für Sie arbeiten.