【问题标题】:Read image in R and access pixel info [duplicate]在R中读取图像并访问像素信息[重复]
【发布时间】:2015-01-10 07:00:24
【问题描述】:

我想读取(多个)图像(例如使用 read.jpeg、EBImage)而不是选择图像的一部分 (ROI) 并计算该区域的亮度(例如亮度 = sqrt( .241*R^2 + .691*G^2 + .068*B^2 ))。 我怎样才能访问这个值(RGB)?示例代码只是打开并裁剪图像:

require('EBImage')
Image <- readImage('path/image.JPG')
display(Image)
Image <- Image[200:400, 200:300,]
display(Image)
.
.
.
Y  <-  0.2126*R^2 + 0.7152*G^2 + 0.0722*B^2

最后,我将在数千张图片上循环运行,并将每张图片的值写入向量中,因此它应该非常高效。

【问题讨论】:

  • 首先,阅读readImage 的帮助文件。我会为你做,但你没有说明在哪里可以找到那个包。同时,考虑 CRAN 包jpg,它产生一个X by y by r,g,b 3D 数组。从那以后,做你想做的事就很简单了。
  • 也许browseVignettes("EBImage") 会有所帮助?也许imgk = channel(img, 'rgb')

标签: r image brightness


【解决方案1】:

EBImage 是一个 Bioc 包(但由于它无法在运行 Yosemite 的 Mac 上正确编译)我最初探索这个问题的努力失败了。在这台运行 Lion 的机器上,我能够演示如何查看正式类“图像”的项目以及如何将它们分开。 (我使用附在我的一封电子邮件中的商业文件作为我的测试用例,它只有 142 x 69 像素,所以我使用了一个较小的“窗口”

> Image <- Image[75:100, 25:50,]
> display(Image)
> str(Image)
Formal class 'Image' [package "EBImage"] with 2 slots
  ..@ .Data    : num [1:21, 1:31, 1:3] 1 1 1 1 1 ...
  ..@ colormode: int 2

所以这个 S4 对象的 .Data 组件是一个 21 x 31 x 3 R 数组。虽然我不是图像专家,但可能有红色、绿色和蓝色层,可能还有其他颜色方案。这会让你“看到”第一层的左上角:

> Image@.Data[ 1:5,1:5 , 1]
     [,1]      [,2]      [,3]      [,4]      [,5]
[1,]    1 0.9882353 1.0000000 1.0000000 1.0000000
[2,]    1 1.0000000 1.0000000 1.0000000 1.0000000
[3,]    1 1.0000000 1.0000000 0.9803922 0.8470588
[4,]    1 1.0000000 0.9960784 0.8588235 0.6627451
[5,]    1 1.0000000 0.9607843 0.8470588 0.6901961

注意 at 符号而不是美元符号作为中缀提取运算符。这将提供一种机制来计算层值与您请求的系数和平方的总和:

> Y  <-  0.2126*Image@.Data[ , , 1]^2 + 0.7152*Image@.Data[ , , 2]^2 + 0.0722*Image@.Data[ , , 3]^2
> str(Y)
 num [1:21, 1:31] 0.974 0.956 0.957 0.963 0.97 ...

结果是一个“强度”的 R 矩阵,其尺寸与投影的 RGB 图层相同(如果是 .jpg 文件正在使用的话。)

【讨论】:

  • 干得好。现在,如果只有 SO 可以学习 RTFM 并了解什么是“插槽”:-(
  • 感谢 BondedDust!效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多