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

4

一个R语言初学者的问题:

我想将一张RGB图像转换为灰度图像,并使用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(gray) = 灰度转换的图像似乎与图像函数不兼容。在R的EBImage中,灰度图像是否具有多个通道?

然后我手动进行了转换,并能够对其调用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

然而,两幅灰度图像的强度略有不同。在EBImage中有没有将RGB转换为单通道灰度的方法?

编辑 回答为什么使用EBImage:

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

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

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

图片1 图片2


在您发布的代码中,您在第一个块中犯了一个错误。应该是 image(gray) 而不是 image(grey) - Scott Ritchie
你为什么想要使用EBImage?使用标准的basegraphics软件包工具将图像对象转换为灰度并不是一件大事。 - Carl Witthoft
@Manetheran 好的,谢谢!我已经修复了。然而,这当然没有解决问题 :-). - Valentin H
@CarlWitthoft:我接触R语言算是半个意外。当时我在谷歌上搜索一些与图像处理相关的问题,然后发现了EBImage。我尝试使用R并立刻爱上了它。那么您会建议先尝试使用核心函数来实现所有功能吗? - Valentin H
2个回答

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

学习png包很有趣!bar<- foo[,,1]+foo[,,2]+foo[,,3]没有因素?如果你只是为了简单起见而留下了因素,那么它与gray1 = 0.21channel(orig,"r")+0.71channel(orig,"g")+0.07*channel(orig,"b")相同。我以为有一个明确的命令可以将RGB转换为灰度8位。无论如何,谢谢! - Valentin H
@ValentinHeinitz,一定有一个RGB转灰度的函数,但我现在找不到它 :-( - Carl Witthoft

6

抱歉如果我理解有误,但是据我所知,您的灰度转换并没有以正确的方式进行。通常使用EBImage将图像转换为灰度可以使用以下命令:grayimage<-channel(yourimage,"gray"),然后使用image(grayimage)显示。

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

这里的 colormode 给出了 nb.total.frames:3


太好了!这正是我一直在寻找的。(我想你的意思是nb.total.frames:1而不是3)我不知道通道函数中的“gray”参数值。 - Valentin H

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