7

谁能帮助我如何从 R 中的图像中获取 RGB 像素数据?

我需要这些信息来比较鸟类羽毛的差异,以帮助理解物种形成事件。

我的照片是用数码相机拍摄的,现在是 NEF 文件。需要哪种类型的文件并不重要,我可以将文件转换为我想要的任何文件。但是,我更愿意在文件中保留尽可能多的信息(即 PNG 文件很好)。

我在 R 中尝试了许多软件包:Pixmap、Raster、ImageMetrics 并浏览了互联网、测试了方法、询问了同学等几个星期来试图解决这个问题。在 Stackoverflow 我试过这个:如何提取像素数据使用 R 的 pixmap 包?,没有运气。我的文件对于 R 窗口来说也太大了(整个数组没有显示),我很难理解生成的数组。对我来说,最好的办法是将数据作为矩阵或以另一种更容易理解的方式获取数据。我发现了大量类似的问题,但在其他程序(如 Java、C++、IOS、Matlab、Python 等)中,我很遗憾不知道如何使用。

我的问题可能是由于我对这类工作的技能低下,但我正在尽我所能在我所拥有的背景下努力。如果有人可以帮助我或给我一些提示,我将非常感激。

4

2 回答 2

8

首先我生成一个示例png图像:

png("/tmp/test.png")
plot(rnorm(100))
dev.off()

然后我将其转换为可读的格式pixmap:在这里我将 png 转换为 ppm 文件,因为我想保留颜色信息。我从命令行使用 ImageMagick,但你可以使用任何你想要的程序:

$ convert /tmp/test.png /tmp/test.ppm

read.pnm接下来,您可以使用包中的函数读取图像pixmap

x <- read.pnm("/tmp/test.ppm")

然后,您可以使用x@red, x@blue,x@green插槽(或x@grey用于灰度图像)将每个通道的像素值作为矩阵获取。您可以检查矩阵的尺寸是否与图片的尺寸相同:

dim(x@red)
[1] 480 480
于 2013-02-08T10:06:08.953 回答
3

以这个 3x3 像素 png 图像为例:

示例图像

然后:

library('png')
download.file('http://i.stack.imgur.com/hakvE.png', 'sample.png')
img <- readPNG('sample.png')
pix.top.left <- img[1,1,]     # row 1, column 1
pix.bottom.left <- img[3,1,]  # row 3, column 1
pix.top.right <- img[1,3,]    # row 1, column 3

如果您正在读取带有 alpha 通道的 PNG 图像(如上面的示例图像),那么每个pix.变量都是一个包含四个条目的向量,每个条目对应于像素的红色、绿色、蓝色和 Alpha 值。

> pix.top.left
[1] 1 0 0 1
于 2014-07-05T14:52:14.347 回答