2013-02-08 10 views
5

Kann mir jemand helfen, wie man die RGB-Pixeldaten von einem Bild in R bekommt?Wie bekomme ich Pixeldaten von einem Bild mit R

Ich brauche diese Informationen, um Unterschiede im Vogelgefieder zu vergleichen, um das Verständnis eines Artbildungsereignisses zu erleichtern.

Meine Fotos werden von einer Digitalkamera aufgenommen und sind jetzt als NEF-Datei. Es spielt keine Rolle, welche Art von Datei benötigt wird, ich habe die Möglichkeit, die Datei nach Belieben zu konvertieren. Ich würde es jedoch vorziehen, so viele Informationen wie möglich in der Datei zu halten (z. B. PNG-Dateien sind gut).

Ich habe viele Pakete in R: Pixmap, Raster, ImageMetrics ausprobiert und das Internet durchgesehen, Methoden getestet, Co-Studenten etc. mehrere Wochen lang versucht, dieses Problem zu lösen. Hier bei Stackoverflow habe ich das versucht: How to extract the pixel data Use R's pixmap package?, ohne Glück. Meine Dateien sind auch zu groß für das R-Fenster (das gesamte Array wird nicht angezeigt), und ich habe Schwierigkeiten, das erzeugte Array zu verstehen. Das Beste für mich wäre, die Daten als Matrix oder auf eine andere Weise zu erhalten, die es einfacher macht zu verstehen, was was ist. Ich habe viele ähnliche Fragen gefunden, aber in anderen Programmen (wie Java, C++, IOS, Matlab, Python usw.), die ich leider nicht benutzen kann.

Meine Probleme könnten aufgrund meiner geringen Fähigkeiten mit dieser Art von Arbeit, aber ich versuche so hart wie ich kann mit dem Hintergrund, den ich habe. Wenn mir jemand helfen oder mir ein paar Tipps geben kann, bin ich sehr dankbar.

+2

Was meinst du mit "kein Glück"? Kohske hat eine sehr gute Antwort auf Ihre [vorherige Frage] gegeben (http://stackoverflow.com/questions/6085090/how-to-extract-the-pixel-data-user-rs-pixmap-package). Sei genauer. Haben Sie versucht, seine Lösung anzupassen? Warum funktioniert es nicht? – Andrie

+0

Sie werden wahrscheinlich viel glücklicher mit ImageJ (oder sogar GraphicConverter, wenn Sie Zugriff auf OS X haben). Unter der Annahme, dass die Vogelfedern nur einen Teil des Bildes bedecken, extrahieren Sie Array-Teilmengen, um die Größe der Daten zu minimieren, mit denen Sie gerade mucksen. –

+0

@Andrie, es tut mir leid, dass ich nicht gesehen habe, wie Sie in meiner Bearbeitung sehen können, ich habe missverstanden, was ich tat. Wenn Sie jedoch interessiert sind, habe ich diese Fehlermeldung versucht, Bill_080 zu testen Antwort: Bild @ Größe "Fehler: versuchen, Slot" Größe "von einem Objekt einer Basisklasse (" Array ") ohne Schlitze" – MariaBioStudent

Antwort

7

Zuerst habe ich erzeugen ein Beispiel png Bild:

png("/tmp/test.png") 
plot(rnorm(100)) 
dev.off() 

Dann konvertiere ich es zu einem lesbaren Format pixmap: hier habe ich die png zu einer ppm-Datei zu konvertieren, wie ich Farben Informationen behalten wollen. Ich benutze ImageMagick von der Kommandozeile, aber Sie können verwenden, was Programm Sie wollen:

$ convert /tmp/test.png /tmp/test.ppm 

Als nächst Sie das Bild mit der read.pnm Funktion aus dem pixmap Paket lesen können:

x <- read.pnm("/tmp/test.ppm") 

Und dann, Sie können die Steckplätze [email protected], [email protected], [email protected] (oder [email protected] für ein Graustufenbild) verwenden, um den Pixelwert für jeden Kanal als Matrix zu erhalten. Sie können überprüfen, dass die Dimensionen der Matrizen die gleiche wie die Größe des Bildes sind:

dim([email protected]) 
[1] 480 480 
+0

Danke, jetzt weiß ich sicher, dass ich auf dem richtigen Weg bin! :) – MariaBioStudent

+0

Wenn dies Ihre Frage gelöst hat, können Sie die grüne Markierung überprüfen, um sie anderen Benutzern anzuzeigen. – juba

1

Nehmen Sie dieses kleine Bild png 3x3 Pixel Beispiel:

sample image

Dann:

library('png') 
download.file('http://i.stack.imgur.com/hakvE.png', 'sample.png') 
img <- readPNG('sample.png') 
pix.top.left <- img[1,1,]  # row 1, column 1 
pix.bottom.left <- img[3,1,] # row 3, column 1 
pix.top.right <- img[1,3,] # row 1, column 3 

Wenn Sie ein PNG-Bild mit Alphakanal lesen (wie das obige Beispielbild), dann ist jede der pix. Variablen ein Vektor mit vier Einträgen Jeder Eintrag entspricht den Rot-, Grün-, Blau- und Alpha-Werten des Pixels.

> pix.top.left 
[1] 1 0 0 1