矩阵到每个元素只有1个像素的图像

时间:2011-10-04 09:36:07

标签: r plot

我有兴趣将矩阵转换为图像(元素值=像素强度),有点像: R - image of a pixel matrix?

但是我需要图像的大小与矩阵的大小完全相同(以像素为单位)。因此,如果矩阵是234x14,那么应该是生成的图像。

不使用额外的R包的解决方案的偏好(如上面的问题回答),但一切都会很好。

3 个答案:

答案 0 :(得分:3)

一种方法是完全避免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

答案 1 :(得分:2)

这是一个额外的包,但您可以尝试pixmap:http://cran.r-project.org/web/packages/pixmap/index.html

如果您想要动画图像,可以使用caTools从矩阵中编写GIF动画。

答案 2 :(得分:1)

这是解决问题的另一种方法。示例中包括使用轴信息添加边距的方法,如何标准化和放置要绘制的数据+使用特定级别(零)的颜色(蓝色)。替换您想要使用的特定数据并将{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()