【发布时间】:2011-10-04 09:36:06
【问题描述】:
我有兴趣将矩阵转换为图像(元素值 = 像素强度),有点像: R - image of a pixel matrix?
但是我需要图像的大小恰好(以像素为单位)矩阵的大小。因此,如果矩阵是 234x14,那么生成的图像也应该是。
偏好不使用额外 R 包的解决方案(如回答上述问题),但一切都会好起来的。
【问题讨论】:
我有兴趣将矩阵转换为图像(元素值 = 像素强度),有点像: R - image of a pixel matrix?
但是我需要图像的大小恰好(以像素为单位)矩阵的大小。因此,如果矩阵是 234x14,那么生成的图像也应该是。
偏好不使用额外 R 包的解决方案(如回答上述问题),但一切都会好起来的。
【问题讨论】:
一种方法是完全避免使用 R 设备,并依赖 rgdal 中的 GDAL 驱动程序。
m <- matrix(rep(1:234, each = 14), ncol = 14, byrow = TRUE)
l <- list(x = 1:nrow(m), y = 1:ncol(m), z = m)
library(rgdal)
x <- image2Grid(l)
writeGDAL(x, "out.tif")
GDAL 中还有其他驱动程序,但“GeoTIFF”是默认值,默认值将准确保留值(在 R 和 GDAL 的数字限制内)。这只是一个单波段栅格,但它对多个属性的工作方式相同。
这里的真正限制是您对文件的目标,以及它是否可以以您想要的方式读取结果图像。 GDAL 具有您需要的所有选项,但默认值是否正确以及您真正需要的选项取决于细节。
y <- readGDAL("out.tif")
all.equal(as.image.SpatialGridDataFrame(y)$z, m)
[1] TRUE
这是一个更真实地显示数字限制的浮点示例:
set.seed(1)
m <- matrix(runif(234 * 14), ncol = 14)
l <- list(x = 1:nrow(m), y = 1:ncol(m), z = m)
library(rgdal)
x <- image2Grid(l)
writeGDAL(x, "out.tif")
y <- readGDAL("out.tif")
all.equal(as.image.SpatialGridDataFrame(y)$z, m)
[1] "Mean relative difference: 1.984398e-08"
另一种方式是pixmap 使用的pnm 格式。见
library(pixmap)
?write.pnm
【讨论】:
这是一个额外的包,但你可以试试 pixmap:http://cran.r-project.org/web/packages/pixmap/index.html
如果您想要动画图像,您可以使用 caTools 从矩阵编写动画 gif。
【讨论】:
这是解决问题的另一种方法。示例中包括使用轴信息添加边距的方法,如何对要绘制的数据进行规范化和下限 + 为特定级别(零)使用颜色(蓝色)。替换并使用您要使用的特定数据并将 {lm, bm, tm, rm} 更改为不同的值以调整四个边距的大小(所有度量单位为像素):
maxv <- 500
v <- t(<matrix>)
d <- <vector>
di <- <vector>
dm <- <vector>
nr <- nrow(v)
nc <- ncol(v)
library(grid)
vnorm <- v
for (r in 1:nr) {
for (c in 1:nc) {
vnorm[r,c] <- min(1, v[r, nc-c+1]/500)
if (vnorm[r,c] == 0) {vnorm[r,c] <- "blue"}
else {vnorm[r,c] <- grey(vnorm[r,c])}
}
}
vnorm <- t(vnorm)
x <- seq(1, nr)
y <- rep(1, nr)
xrange <- range(d)
yrange <- c(0, 24)
bm <- 90
lm <- 40
tm <- 12
rm <- 12
png(file="graph.png", width=nr+lm+rm, height=nc+tm+bm)
par(mai=c(bm/72, lm/72, tm/72, rm/72))
plot(d, y, ann=FALSE, xlim=xrange, ylim=yrange, axes=FALSE, xaxs="i", yaxs="i")
axis(1, at=dm,labels=dm, col.axis="black", las=2)
axis(2, at=seq(0,24),labels=seq(0,24), col.axis="black", las=2)
rasterImage(vnorm, xrange[1], yrange[1], xrange[2], yrange[2], interpolate=FALSE)
dev.off()
【讨论】: