it-swarm.com.de

python - RGB-Matrix eines Bildes

Wenn ich ein Bild als Eingabe nehme, wie bekomme ich die dazugehörige rgb-Matrix? Ich habe die numpy.asarray-Funktion ausgecheckt. Gibt es mir die rgb-Matrix oder eine andere Matrix? 

12
Ojas

Beachten Sie, dass diese Antwort seit 2018 veraltet ist. scipy hat imread abgelehnt, und Sie sollten zu imageio.imread wechseln. Siehe dieses Übergangsdokument über Unterschiede zwischen den beiden. Der folgende Code sollte ohne Änderungen funktionieren, wenn Sie einfach die neue Bibliothek anstelle der alten importieren, aber ich habe sie nicht getestet.


Die einfachste Antwort ist die Verwendung der NumPy- und SciPy-Wrapper für PIL. Es gibt ein tolles Tutorial , aber die Grundidee ist:

from scipy import misc
arr = misc.imread('lena.png') # 640x480x3 array
arr[20, 30] # 3-vector for a pixel
arr[20, 30, 1] # green value for a pixel

Für ein 640x480 RGB-Bild erhalten Sie ein 640x480x3-Array mit uint8.

Oder Sie können die Datei einfach mit PIL (oder vielmehr mit Pillow öffnen; wenn Sie PIL noch verwenden, funktioniert dies möglicherweise nicht oder sehr langsam) und übergeben Sie es direkt an NumPy:

import numpy as np
from PIL import Image
img = Image.open('lena.png')
arr = np.array(img) # 640x480x4 array
arr[20, 30] # 4-vector, just like above

Dadurch erhalten Sie ein 640x480x4-Array vom Typ uint8 (das vierte ist alpha; PIL lädt PNG-Dateien immer als RGBA, auch wenn sie keine Transparenz haben; siehe img.getbands(), wenn Sie unsicher sind).

Wenn Sie NumPy überhaupt nicht verwenden möchten, ist der PixelArray-Typ von PIL ein eher eingeschränktes Array:

arr = img.load()
arr[20, 30] # Tuple of 4 ints

Damit erhalten Sie ein 640x480 PixelAccess-Array von RGBA-4-Tupeln.

Oder Sie rufen einfach getpixel im Bild auf:

img.getpixel(20, 30) # Tuple of 4 ints
13
abarnert

Ich habe das Gefühl, dass ich nicht genau das mache, was Sie hier wollten, also geben Sie bitte an, ob dies völlig aus ist. Sie können das Bild wie folgt öffnen und ein Pixel-Array erhalten:

import Image
im = Image.open('Lenna.png')
pixels = list(im.getdata())

Dadurch erhalten Sie eine einfache Liste von RGB-Daten, die aussehen

[(226, 137, 125), (226, 137, 125), (223, 137, 133), (223, 136, 128), 
 (226, 138, 120), (226, 129, 116), (228, 138, 123), (227, 134, 124), 
 (227, 140, 127), (225, 136, 119), (228, 135, 126), (225, 134, 121),...

Dies sind nun alle Pixel in einem flachen Array. Wenn Sie ein zweidimensionales Array wünschen, ist dazu zusätzlicher Code erforderlich. Nicht sicher, ob es in PIL eine direkte Funktion dafür gibt.

9
Bemmu

Auch hinzuzufügen, wenn Sie oder jemand anderes opencv verwendet. 

 imgc=cv2.imread(file)

oder als Graustufen einlesen

 imgc=cv2.imread(file,0)

Wenn Sie einen Vergleich zwischen den Bildern durchführen, sollten Sie sich überlegen, das Pixel-Array in Histogramme zu konvertieren, um die Daten zu normalisieren. 

   hist = np.histogram(img.flatten(),256,[0,256])[0]

Die obige Linie glättet zunächst Ihr img-Array, so dass Sie die Dimensionalität Ihres Bildes verlieren. Dann werden Bins von 0 bis 256 (für das Graustufenbild) erzeugt, und die Zählungen aus dem Bild werden zu diesen Bins hinzugefügt und als Hist zurückgegeben, der dann aufgezeichnet werden kann. Wenn das 100-Bin-Feld beispielsweise einen Wert von 20 hat, bedeutet dies, dass 20 Pixel in Ihrem Bild einen Wert von 100 hatten.

Ich hoffe, dies fügt eine weitere Möglichkeit hinzu, über jemanden nachzudenken, der mit opencv beginnen möchte.

1
mike

Ich habe imageio.imread ausprobiert, und es hat großartig funktioniert, aber eine Minute später stolperte ich über eine Funktion in matplotlib, die genau gleich funktionierte und ein numpy n mal m 3 Array erhielt:

from matplotlib import pyplot as plot
image = plt.imread(path)
0
Denziloe

Danke abarenet! Bitte verwenden Sie imageio anstelle von scipy, da scipy nicht mehr fortgesetzt wird. Die Antwort von abarnet vereinfachen:

  1. Installieren Sie imageio

    pip3 install imageto

  2. python3-Code:

    Wenn das Bild Dimensionen hat 260X340, Dann ist rgb_matrix ein Array von Dimensionen 260X340X3

    from imageio import imread rgb_matrix = imread('image13.png') print(rgb_matrix[15][23])

0
Prabhat Soni

Sie können dies mit Pillow tun. Die getdata -Methode liefert Ihnen ein flaches Array der Pixel. Sie können dann eine Matrix daraus erstellen, indem Sie das size des Bildes verwenden.

from PIL import Image

def getPixels(filename):
    img = Image.open(filename, 'r')
    w, h = img.size
    pix = list(img.getdata())
    return [pix[n:n+w] for n in range(0, w*h, w)]
0
TitouanT