【问题标题】:Matrix to image with exactly 1 pixel for each element矩阵到图像,每个元素恰好有 1 个像素
【发布时间】:2011-10-04 09:36:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: r plot


    【解决方案1】:

    一种方法是完全避免使用 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 像素-每值身份)?如果在 R 中太难,我愿意使用其他软件。
    • 我不知道这是什么意思。你能详细说明一下,甚至画一幅画吗?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多