我下面有代码将图像保存到我的电脑。我想将该图像围绕其中心(或左下角)旋转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()

最佳答案

对于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的调用即可。 x1y1z只是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)

这是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()

关于r - 如何旋转图像栅格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30902515/

10-12 16:31