HSV:色调(H),0°~360°,R 0° G 120° B 240°,饱和度(S) 0-1,明度(V) 0-1
六棱锥模型,其更好地符合人类感觉颜色
RGB转HSV 难点是opencv图像保存格式 H:0-180 S:0-255 V:0-255
def RGB2HSV(image):
if image.size != False:
img = image.copy()
for i in range(img.shape[0]):
for j in range(img.shape[1]):
R = img[i, j, 2]/255.0 #归一化 不会溢出了
G = img[i, j, 1]/255.0
B = img[i, j, 0]/255.0
max_ = max(B, G, R)
min_ = min(B, G, R)
if max_ == min_:
H = 0.0
elif max_ == R:
if G >= B:
H = (G - B) / (max_ - min_) * 60
else:
H = (G - B) / (max_ - min_) * 60+360
elif max_ == G:
H = (B - R) / (max_ - min_) * 60 + 120
else:
H = (R - G) / (max_ - min_) * 60 + 240
if max == 0:
S =0
else:
S = (max_ - min_) / max_
V = max_
img[i, j, 2] = V*255
img[i, j, 1] = S*255
img[i, j, 0] = H/2
return img
opencv库函数
img_1 = cv.cvtColor(img, cv.COLOR_RGB2HSV)
HSV转RGB 难点是opencv图像保存格式 H:0-180 S:0-255 V:0-255转换成H:0-360 S:0-1 V:0-1
def HSV2RGB(image):
img = image.copy()
for i in range(img.shape[0]):
for j in range(img.shape[1]):
V = img[i, j, 2]/255
S = img[i, j, 1]/255
H = img[i, j, 0]*2
hi = int(H//60)
f = H/60-hi
p = V * (1-S)
q = V * (1-f*S)
t = V * (1-(1-f)*S)
if hi == 0:
R,G,B= (V, t, p)
elif hi == 1:
R,G,B= (q, V, p)
elif hi == 2:
R,G,B= (p, V, t)
elif hi == 3:
(R,G,B)= (p, q, V)
elif hi == 4:
R,G,B= (t, p, V)
elif hi == 5:
R,G,B= (V, p, q)
img[i, j, 2] = R*255
img[i, j, 1] = G*255
img[i, j, 0] = B*255
return img
opencv库函数 HSV 转BGR
img__1 = cv.cvtColor(img_, cv.COLOR_HSV2BGR)