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

9
有人能帮我解决如何从图像中获取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等)解决,而我不知道如何使用它们。我的问题可能是由于我对这种工作的技能水平较低,但是我正在尽我所能。如果有人能帮助我或给我一些提示,我将不胜感激。

3
“no luck”是什么意思?Kohske对你的之前的问题给出了很好的答案,你能更具体地说明吗?你有尝试过他的解决方案吗?为什么不起作用? - Andrie
你可能会更喜欢使用ImageJ(如果你可以访问OS X,甚至可以使用GraphicConverter)。同时,假设鸟羽毛仅覆盖图像的一部分,请提取数组子集以最小化您正在处理的数据大小。 - Carl Witthoft
@Andrie,非常抱歉没有注意到这一点。正如您在我的编辑中所看到的,我误解了自己正在做的事情。不过,如果您感兴趣的话,我得到了这个错误信息,试图测试bill_080的答案:picture@size
“错误:尝试从没有插槽的基本类(“array”)对象中获取插槽“size””
- MariaBioStudent
@CarlWitthoft,是的,我刚刚在研究这个。ImageJ或Bio7结合了R和ImageJ。感谢建议! :) - MariaBioStudent
你应该开新的问题,而不是编辑原来的问题并将它们添加进去。 - juba
@juba,感谢您让我知道,我是这个论坛的新手。如果有人感兴趣,我已经发布了另一个问题:http://stackoverflow.com/questions/14773830/how-to-interpret-a-rgb-array-in-r。 - MariaBioStudent
2个回答

8

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

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

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

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

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

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

然后,您可以使用x@redx@bluex@green插槽(或者对于灰度图像,使用x@grey)来将每个通道的像素值作为矩阵获取。您可以检查矩阵的维度是否与您的图片大小相同:

dim(x@red)
[1] 480 480

如果这个回答解决了你的问题,你可以勾选绿色标记来告诉其他用户。 - juba

5

请看这个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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接