【问题标题】:How to plot an RGB image using the image() function from a 3D array?如何使用 3D 数组中的 image() 函数绘制 RGB 图像?
【发布时间】:2020-06-01 14:48:41
【问题描述】:

我有一个尺寸为 (28,28,3) 高度、宽度、深度的数组。每个深度都是 RGB 通道之一。值介于 0 和 1 之间。

我想使用 image() 函数来绘制图像。 z 参数是一个矩阵。如何将数组转换为矩阵以便能够绘图?

我的最终目标是制作类似于 this 的内容,但要使用彩色图像。

【问题讨论】:

    标签: r image image-processing plot


    【解决方案1】:

    一种方法是使用rasterImage

    set.seed(3)
    data <- replicate(4,array(data = runif(28*28*3,0,1),
                              dim = c(28,28,3)), simplify = FALSE)
    
    par(mfrow=c(2, 2), mar=c(0, 0, 3, 0))
    sapply(seq_along(data), function(x){
      plot.new()
      rasterImage(data[[x]], xleft = 0, xright = 1,
                ytop = 0, ybottom = 1, interpolate = FALSE)
      title(paste0("Plot ",x))
    })
    

    【讨论】:

    • 因为我想将几个图像绘制为网格并在每个图像上方添加标签。
    • 好的,我添加了rasterImage 解决方案。
    【解决方案2】:

    graphics::image 的问题在于它不会将您的 3D 数组绘制为彩色图像。它将矩阵绘制为热图。

    让我们来一张彩色图案的图像:

    R <- matrix(rep(sin(seq(0, 2*pi, length.out = 31))^2, length.out = 900), nrow = 30)
    G <- matrix(rep(cos(seq(0, 2*pi, length.out = 15))^2, length.out = 900), nrow = 30)
    B <- matrix(rep(sin(seq(pi, 2*pi, length.out = 30))^2, length.out = 900), nrow = 30)
    
    my_img <- c(R, G, B)
    dim(my_img) <- c(30, 30, 3)
    

    现在,如果我按照@IanCampbell 的建议使用raster 绘制此图,我会得到我想要的图像:

    plot(raster::as.raster(my_img))
    

    而如果我使用image 绘制一层(这里是红色通道),我会得到一张热图:

    image(R)
    

    如果您真的想要使用image,那么您必须对所有图层进行平均,但随后您会丢失颜色信息,但仍会得到一张热图:

    image((R + B + G)/3)
    

    所以底线是,如果您想绘制彩色图像,那么 image 不是您正在寻找的功能。有很多方法可以在单个 R 窗口中绘制多个彩色图像,因此说您必须使用 image 因为您需要绘制图像网格是不正确的。

    例如:

    grid.arrange(rasterGrob(my_img),   rasterGrob(1-my_img),
                 rasterGrob(1-my_img), rasterGrob(my_img), ncol = 2)
    

    【讨论】:

    • 你的样本数据比我的好很多。我将把它留到以后。
    【解决方案3】:

    使用光栅包你可以做到

    R <- matrix(rep(sin(seq(0, 2*pi, length.out = 31))^2, length.out = 900), nrow = 30)
    G <- matrix(rep(cos(seq(0, 2*pi, length.out = 15))^2, length.out = 900), nrow = 30)
    B <- matrix(rep(sin(seq(pi, 2*pi, length.out = 30))^2, length.out = 900), nrow = 30)
    
    my_img <- c(R, G, B)
    dim(my_img) <- c(30, 30, 3)
    
    library(raster)
    b <- brick(my_img)
    crs(b) <- "+proj=tmerc"
    plotRGB(b, scale=1)
    # or
    plotRGB(b, scale=1, interpolate=TRUE)
    

    【讨论】:

      猜你喜欢
      • 2013-03-09
      • 2014-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      相关资源
      最近更新 更多