RGB颜色空间基于三维直角坐标系,包括R,G,B三个原始光谱分量,分别描述红色,绿色,蓝色的亮度值。
为方便描述,我们将3个分量都进行归一化处理,三元组每个数值表示红,绿,蓝三者的比例。(0,0,0)代表黑色,(1,1,1)代表白色,(1,0,0)代表红色,以此类推。
RGB图像由3个图像分量组成,分别是R通道图像,G通道图像,B通道图像。
from skimage import io
from matplotlib import pyplot as plt
img = io.imread('girl.jpg') # 载入图像
fig = plt.figure()
# 显示RGB图像
plt.figure()
plt.axis('off') # 不显示坐标轴
plt.imshow(img)
# R通道图像
imgR = img[:, :, 0]
plt.figure()
plt.axis('off')
plt.imshow(imgR,cmap='gray')
# G通道
imgG = img[:, :, 1]
plt.figure()
plt.axis('off')
plt.imshow(imgG,cmap='gray')
# B通道
imgB = img[:, :, 2]
plt.figure()
plt.axis('off')
plt.imshow(imgB,cmap='gray')
plt.show()
彩色原图:
R,G,B不同分量显示结果:
HSI〔Hue-Saturation-Intensity(Lightness),HSI或HSL〕颜色模型用H、S、I三参数描述颜色特性,其中H定义颜色的频率,称为色调;S表示颜色的深浅程度,称为饱和度;I表示强度或亮度。
色调H由角度表示,反映该颜色最接近哪个光谱波长。在色环中,0度表示红色光谱,120度表示绿色光谱,240度表示蓝色光谱。饱和度由色环的圆心到颜色点的半径决定,距离越长饱和度越高。亮度I由颜色点到圆柱底部的距离表示,底部圆心表示黑色,顶部圆心表示白色。
给定一幅RGB颜色空间格式图像,图像R,G,B分量分别进行归一化处理。在RGB颜色空间上,位于空间位置(x,y)的像素点的颜色用该像素点的R(x,y),G(x,y),B(x,y)三个数值表示。在HSI颜色空间中,位于空间位置(x,y)像素点的H(x,y),S(x,y),I(x,y):
from skimage import data
from matplotlib import pyplot as plt
import math
import numpy as np
import sys
# 定义RGB图像转换为HSI图像的函数
def rgb2hsi(r, g, b):
r = r / 255
g = g / 255
b = b / 255
num = 0.5 * ((r - g) + (r - b))
den = ((r - g) * (r - g) + (r - b) * (g - b)) ** 0.5
if b <= g:
if den == 0:
den = sys.float_info.min
h = math.acos(num / den)
elif b > g:
if den == 0:
den = sys.float_info.min
h = (2 * math.pi) - math.acos(num / den)
s = 1 - (3 * min(r, g, b) / (r + g + b))
i = (r + g + b) / 3
return int(h), int(s * 100), int(i * 255)
image = data.coffee()
hsi_image = np.zeros(image.shape, dtype='uint8')
for ii in range(image.shape[0]):
for jj in range(image.shape[1]):
r, g, b = image[ii, jj, :]
h, s, i = rgb2hsi(r, g, b)
hsi_image[ii, jj, :] = (h, s, i)
# 显示RGB原图像
plt.subplot(231)
plt.imshow(image)
plt.axis('off')
plt.title('RGB')
# 显示RGB原图像R分量
plt.subplot(232)
plt.imshow(image[:, :, 0], cmap='gray')
plt.axis('off')
plt.title('RGB-R')
# 显示HSI图像H分量
plt.subplot(233)
plt.imshow(hsi_image[:, :, 0], cmap='gray')
plt.axis('off')
plt.title('HSI-H')
# 显示HSI图像S分量
plt.subplot(234)
plt.imshow(hsi_image[:, :, 1], cmap='gray')
plt.axis('off')
plt.title('HSI-S')
# 显示HSI图像I分量
plt.subplot(235)
plt.imshow(hsi_image[:, :, 2], cmap='gray')
plt.axis('off')
plt.title('HSI-I')
plt.show()