HSV模型简介以及利用HSV模型随机增强图像
Posted 太阳花的小绿豆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HSV模型简介以及利用HSV模型随机增强图像相关的知识,希望对你有一定的参考价值。
图像HSV模型简介
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)(参考百度)。在HSV模型中,颜色是由色度(Hue),饱和度(Saturation),明度(Value)共同组成。
|
|
如图所示,HSV模型中
- 色度(Hue)使用角度度量的,范围是从
0
°
0\\degree
0°到
360
°
360\\degree
360°(逆时针旋转),比如
0
°
/
360
°
0\\degree/360\\degree
0°/360°代表红色,
120
°
120\\degree
120°代表原谅色,
240
°
240\\degree
240°代表蓝色。
- 饱和度(Saturation)表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高(参考百度)。其范围是0到1。
- 明度(Value)颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关。其范围是0(暗)到1(明)。
RGB模型转HSV模型
参考opencv官方文档:https://docs.opencv.org/master/de/d25/imgproc_color_conversions.html#color_convert_rgb_hsv
首先将R,G,B分量数值缩放到范围0到1之间,即除以255. 接下来按如下公式进行转换即可。
V
=
m
a
x
(
R
,
G
,
B
)
S
=
{
V
−
m
i
n
(
R
,
G
,
B
)
V
if
V
≠
0
0
otherwise
H
=
{
60
(
G
−
B
)
/
(
V
−
m
i
n
(
R
,
G
,
B
)
)
if V=R
120
+
60
(
B
−
R
)
/
(
V
−
m
i
n
(
R
,
G
,
B
)
)
if V=G
240
+
60
(
R
−
B
)
/
(
V
−
m
i
n
(
R
,
G
,
B
)
)
if V=B
0
if R=G=B
V=max(R, G, B) \\\\ \\ \\\\ S = \\left\\{\\begin{matrix} \\frac{V - min(R,G,B)}{V} \\ \\ \\ \\ \\ \\ \\ \\text{if} \\ \\ V \\ne 0 \\\\ 0 \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\text{otherwise} \\end{matrix}\\right. \\\\ \\ \\\\ H = \\left\\{\\begin{matrix} 60(G-B)/(V-min(R, G, B)) \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\text{if V=R}\\\\ 120+60(B-R)/(V-min(R, G, B)) \\ \\ \\ \\ \\text{if V=G} \\\\ 240+60(R-B)/(V-min(R, G, B)) \\ \\ \\ \\ \\text{if V=B} \\\\ 0 \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\ \\text{if R=G=B} \\end{matrix}\\right.
V=max(R,G,B) S={VV−min(R,G,B) if V=00 otherwise H=⎩⎪⎪⎨⎪⎪⎧60(G−B)/(V−min(R,G,B)) if V=R120+60(B−R)/(V−min(R,G,B)) if V=G240+60(R−B)/(V−min(R,G,B)) if V=B0 if R=G=B
转换之后V和S都是在0-1之间,H是在
0
°
0\\degree
0°到
360
°
360\\degree
360°之间(计算的结果可能小于0,如果小于0就加上360)。
假设要将像素(110, 20, 50)分别对应RGB分量,转换到HSV模型空间中。
(
110
,
20
,
50
)
/
255
⟶
(
0.4314
,
0.0784
,
0.1961
)
V
=
m
a
x
(
0.4314
,
0.0784
,
0.1961
)
=
0.4314
S
=
0.4314
−
m
i
n
(
0.4314
,
0.0784
,
0.1961
)
0.4314
=
0.8183
H
=
60
(
0.0784
−
0.1961
)
0.4314
−
m
i
n
(
0.4314
,
0.0784
,
0.1961
)
≈
−
20
(110, 20, 50) / 255 \\longrightarrow (0.4314, 0.0784, 0.1961) \\\\ \\ \\\\ V = max(0.4314, 0.0784, 0.1961) = 0.4314 \\\\ \\ \\\\ S = \\frac{0.4314-min(0.4314, 0.0784, 0.1961)}{0.4314}=0.8183 \\\\ \\ \\\\ H = \\frac{ 60(0.0784-0.1961)}{0.4314 - min(0.4314, 0.0784, 0.1961)}\\approx -20
(110,20,50)/255⟶(0.4314,0.0784,0.1961) V=max(0.4314,0.0784,0.1961)=0.4314 S=0.43140.4314−min(0.4314,0.0784,0.1961)=0.8183 H=0.4314−min(0.4314,0.0784,0.1961)60(0.0784−0.1961)≈−20
那么转换后的V=0.4314,S=0.8183,由于H小于0所以加上360即H=340
opencv关于HSV模型实验
使用opencv将RGB模型图像转成HSV模型图像非常简单,直接使用cv2.cvtColor
函数,在code参数中传入cv2.COLOR_RGB2HSV
参数即可。 但需要注意一下,通过opencv转HSV后会根据传入的数据类型缩放到不同范围,如果输入的是Uint8类型的数据(一般读入的图片数据类型都是Uint8),默认缩放到0到255之间 。 那么对于饱和度和明度(默认0到1之间)而言直接乘以255然后取整即可。对于色度(默认是在0到360之间)由于超出了Uint8数据类型的范围,所以官方储存时是直接除以2即缩放到0到180之间。参考opencv官方文档:https://docs.opencv.org/master/de/d25/imgproc_color_conversions.html#color_convert_rgb_hsv
那么对于刚刚讲的示例将(110, 20, 50)RGB模型空间转到HSV模型空间得到是(340,0.8183,0.4314),按照刚刚讲的在opencv转换后应该是:
H
:
340
/
2
⟶
170
S
:
0.8183
×
255
⟶
209
V
:
0.4314
×
255
⟶
110
H: 340/2 \\longrightarrow 170 \\\\ S: 0.8183\\times255 \\longrightarrow 209 \\\\ V:0.4314\\times255 \\longrightarrow 110
H:340/2⟶170S:0.8183×255⟶209V:0.4314×255⟶110
使用opencv转换试下看对不对:
import cv2
import numpy as np
rgb = np.array([110, 20, 50], dtype=np.uint8).reshape((1, 1, 3))
hsv = cv2.cvtColor(rgb, cv2.COLOR_RGB2HSV)
print(hsv)
终端打印的结果是[[[170 209 110]]]
,和我们计算的是一样的,说明理解到位。
接下来在使用opencv来固定色度,饱和度,明度其中两个变量,渐变剩下一个变量来看看效果。
固定sat(饱和度)以及val(明度),渐变hue(色度)。从左到右数值从0到180(对应hue中
0
°
0\\degree
0°到
360
°
360\\degree
360°)
import cv2
import numpy as np
hue = np.tile(np.arange(0, 180, dtype=np.uint8).reshape((1, 180, 1)),
(50, 1, 1))
sat= np.ones((50, 180, 1), dtype=np.uint8) * 255
val = np.ones((50, 180, 1), dtype=np.uint8) * 255
img_hsv = cv2.merge((hue, sat, val))
img = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
# img = cv2.resize(img, (720, 100))
cv2.imshow("img", img)
cv2.waitKey(0)
固定hue(色度)以及val(明度),渐变sat(饱和度)。从左到右数值从0到255(对应sat中 0 0 0到 1 1 1,饱和度越来越高)
import cv2
import numpy as np
hue = np.zeros((100, 256, 1), dtype=np.uint8)
sat = np.tile(np.arange(0, 256, dtype=np.uint8).reshape((1, 256, 1)),
(100, 1, 1))
val = np.ones((100, 256, 1), dtype=np.uint8) * 255
img_hsv = cv2.merge((hue, sat, val))
img = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
# img = cv2.resize(img, (720, 100))
cv2.imshow("img", img)
cv2.waitKey(0)
固定hue(色度)以及sat(饱和度),渐变val(明度)。从左到右数值从0到255(对应val中 0 0 0到 1 1 1,明度越来越高)
import cv2
import numpy as np
hue = np.zeros((100, 256, 1), dtype=np.uint8)
sat = np.ones((100, 256, 1), dtype=np.uint8) * 255
val = np.tile(np.arange(0, 256, dtype=np.uint8).reshape((1, 256, 1)),
(100, 1, 1))
img_hsv = cv2.merge((hue, sat, val))
img = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
# img = cv2.resize(img, (720, 100))
cv2.imshow("img", img)
cv2.waitKey(0)
随机增强图像HSV
下面的代码来自之前讲的yolov3 spp
项目(增强方法并不唯一),这
以上是关于HSV模型简介以及利用HSV模型随机增强图像的主要内容,如果未能解决你的问题,请参考以下文章
「新手必看」Python+Opencv实现摄像头调用RGB图像并转换成HSV模型
OpenCV 例程200篇209. HSV 颜色空间的图像分割