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

Mar*_*ent 6 rgb r pixel colors

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

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

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

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

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

jub*_*uba 8

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

png("/tmp/test.png")
plot(rnorm(100))
dev.off()
Run Code Online (Sandbox Code Playgroud)

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

$ convert /tmp/test.png /tmp/test.ppm
Run Code Online (Sandbox Code Playgroud)

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

x <- read.pnm("/tmp/test.ppm")
Run Code Online (Sandbox Code Playgroud)

然后,可以使用x@red,x@blue,x@green时隙(或x@grey对于灰度图像),以获得针对每个信道作为一个矩阵的象素值.您可以检查矩阵的尺寸是否与图片的尺寸相同:

dim(x@red)
[1] 480 480
Run Code Online (Sandbox Code Playgroud)


Mar*_*ijn 5

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

样本图像

然后:

library('png')
download.file('https://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
Run Code Online (Sandbox Code Playgroud)

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

> pix.top.left
[1] 1 0 0 1
Run Code Online (Sandbox Code Playgroud)