Python图像处理经典实例
上QQ阅读APP看书,第一时间看更新

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颜色空间中的反转图像显得更加自然。