RGB与HSV的转换算法

Camill

RGB介绍

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。

参考百度百科RGB

HSV介绍

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。HSV颜色模型是指H、S、V三维颜色空间中的一个可见光子集,它包含某个颜色域的所有颜色。

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。HSV色系对用户来说是一种直观的颜色模型,对于颜色,人们直观的会问”什么颜色?深浅如何?明暗如何?“,而HSV色系则直观的表示了这些信息。

每一种颜色都是由色相(Hue,简H),饱和度(Saturation,简S)和色明度(Value,简V)所表示的。这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。

色调H参数表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,取值范围为0°~360°。若从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
饱和度S:取值范围为0.0~1.0;

亮度V:取值范围为0.0(黑色)~1.0(白色)。

RGB转HSV数学公式

设条件:

  1. 设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数
  2. max 等于 r, g, b 中的最大者
  3. min 等于 r, g, b 中的最小者

计算H






计算S


否则

计算V

实现示例

Python 实现

直接使用cv函数转化

1
2
3
4
5
6
7
8
import cv2

img_bgr = cv2.imread("test.jpg")
cv2.imshow("img_bgr", img_bgr)
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
cv2.imshow("img_hsv", img_hsv)
cv2.waitKey(0)

效果如下:

自己实现转化,分离出H、S、V变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import cv2
import numpy as np

img_bgr = cv2.imread("test.jpg")
cv2.imshow("img_bgr", img_bgr)
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
cv2.imshow("img_hsv", img_hsv)

def rgb2hsv(img):
h = img.shape[0]
w = img.shape[1]
H = np.zeros((h, w), np.float32)
S = np.zeros((h, w), np.float32)
V = np.zeros((h, w), np.float32)
r, g, b = cv2.split(img)
r, g, b = r / 255.0, g / 255.0, b / 255.0
for i in range(0, h):
for j in range(0, w):
mx = max((b[i, j], g[i, j], r[i, j]))
mn = min((b[i, j], g[i, j], r[i, j]))
dt = mx - mn

if mx == mn:
H[i, j] = 0
elif mx == r[i, j]:
if g[i, j] >= b[i, j]:
H[i, j] = 60 * ((g[i, j]) - b[i, j]) / dt
else:
H[i, j] = (60 * ((g[i, j]) - b[i, j]) / dt) + 360
elif mx == g[i, j]:
H[i, j] = 60 * ((b[i, j]) - r[i, j]) / dt + 120
elif mx == b[i, j]:
H[i, j] = 60 * ((r[i, j]) - g[i, j]) / dt + 240
H[i, j] = int(H[i, j] / 2)

# S
if mx == 0:
S[i, j] = 0
else:
S[i, j] = int(dt / mx * 255)
# V
V[i, j] = int(mx * 255)

return H, S, V

h, s, v = rgb2hsv(img_rgb)
img_hsv_def = cv2.merge([h,s,v])
img_hsv_def = np.array(img_hsv_def ,dtype='uint8')
cv2.imshow('img_hsv_def', img_hsv_def)

cv2.waitKey(0)

效果如下,注意img_hsv_def是自己实现的hsv图

  • 标题: RGB与HSV的转换算法
  • 作者: Camill
  • 创建于 : 2024-01-31 12:56:31
  • 更新于 : 2024-01-31 18:16:32
  • 链接: https://camill.love/note/rgb-hsv/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论