2013-02-08 14 views
5

Qualcuno può aiutarmi su come ottenere i dati dei pixel RGB da un'immagine in R?Come ottenere i dati dei pixel da un'immagine utilizzando R

Ho bisogno di queste informazioni per confrontare le differenze nel piumaggio degli uccelli per aiutare nella comprensione di un evento di speciazione.

Le mie foto vengono scattate da una fotocamera digitale e ora sono come file NEF. Non importa quale tipo di file è necessario, ho la possibilità di convertire il file in qualunque cosa desideri. Tuttavia, preferirei mantenere quante più informazioni possibili nel file (cioè i file PNG sono buoni).

Ho provato molti pacchetti in R: Pixmap, Raster, ImageMetrics e navigato su Internet, metodi testati, co-studenti, ecc. Per diverse settimane cercando di risolvere questo problema. Qui a Stackoverflow ho provato questo: How to extract the pixel data Use R's pixmap package?, senza fortuna. Anche i miei file sono troppo grandi per la finestra R (l'intero array non viene visualizzato) e ho difficoltà a comprendere la matrice prodotta. La cosa migliore per me sarebbe quella di ottenere i dati come una matrice o in un altro modo che rende più facile capire cosa è cosa. Ho trovato un sacco di domande simili, ma in altri programmi (come Java, C++, IOS, Matlab, Python ecc.) Che sfortunatamente non so come usare.

I miei problemi potrebbero essere dovuti alle mie scarse abilità con questo tipo di lavoro, ma sto provando più che posso con lo sfondo che ho. Se qualcuno può aiutarmi o darmi qualche consiglio, sarò molto grato.

+2

Cosa intendi per "fortuna"? Kohske ha dato un'ottima risposta alla tua [domanda precedente] (http://stackoverflow.com/questions/6085090/how-to-extract-the-pixel-data-use-rs-pixmap-package). Sii più preciso. Hai provato ad adattare la sua soluzione? Perché non funziona? – Andrie

+0

Probabilmente sarai molto più felice usando ImageJ (o anche GraphicConverter se hai accesso a OS X). Nel frattempo, supponendo che i birdfeathers coprano solo parte dell'immagine, estrai i sottoinsiemi dell'array per minimizzare la dimensione dei dati con cui stai mescolando. –

+0

@Andrie, mi dispiace non averlo visto, come puoi vedere nella mia modifica, ho frainteso quello che stavo facendo. Tuttavia, se sei interessato, ho ricevuto questo messaggio di errore cercando di testare bill_080 answer: picture @ size "Errore: cercare di ottenere" dimensione "di slot da un oggetto di una classe base (" array ") senza slot" – MariaBioStudent

risposta

7

Per prima cosa generare un esempio png immagine:

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

Poi ho convertirlo in un formato leggibile da pixmap: qui converto il png in un file ppm come voglio mantenere le informazioni di colori. Io uso ImageMagick dalla riga di comando, ma è possibile utilizzare qualsiasi programma che si desidera:

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

Successivamente, è possibile leggere l'immagine con la funzione read.pnm dal pacchetto pixmap:

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

E poi, è possibile utilizzare gli slot [email protected], [email protected], [email protected] (o [email protected] per un'immagine in scala di grigi) per ottenere il valore dei pixel per ciascun canale come matrice. È possibile verificare che le dimensioni delle matrici sono le stesse come la dimensione della vostra immagine:

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

Grazie, ora so per certo che sono sulla strada giusta! :) – MariaBioStudent

+0

Se è stata risolta la tua domanda, puoi controllare il segno verde per indicarlo ad altri utenti. – juba

1

Prendete questa immagine piccolo campione di 3x3 pixel PNG:

sample image

Poi:

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 

Se stai leggendo un'immagine PNG con canale alfa (come l'immagine di esempio sopra), ciascuna delle variabili pix. è un vettore con quattro voci , ogni voce corrisponde ai valori di rosso, verde, blu e alfa del pixel.

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