如何旋转图像 R 栅格
How to rotate an image R raster
我有下面的代码可以将图像保存到我的电脑。我想将该图像围绕其中心(或左下角)旋转 45,90 度和 135 度,然后另存为 3 张不同的图像。我该怎么做?
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()
--------更新1------------------------
根据接受的答案,工作代码如下
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()
在不抛出错误或警告消息的情况下执行此操作的方法(在阅读帮助页面并尝试示例后:)
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(x@data@values[,1], 50, byrow=TRUE)) # rotate one layer
对于 90 度旋转,这是一个简单的解决方案:
image(t(flip(x, 1)))
image(t(flip(x, 2)))
plotRGB(t(flip(x, 1)))
plotRGB(t(flip(x, 2)))
对于45度和135度的旋转,会比较trick一点。可能还有其他方法,但我将使用 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))
如您所知,正确填充颜色矩阵是使此方法适合您的关键。我将把它留作 reader 的练习,以找出如何对颜色矩阵进行任何其他操作。
现在,呼叫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)
这里是 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)
可以按照您在问题中显示的方式保存图表:
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()
我有下面的代码可以将图像保存到我的电脑。我想将该图像围绕其中心(或左下角)旋转 45,90 度和 135 度,然后另存为 3 张不同的图像。我该怎么做?
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()
--------更新1------------------------
根据接受的答案,工作代码如下
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()
在不抛出错误或警告消息的情况下执行此操作的方法(在阅读帮助页面并尝试示例后:)
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(x@data@values[,1], 50, byrow=TRUE)) # rotate one layer
对于 90 度旋转,这是一个简单的解决方案:
image(t(flip(x, 1)))
image(t(flip(x, 2)))
plotRGB(t(flip(x, 1)))
plotRGB(t(flip(x, 2)))
对于45度和135度的旋转,会比较trick一点。可能还有其他方法,但我将使用 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))
如您所知,正确填充颜色矩阵是使此方法适合您的关键。我将把它留作 reader 的练习,以找出如何对颜色矩阵进行任何其他操作。
现在,呼叫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)
这里是 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)
可以按照您在问题中显示的方式保存图表:
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()