开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情
前言
将图像从一个颜色空间转换为另一个颜色空间是一种非常有用的操作,在多种不同应用程序中都有着重要作用,例如图像分割等。
将 RGB 图像转换至 HSV 色彩空间
在本节中,我们将介绍以下内容,使用 Scikit-Image.Color 模块的 RGB2HSV() 和 HSV2RGB() 函数将彩色图像从RGB转换为HSV 色彩空间,我们还将研究修改 H(hue)、S(saturation) 和 V(value) 通道中的值对图像的影响。
接下来,我们实现将图像从 RGB 色彩空间转换到 HSV 颜色空间,并返回转换后的图像。
首先导入所需的库、模块和函数,然后读取输入 RGB 彩色图像:
from skimage.io import imread
from skimage.color import rgb2hsv, hsv2rgb
import numpy as np
import matplotlib.pyplot as plt
使用 skimage.rgb2hsv() 函数将其转换为 HSV 色彩空间,并且使用 Numpy 的 clip() 函数来确保输出像素值在 [0,1] 区间内:
im = imread("1.png")
im_hsv = np.clip(rgb2hsv(im), 0, 1)
绘制原始输入图像,以及转换后图像的 H、S 和 V 通道。然后,分别更改图像的 H、S 和 V 通道,修改后将图像转换回 RGB 色彩空间,以查看修改通道像素值对输出图像的影响。
使用 Matplotlib 的函数 subplots_adjust() 可以调整子图之间的边距,例如,通过指定子图之间的水平和垂直间距来使图像展示更为紧凑:
plt.figure(figsize=(20,12))
plt.subplots_adjust(0,0,1,0.925,0.05,0.05)
plt.gray()
plt.subplot(231), plt.imshow(im_hsv[...,0]), plt.title('h', size=10), plt.axis('off')
plt.subplot(232), plt.imshow(im_hsv[...,1]), plt.title('s', size=10), plt.axis('off')
plt.subplot(233), plt.imshow(im_hsv[...,2]), plt.title('v', size=10), plt.axis('off')
im_hsv_copy = np.copy(im_hsv)
im_hsv[...,0] /= 4
plt.subplot(234), plt.imshow(np.clip(hsv2rgb(im_hsv), 0, 1)), plt.title('original image with h=h/4', size=10), plt.axis('off')
im_hsv = im_hsv_copy
im_hsv[...,1] /= 3
plt.subplot(235), plt.imshow(np.clip(hsv2rgb(im_hsv), 0, 1)), plt.title('original image with s=s/3', size=10), plt.axis('off')
im_hsv = im_hsv_copy
im_hsv[...,2] /= 5
plt.subplot(236), plt.imshow(np.clip(hsv2rgb(im_hsv), 0, 1)), plt.title('original image with v=v/5', size=10), plt.axis('off')
plt.show()
将 RGB 图像转换至 YUV 色彩空间
接下来,我们将介绍另一个颜色模型 YUV,其中通道 Y 代表亮度 (brightness),u 和 v 通道表示色彩 (color)。我们将实现使用 color 模块函数将彩色图像从 RGB 空间转换为 YUV 颜色空间。
首先导入相应库中的必需函数,然后读取 RGB 输入图像,并使用 skimage.Color 的 RGB2YUV() 函数将其转换为 YUV 图像:
from skimage.color import rgb2yuv, yuv2rgb
im = imread("2.png")
im_Yuv = rgb2yuv(im)
分别绘制 YUV 图像中的亮度 (y) 和色彩通道 (u, v),然后修改 YUV 色彩空间中每个通道的值,再使用 skimage.color.yuv2rgb() 函数将图像转换回 RGB 色彩空间,观察修改不同通道对图像的影响:
plt.figure(figsize=(20,15))
plt.subplots_adjust(0,0,1,0.925,0.05,0.05)
plt.gray()
plt.subplot(231), plt.imshow(im_Yuv[...,0]), plt.title('Y', size=10), plt.axis('off')
plt.subplot(232), plt.imshow(im_Yuv[...,1]), plt.title('u', size=10), plt.axis('off')
plt.subplot(233), plt.imshow(im_Yuv[...,2]), plt.title('v', size=10), plt.axis('off')
im_Yuv_copy = np.copy(im_Yuv)
im_Yuv[...,0] /= 2
plt.subplot(234), plt.imshow(np.clip(yuv2rgb(im_Yuv),0,1)), plt.title('original image with Y=Y/2', size=10), plt.axis('off')
im_Yuv = im_Yuv_copy
im_Yuv[...,1] /= 3
plt.subplot(235), plt.imshow(np.clip(yuv2rgb(im_Yuv),0,1)), plt.title('original image with u=u/3', size=10), plt.axis('off')
im_Yuv = im_Yuv_copy
im_Yuv[...,2] /= 4
plt.subplot(236), plt.imshow(np.clip(yuv2rgb(im_Yuv),0,1)), plt.title('original image with v=v/4', size=10), plt.axis('off')
plt.show()
从上图可以看出,降低Y通道值会降低图像的亮度(不会改变颜色),而更改 U、V通道会改变图像颜色。