R包png
提供了readPNG()
函数,可以将PNG格式的光栅图形(由“像素矩阵”组成)读入R。它返回一个灰度值在[0,1]之间的单个矩阵或三个RGB值在[0,1]之间的矩阵。
要在[0,1]和{0,...,255}之间进行转换,只需乘以或除以255并四舍五入即可。
要在RGB和灰度之间进行转换,您可以使用colorspace
软件包中的desaturate()
函数等。
例如,让我们下载您建议的图像:
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)
现在我们可以将其转换为其他各种格式:
y
是一个十六进制字符字符串的向量,用于指定 R 中的颜色。
yg
是相应的去饱和颜色(再次作为十六进制字符)仅包含
灰度。
yn
是
数字 灰度值。这三个对象最终被排列成 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)
![彩色和去色图片](https://istack.dev59.com/pUnGz.webp)
如果你有一张较大的图片想要调整到28 x 28的大小,可以对应行/列中的灰度值取平均并将结果插入到所需维度的矩阵中。
最后注意:虽然在R中完全可以完成上述步骤,但使用图像处理软件可能更为方便。例如,根据你的需求,使用ImageMagick的mogrify
可能会更容易:
mogrify -resize 28 -type grayscale twitter.png