- Keras深度学习:入门、实战与进阶
- 谢佳标
- 936字
- 2024-10-30 00:46:59
4.1.3 色彩管理
如上一小节所述,Image类扩展了基础数组,并使用colorMode来存储应如何处理多维数据的颜色信息。colorMode()函数可用于访问和更改此属性,修改图像的渲染模式。在下一个例子中,我们将一张彩色图像的模式变为灰色(Grayscale),这样该图像将不再显示为单一的彩色图像,而是转换为三帧的灰色图像,分别对应红、绿、蓝三个通道。colorMode()函数只会改变EBImage渲染图像的方式,并不会改变图像的内容。运行以下程序代码,将一个彩色图像渲染为一个具有3帧(红色通道、绿色通道、蓝色通道)的灰色图像,如图4-5所示。
> colorMode(imgcol) <- Grayscale > display(imgcol,method = 'raster',all = TRUE,nx = 3)
图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
图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()函数进行验证。
图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)
图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)
图4-9 将三张灰色图像变成彩色图像