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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top