HSV模型简介以及利用HSV模型随机增强图像

HSV模型简介以及利用HSV模型随机增强图像文章目录图像 HSV 模型简介 RGB 模型转 HSV 模型 opencv 关于 HSV 模型实验随机增强图像 HSV 图像 HSV 模型简介 HSV Hue Saturation Value 是根据颜色的直观特性由 A R

大家好,欢迎来到IT知识分享网。


图像HSV模型简介

HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)(参考百度)。在HSV模型中,颜色是由色度(Hue),饱和度(Saturation),明度(Value)共同组成。


HSV模型简介以及利用HSV模型随机增强图像

HSV模型简介以及利用HSV模型随机增强图像

如图所示,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°代表蓝色。
    hue
  • 饱和度(Saturation)表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高(参考百度)。其范围是0到1。
    sat
  • 明度(Value)颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关。其范围是0(暗)到1(明)。
    val

RGB模型转HSV模型


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

rgb2hsv那么对于刚刚讲的示例将(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/2170S:0.8183×255209V:0.4314×255110
使用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]]],和我们计算的是一样的,说明理解到位。

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


固定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) 

sat


固定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) 

val


随机增强图像HSV

下面的代码来自之前讲的yolov3 spp项目(增强方法并不唯一),这里结合以上讲的知识进行简单讲解。

  • 首先传入图像img以及三个超参数h_gain,s_gain,v_gain
  • 使用np.random.uniform增对h,s,v分别随机生成了一个[-1, 1]之间的随机数,然后分别乘上传入的h_gain,s_gain,v_gain,最后加上1。假设h_gain=0.5那么会在[0.5, 1.5]之间随机生成一个倍率因子,后面会将所有hue数值乘上这个倍率。s_gain,v_gain同理不再赘述。
  • 使用cv2.cvtColor函数将传入的图片由BGR格式(opencv读取图片的默认格式是BGR)转成HSV,在使用cv2.split函数将HSV分量分开分别赋值给hue, sat, val
  • 分别针对hue, sat以及val生成对应的Look-Up Table(LUT)查找表(记录变换前后数值的对应表)。就是将0-255范围内所有的数值都乘以刚刚生成的随机倍率因子构建LUT,后面针对每个元素直接查表无需再计算。注意,hue范围是在0到180之间的,所以有个取余的操作%180,sat和val范围是0到255之间,所以使用np.clip防止越界。
  • 使用cv2.LUT方法利用刚刚针对hue, sat以及val生成的Look-Up Table进行变换。变换后使用cv2.merge方法再将hue, sat以及val分量合并个hsv图像。
  • 最后使用cv2.cvtColor再将hsv图像转换回bgr图像。
import cv2 import numpy as np def augment_hsv(img, h_gain=0.5, s_gain=0.5, v_gain=0.5): r = np.random.uniform(-1, 1, 3) * [h_gain, s_gain, v_gain] + 1 # random gains hue, sat, val = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV)) dtype = img.dtype # uint8 x = np.arange(0, 256, dtype=np.int16) lut_hue = ((x * r[0]) % 180).astype(dtype) lut_sat = np.clip(x * r[1], 0, 255).astype(dtype) lut_val = np.clip(x * r[2], 0, 255).astype(dtype) img_hsv = cv2.merge((cv2.LUT(hue, lut_hue), cv2.LUT(sat, lut_sat), cv2.LUT(val, lut_val))).astype(dtype) aug_img = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR) return aug_img 

下图是调用augment_hsv随机增强前、后的效果,左图是随机增强前,右图是随机增强后。

aug

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/128885.html

(0)
上一篇 2025-08-28 15:45
下一篇 2025-08-28 16:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信