R 包png
提供readPNG()
函数,可以将 PNG 格式的光栅图形(由“像素矩阵”组成)读取到 R 中。它返回灰度值在 [0, 1] 中的单个矩阵或 RGB 值在 [0, 1] 中的三个矩阵。
要在 [0, 1] 和 {0, ..., 255} 之间进行转换,只需乘以或除以 255 并进行舍入(如果需要)。
对于 RGB 和灰度之间的转换,您可以使用例如desaturate()
函数从colorspace
包裹。
例如,让我们下载您建议的图像:
download.file("http://www.greenmountaindiapers.com/skin/common_files/modules/Socialize/images/twitter.png",
destfile = "twitter.png")
然后我们加载上面提到的包:
library("png")
library("colorspace")
首先,我们将PNG图像读入数组x
尺寸为 28 x 28 x 4。因此,图像具有 28 x 28 像素和四个通道:红色、绿色、蓝色和 Alpha(半透明)。
x <- readPNG("twitter.png")
dim(x)
## [1] 28 28 4
现在我们可以将其转换为各种其他格式:y
是十六进制字符串的向量,指定 R 中的颜色。yg
是相应的去饱和颜色(同样是十六进制字符)灰度 only. yn
is the numeric灰色量。所有三个对象最后都排列成 28 x 28 矩阵
y <- rgb(x[,,1], x[,,2], x[,,3], alpha = x[,,4])
yg <- desaturate(y)
yn <- col2rgb(yg)[1, ]/255
dim(y) <- dim(yg) <- dim(yn) <- dim(x)[1:2]
我希望这些版本中至少有一个是您正在寻找的。为了检查像素矩阵,我编写了一个用于可视化的小方便函数:
pixmatplot <- function (x, ...) {
d <- dim(x)
xcoord <- t(expand.grid(1:d[1], 1:d[2]))
xcoord <- t(xcoord/d)
par(mar = rep(1, 4))
plot(0, 0, type = "n", xlab = "", ylab = "", axes = FALSE,
xlim = c(0, 1), ylim = c(0, 1), ...)
rect(xcoord[, 2L] - 1/d[2L], 1 - (xcoord[, 1L] - 1/d[1L]),
xcoord[, 2L], 1 - xcoord[, 1L], col = x, border = "transparent")
}
为了便于说明,我们看一下:
pixmatplot(y)
pixmatplot(yg)
如果您有较大的图像并希望将其调整为 28 x 28,我将对相应行/列的灰度值进行平均,并将结果插入到所需尺寸的矩阵中。
最后说明:虽然当然可以在 R 中完成所有这些操作,但使用图像处理软件可能会更方便。根据您的目标,使用 ImageMagick 可能会更容易mogrify
例如:
mogrify -resize 28 -type grayscale twitter.png