4.1.3 色彩管理

如上一小节所述,Image类扩展了基础数组,并使用colorMode来存储应如何处理多维数据的颜色信息。colorMode()函数可用于访问和更改此属性,修改图像的渲染模式。在下一个例子中,我们将一张彩色图像的模式变为灰色(Grayscale),这样该图像将不再显示为单一的彩色图像,而是转换为三帧的灰色图像,分别对应红、绿、蓝三个通道。colorMode()函数只会改变EBImage渲染图像的方式,并不会改变图像的内容。运行以下程序代码,将一个彩色图像渲染为一个具有3帧(红色通道、绿色通道、蓝色通道)的灰色图像,如图4-5所示。

> colorMode(imgcol) <- Grayscale
> display(imgcol,method = 'raster',all = TRUE,nx = 3)
104-1

图4-5 将一个彩色图像渲染为一个三帧的灰色图像

我们还可以利用writeImage()函数将imgcol保存到本地,此时会将三个通道的灰色图像分别保存为jepg文件。

> writeImage(imgcol,'../images/imgcol-grayscale.jpg')
> list.files('../images/',pattern = 'imgcol-grayscale')
[1] "imgcol-grayscale-0.jpg" "imgcol-grayscale-1.jpg" "imgcol-grayscale-2.jpg"

我们可以使用更灵活的channel()函数进行色彩空间转换,可以将灰色图像转换为彩色图像,也可以从彩色图像中提取颜色通道。与colorMode()函数不同,channel()函数还可以更改图像的像素强度值。asred、asgreen和asblue转换模式可以将灰色图像或数组转换为指定色调的彩色图像,此时图形数据也将从二维变成三维。运行以下程序代码可以将灰色图像变成绿色图像,如图4-6所示。

> img_asgreen <- channel(img,'asgreen')
> dim(img)
[1] 1920 1080
> dim(img_asgreen)
[1] 1920 1080    3
105-1

图4-6 将灰色图像变成绿色图像

由上述代码可知,channel()函数将灰色图像变成彩色图像,图像数据从二维变成三维,因为img_asgreen是一张绿色图像,所以红色通道、蓝色通道的矩阵数值全部为0。我们单独绘制三个通道数据的直方图进行直观展示,运行以下程序代码得到如图4-7所示结果。

> par(mfrow=c(1,3))
> title <- c('red','green','blue')
> for(i in 1:3) {hist(img_asgreen[,,i],main = title[i])}
> par(mfrow=c(1,1))

从图4-7可知,仅绿色通道的矩阵数值不全部为0,红色通道、蓝色通道的矩阵数值全部为0。其实绿色通道的矩阵数值与灰色图像img的矩阵数值完全一致,我们通过all.equal()函数进行验证。

106-1

图4-7 绘制img_asgreen图像三个通道数据矩阵的直方图

> # 判断绿色通道矩阵是否与灰色图像矩阵一致
> all.equal(imageData(img[,]),imageData(img_asgreen[,,2]))
[1] TRUE

返回结果为TRUE,说明两者的矩阵数值完全一致。

我们知道,当红、绿、蓝三通道的值均为1时,返回白色图像;当红、绿、蓝三通道的值均为0时,返回黑色图像。运行以下代码,将在img_asgreen图像左上方依次修改为黑色块、白色块、红色块、蓝色块,如图4-8所示。

> # 修改数据矩阵
> img_asgreen[1:60,1:60,1:3] <- 0    # 黑色块区域
> img_asgreen[61:120,1:60,1:3] <- 1  # 白色块区域
> img_asgreen[121:180,1:60,1] <- 1
> img_asgreen[121:180,1:60,2:3] <- 0 # 红色块区域
> img_asgreen[181:240,1:60,3] <- 1
> img_asgreen[181:240,1:60,1:2] <- 0 # 蓝色块区域
> plot(img_asgreen)
107-1

图4-8 修改图像数据得到不同的颜色

rgbImage()函数能够将3张灰色图像合并成一张彩色图像。运行以下程序代码可得到彩色图像,如图4-9所示。

> redImage <- readImage('../images/imgcol-grayscale-0.jpg')
> greenImage <- readImage('../images/imgcol-grayscale-1.jpg')
> blueImage <- readImage('../images/imgcol-grayscale-2.jpg')
> colorImage <- rgbImage(red = redImage,green = greenImage,blue = blueImage)
> plot(colorImage)
107-2

图4-9 将三张灰色图像变成彩色图像