1.2 变换颜色空间(RGB→Lab)
CIELAB(缩写为“Lab”)颜色空间由3个颜色通道组成,进而将像素颜色表示为3个元组(L、a、b)。其中L通道表示光度/照明度/强度(亮度),a通道和b通道则分别代表“绿-红”和“蓝-黄”颜色分量。此颜色模型将强度与颜色完全分离。该颜色空间独立于设备,并且具有很大的色域。在第一个实例中,读者将看到应如何从RGB颜色空间转换到Lab颜色空间(从Lab颜色空间转换到RGB颜色空间的原理相同),以及这个颜色模型的作用。
1.2.1 准备工作
在这个实例中,我们将一朵花的RGB图像用作输入。首先,使用以下代码导入所需的Python库:
import numpy as np from skimage.io import imread from skimage.color import rgb2lab, lab2rgb import matplotlib.pylab as plt
1.2.2 执行步骤
在这个实例中,读者将看到Lab 颜色空间的一些神奇用法,以及它是如何让某些图像操作变得简单而优雅的。
1.通过将Lab颜色空间的颜色通道设置为零,实现RGB图像到灰度图像的转换
我们使用Lab颜色空间和scikit-image库的函数,按照以下步骤来将RGB图像转换为灰度图像。
(1)读取输入图像。执行从RGB颜色空间到Lab颜色空间的转换:
im = imread('images/flowers.png') im1 = rgb2lab(im)
(2)将颜色通道(Lab颜色空间的第二通道和第三通道)数值设置为零:
im1[...,1] = im1[...,2] = 0
(3)将图像从Lab颜色空间转换回RGB颜色空间,获得灰度图像:
im1 = lab2rgb(im1)
(4)绘制输入和输出图像(如以下代码所示):
plt.figure(figsize=(20,10)) plt.subplot(121), plt.imshow(im), plt.axis('off'), plt.title('Original image', size=20) plt.subplot(122), plt.imshow(im1), plt.axis('off'), plt.title('Grayscale image', size=20) plt.show()
运行上述代码,输出如图1-1所示。
图1-1
2.通过改变亮度通道,改变图像的亮度
使用Lab颜色空间和scikit-image 库函数,执行以下步骤来更改彩色图像的亮度。
(1)将输入图像从RGB颜色空间转换到Lab颜色空间,并增加第一个通道(L通道)的值(增加50):
im1 = rgb2lab(im) im1[...,0] = im1[...,0] + 50
(2)将其从Lab颜色空间转换回RGB颜色空间,获得更亮的图像:
im1 = lab2rgb(im1)
(3)类似上述步骤,将图像从RGB颜色空间转换到Lab颜色空间,并仅减少第一个通道值(减少50,如以下代码所示),然后将图像转换回RGB颜色空间,得到一个更暗的图像:
im1 = rgb2lab(im) im1[...,0] = im1[...,0] -50 im1 = lab2rgb(im1)
运行上述代码,并绘制输入和输出图像,则得到图1-2所示的输出。
图1-2
1.2.3 工作原理
使用scikit-image库color模块的rgb2lab()函数可以将图像从RGB颜色空间转换到Lab颜色空间。
使用scikit-image库color模块的lab2rgb()函数可以将之前被转换的图像从Lab颜色空间转换回RGB颜色空间。
由于颜色通道a和颜色通道b是分离的,依据L通道的亮度,通过将颜色通道值设置为零,能够从Lab空间中的颜色图像获得相应的灰度图像。
无须对颜色通道进行任何操作,仅更改Lab空间中的L通道值(不同于RGB颜色空间,需要更改所有通道值),便可以改变输入颜色图像的亮度。
1.2.4 更多实践
Lab颜色空间还有许多其他用途。例如,在Lab颜色空间中仅需要反转光度通道,便可以获得更自然的反转图像,如下所示:
im1 = rgb2lab(im) im1[...,0] = np.max(im1[...,0]) -im1[...,0] im1 = lab2rgb(im1)
运行上述代码,显示输入图像以及在Lab颜色空间和RGB颜色空间中所生成的反转图像,则可以得到图1-3所示的图像。
图1-3
可以看到,Lab颜色空间中的反转图像,比RGB颜色空间中的反转图像显得更加自然。