【发布时间】:2020-06-01 14:48:41
【问题描述】:
我有一个尺寸为 (28,28,3) 高度、宽度、深度的数组。每个深度都是 RGB 通道之一。值介于 0 和 1 之间。
我想使用 image() 函数来绘制图像。 z 参数是一个矩阵。如何将数组转换为矩阵以便能够绘图?
我的最终目标是制作类似于 this 的内容,但要使用彩色图像。
【问题讨论】:
标签: r image image-processing plot
我有一个尺寸为 (28,28,3) 高度、宽度、深度的数组。每个深度都是 RGB 通道之一。值介于 0 和 1 之间。
我想使用 image() 函数来绘制图像。 z 参数是一个矩阵。如何将数组转换为矩阵以便能够绘图?
我的最终目标是制作类似于 this 的内容,但要使用彩色图像。
【问题讨论】:
标签: r image image-processing plot
一种方法是使用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 解决方案。
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)
【讨论】:
使用光栅包你可以做到
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)
【讨论】: