如何使用R从图像中获取像素数据

时间:2013-02-08 09:41:24

标签: r colors rgb pixel

任何人都可以帮我解决如何从R?中的图像中获取RGB像素数据的问题。

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

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

我在R:Pixmap,Raster,ImageMetrics中尝试过很多软件包,浏览互联网,测试方法,问同学等几周试图解决这个问题。 在Stackoverflow,我试过这个:How to extract the pixel data Use R's pixmap package?,没有运气。我的文件对于R窗口来说也太大了(整个数组都没有显示),我很难理解生成的数组。对我来说最好的事情是将数据作为矩阵或以其他方式获取,以便更容易理解什么是什么。 我发现了很多类似的问题,但在其他程序(如Java,C ++,IOS,Matlab,Python等)中,我很遗憾不知道如何使用。

我的问题可能是由于我在这类工作中的低技能,但我正在尽我所能地尝试我的背景。 如果有人可以帮助我或给我索取提示,我将非常感激。

2 个答案:

答案 0 :(得分: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@redx@bluex@green广告位(或x@grey作为灰度图像)来获取每个频道的像素值矩阵。您可以检查矩阵的尺寸是否与图片的尺寸相同:

dim(x@red)
[1] 480 480

答案 1 :(得分:2)

采取这个微小的样本3x3像素png图像:

sample image

然后:

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