在R EBImage中将RGB图像转换为单通道灰度图像

时间:2013-12-03 09:14:09

标签: r image-processing

一个R-beginner问题:

我想将RGB-Image转换为灰度,并使用image()

显示/绘制它
library(EBImage)
orig = readImage("c:/test/b/s2.png")
gray = orig
colorMode(gray) = Grayscale

display(gray) #works
image(gray) #Error 'z' should be a matrix

由colorMode(灰色)=灰度转换的图像似乎与图像功能不兼容。 R EBImage中的Crayscale图像是否有多个通道?

然后我手动转换它并且能够调用它上面的image()

r = channel(orig,"r")
g = channel(orig,"g")
b = channel(orig,"b")

gray1 = 0.21*r+0.71*g+0.07*b

display(gray1) 
image(gray1) #works

然而,灰度图像的强度略有不同。 有没有办法在R EBImage中将RGB转换为一个通道灰色?

修改 为了回答这个问题,为什么选择EBImage:

该软件包提供了一些图像处理功能。例如。我可以使用更多EBImage命令轻松显示扫描测试条纹(img1)的强度图(img2):

blotgraph = resize(gblur(gray1,3),200,1)
plot(blotgraph, type="l")

我不知道如何在没有EBImage的情况下解决这类任务

img1 img2

2 个答案:

答案 0 :(得分:7)

这可能更简单,但有更快更简洁的方法来压缩颜色层。

library(png)
foo<-readPNG("c:/test/b/s2.png")
#that's an array n by m by 3 . Now reduce to grey
bar<- foo[,,1]+foo[,,2]+foo[,,3]
# normalize
bar <- bar/max(bar)
# one of many ways to plot
plot(c(0,1),c(0,1),t='n')
rasterImage(bar, 0,0,1,1)

请注意,这会创建一个灰度图像对象bar,同时“保存”全色对象foo

答案 1 :(得分:6)

很抱歉,如果我错了,但据我所知,你的转换为灰度并没有以正确的方式完成。通常使用命令grayimage<-channel(yourimage,"gray")将EBImage转换为灰度 和图像(灰度图像)给出

Image
  colormode: Grayscale 
  storage.mode: double 
  dim: X Y 
  nb.total.frames: 1 
  nb.render.frames: 1 

其中colormode给出nb.total.frames:3