目录
RGB/HSI颜色空间解读
一般用的都是RGB图像。但是由于HSI颜色空间更符合人体感知,因此很多工作都需要先将RGB转为HSI。在冈萨瓦斯的《数字图像处理》中是这样支持使用HSI空间的:
也就是说,由于H,S对于光强的鲁棒性,它们是我们重点关注的两个量。在易受光强变化影响的场景下,使用HSI空间是比较可靠的。具体的转换公式:
小写是表示归一化的状态。即未拉伸扩充。(常用的是把归一化的h,s,i值做扩充便于理解。见下面程序。)
由于opencv中没有自带转HSI的函数(有转HSV空间的,但是和HSI还有有些差别)。故自行用python实现颜色空间转换:
import numpy as np
import math
def rgb2hsi(img_rgb):
rows = int(img_rgb.shape[0])
cols = int(img_rgb.shape[1])
B, G, R = cv2.split(img_rgb)
# 归一化到[0,1]
B = B / 255.0
G = G / 255.0
R = R / 255.0
img_hsi = img_rgb.copy()
H, S, I = cv2.split(img_hsi)
for i in range(rows):
for j in range(cols):
num = 0.5 * ((R[i, j] - G[i, j]) + (R[i, j] - B[i, j]))
den = np.sqrt((R[i, j] - G[i, j]) ** 2 + (R[i, j] - B[i, j]) * (G[i, j] - B[i, j]))
theta = float(np.arccos(num / den))
if den == 0:
H = 0
elif B[i, j] <= G[i, j]:
H = theta
else:
H = 2 * np.pi - theta
min_RGB = min(min(B[i, j], G[i, j]), R[i, j])
sum = B[i, j] + G[i, j] + R[i, j]
if sum == 0:
S = 0
else:
S = 1 - 3 * min_RGB / sum
H = H / (2 * np.pi)
I = sum / 3.0
# 为了便于理解,常常对结果做扩充,即 [0°,360°],[0,100],[0,255]
# img_hsi[i, j, 0] = H * 360
# img_hsi[i, j, 1] = S * 100
# img_hsi[i, j, 2] = I * 255
# 或者为了便于计算直方图,都扩充为0~