2015-06-17 3 views
7

У меня есть код, ниже которого сохраняется изображение на моем компьютере. Я хотел бы повернуть это изображение на 45,90 и 135 градусов вокруг его центра (или нижнего левого угла), а затем сохранить как 3 разных изображения. Как я мог это сделать?Как повернуть изображение R растровый

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 -------------------------

На основании принятой ответить на рабочий код, как показано ниже

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

Что-то вроде ['rotate'] (http://www.rdocumentation.org/packages/raster/functions/rotate) в пакете' raster'? –

+0

У вас есть пример? Я попытался, и я получил ошибку, как показано выше. – user2543622

+0

@Frank есть способ выполнить поворот на 45 градусов? Ваши команды работают! – user2543622

ответ

9

Для 90-градусных поворотов, это простое решение:

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

Для 45 градусов и 135 градусов ротации, это будет немного сложнее. Возможно, есть и другие способы, но я буду использовать функцию persp и дать разные углы аргументу theta.

Это просто вопрос настройки звонка на persp должным образом. x1, y1 и z - это всего лишь входы для функции persp (см. ?persp для получения дополнительной информации об аргументах этой функции). col.mat - матрица, содержащая значения цвета.

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. 

Если вы обнаружите, что это зеркальное отражение того, что вы ищете, попробуйте заполнение матрицы цвета по-разному. Например:

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

Как вы можете сказать, правильное заполнение цветовой матрицы является ключом к тому, чтобы этот подход работал на вас. Я оставлю это упражнением для читателя, чтобы выяснить, как делать какие-либо другие манипуляции с цветовой матрицей.

Теперь позвоните persp. Здесь я устанавливаю значения zlim, поэтому существует диапазон, включающий 1. Поскольку я сделал все значения z 1, вам нужно установить допустимый диапазон, в противном случае persp выдает ошибку о недопустимых лимитах. Это не соответствует диапазону от 1 до 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

Вот 135 градусов:

# 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

Сохранение графики можно сделать таким же образом, вы показываете в вашем вопросе:

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

Оригинальный плакат позже имел некоторые проблемы при ширине! = Height, как указано в более позднем посте: http://stackoverflow.com/questions/31814873/r-raster-rotating-images-and-not-changing-their-size. – aaryno

1

способ сделать это без выбрасывания ошибки или предупреждающее сообщение (после прочтения страницы справки и играть на примере :)

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

Но вы можете не так, потому что он принял определенную систему координат, которую вы, вероятно, не сделали. Если вы хотите, чтобы вытащить элементы данных из затем использовать @ оператор:

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

Я не думаю, что он поворачивает мое изображение. Скорее кажется, что он растягивает изображение по оси x :( – user2543622

+0

Фактически он вращает его и деформирует, но после расщепления пополам (из-за предположения о системе координат от -180 до +180). Я предупреждал, что вам это не понравится. –

+0

'rotate' для отдельного частного случая. Чтобы« вращать »глобальные данные lon/lat от 0..360 до -180..180 градусов долготы. Это (прямое использование слота S4, которое вы не знаете, что они for) 'image (matrix (x @ data @ values ​​[, 1], 50, byrow = TRUE))' является ужасным предложением. – RobertH

Смежные вопросы