2015-06-17 14 views
7

Ho un codice sotto il quale salva un'immagine sul mio pc. Vorrei ruotare l'immagine di 45,90 e 135 gradi attorno al centro (o nell'angolo in basso a sinistra) e quindi salvare come 3 immagini diverse. Come potrei farlo?Come ruotare un'immagine R raster

library(raster) 
r1 <- brick(system.file("external/rlogo.grd", package="raster")) 
x <- crop(r1, extent(0,50,0,50)) 
plotRGB(x) 
png(width=50, height=50) 
par(mai=c(0,0,0,0)) 
image(x) 
dev.off() 

--------- update1 -------------------------

Sulla base del accettata rispondere al codice di lavoro è la seguente

library(raster) 
r1 <- brick(system.file("external/rlogo.grd", package="raster")) 
r1 
x <- crop(r1, extent(0,ncol(r1),0,nrow(r1))) 
plotRGB(x) 

x1 <- 0:ncol(x) 
y1 <- 0:nrow(x) 
z <- matrix(1, nrow=length(x1), ncol=length(y1)) 

col.mat <- t(apply(matrix(rgb(getValues(x)/255), nrow=nrow(x), byrow=TRUE), 2, rev)) 

# Rotate 45 degrees 
persp(x1, y1, z, zlim=c(0,2), theta = 20, phi = 90, 
     col = col.mat, scale=FALSE, border=NA, box=FALSE) 
png("SaveThisPlot.png") 
persp(x1, y1, z, zlim=c(0,2), theta = 20, phi = 90, 
     col = col.mat, scale=FALSE, border=NA, box=FALSE) 
dev.off() 
+2

Qualcosa come ['ruotare'] (http://www.rdocumentation.org/packages/raster/functions/rotate) nel pacchetto' raster'? –

+0

hai qualche esempio? ho provato e ho ricevuto un errore come mostrato sopra – user2543622

+0

@Frank c'è un modo per eseguire una rotazione di 45 gradi? I tuoi comandi funzionano! – user2543622

risposta

9

Per le rotazioni di 90 gradi, questa è una soluzione facile:

image(t(flip(x, 1))) 
image(t(flip(x, 2))) 
plotRGB(t(flip(x, 1))) 
plotRGB(t(flip(x, 2))) 

Per la rotazione di 45 gradi e 135 gradi, sarà un po 'più complicato. Ci sono probabilmente altri modi, ma userò la funzione persp e fornirò diversi angoli all'argomento theta.

È solo una questione di impostare la chiamata a persp correttamente. x1, y1 e z sono solo ingressi per la funzione persp (vedere ?persp per ulteriori informazioni sugli argomenti relativi a tale funzione). col.mat è una matrice che contiene valori di colore.

x1 <- 0:ncol(x) 
y1 <- 0:nrow(x) 
z <- matrix(1, nrow=length(x1), ncol=length(y1)) 
col.mat <- t(apply(matrix(rgb(getValues(x)/255), nrow=nrow(x), byrow=TRUE), 2, rev)) 
# the transposing and reversing are just to get the colors in the same 
# spots as they're in when viewing plotRGB(x). 
# 
# getValues(x) is how you get the rgb colors, in the form of a 3-column matrix. 
# rgb(getValues(x)/255) converts them into hex code, which is convenient enough here. 

Se si scopre che questo l'immagine speculare di è quello che stai cercando, prova riempire la matrice di colore in modo diverso. Per esempio:

col.mat <- matrix(rgb(getValues(x)/255), nrow=nrow(x)) 

Come si può dire, riempiendo la matrice di colore corretto è la chiave per far funzionare questo approccio per voi. Lascerò come esercizio al lettore per capire come fare qualsiasi altra manipolazione alla matrice di colori.

Ora, chiamare persp. Qui, ho impostato i valori zlim in modo che vi sia un intervallo compreso 1. Poiché ho effettuato tutti i valori z 1, è necessario impostare un intervallo valido, altrimenti, persp genererà un errore sui limiti non validi. Non gli piace un intervallo da 1 a 1.

# Rotate 45 degrees 
persp(x1, y1, z, zlim=c(0,2), theta = 45, phi = 90, 
    col = col.mat, scale=FALSE, border=NA, box=FALSE) 

enter image description here

Ecco un 135 gradi:

# Rotate 135 degrees 
persp(x1, y1, z, zlim=c(0,2), theta = 135, phi = 90, 
    col = col.mat, scale=FALSE, border=NA, box=FALSE) 

enter image description here

Salvataggio delle trame può essere fatto nello stesso modo si mostra nella sua domanda:

png("SaveThisPlot.png") 
persp(x1, y1, z, zlim=c(0,2), theta = 135, phi = 90, 
    col = col.mat, scale=FALSE, border=NA, box=FALSE) 
dev.off() 
+0

Il poster originale ha avuto alcuni problemi in seguito alla larghezza! = Altezza, come notato in un post successivo: http://stackoverflow.com/questions/31814873/r-raster-rotating-images-and-not-changing-their-size. – aaryno

1

il modo per farlo senza buttare un errore o un messaggio di avviso (dopo aver letto la pagina di aiuto e giocando con l'esempio :)

extent(x) <- extent(0, 360, -90, 90) 
rr <- rotate(x) 
png() 
plotRGB(x) 
dev.off() 

Ma si può non mi piace perché ha assunto un particolare sistema di coordinate che probabilmente non hai. Se si vuole tirare gli elementi dei dati fuori quindi utilizzare il @ dell'operatore:

str(x) The slots are named 'data' and 'values' 
image(x) 
image(matrix([email protected]@values[,1], 50, byrow=TRUE)) # rotate one layer 
+0

Non penso che stia ruotando la mia immagine. Piuttosto sembra che stia allungando la mia immagine lungo l'asse x :( – user2543622

+0

In realtà lo ruota e si deforma, ma dopo averlo diviso a metà (a causa dell'assunzione di un sistema di coordinate da -180 a +180). Avevo avvertito che non sarebbe piaciuto. –

+0

'ruotare' è per un singolo caso speciale.Per 'ruotare' dati lon/lat globali da 0..360 a -180..180 gradi di longitudine .. Questo (l'uso diretto dello slot S4 che non sai cosa essi sono per) 'image (matrice (x @ data @ valori [, 1], 50, byrow = TRUE))' è un terribile suggerimento – RobertH