深度学习中小知识点系列(五) 解读HSV模型随机增强图像

news2024/11/27 22:23:08

文章目录

  • 图像HSV模型简介
  • RGB模型转HSV模型
  • opencv关于HSV模型实验
  • 随机增强图像HSV

图像HSV模型简介

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

imgimg

如图所示,HSV模型中

  • 色度(Hue)使用角度度量的,范围是从0°到360°(逆时针旋转),比如0°/360°代表红色, 120°代表原谅色,240°代表蓝色。
    hue
  • 饱和度(Saturation)表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高(参考百度)。其范围是0到1。
    sat
  • 明度(Value)颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关。其范围是0(暗)到1(明)。
    val

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 − min ⁡ ( R , G , B ) V i f   V   ≠ 0 0 o t h e r w i s e H = { 60 ( G − B ) / ( V − min ⁡ ( R , G , B ) ) i f   V = R 120 + 60 ( B − R ) / ( V − min ⁡ ( R , G , B ) ) i f   V = G 240 + 60 ( R − B ) / ( V − min ⁡ ( R , G , B ) ) i f   V = B 0 i f   R = G = B . } \begin{gathered} \mathrm{V~=max(R,G,B)} \\ \left.\mathrm{S}=\left\{\begin{matrix}\frac{\mathrm{V}-\min(\mathrm{R},\mathrm{G},\mathrm{B})}{\mathrm{V}}&\quad\mathrm{if~\mathrm{V}~\neq0}\\0&\quad\mathrm{otherwise}\end{matrix}\right.\right. \\ \\ \left.\mathrm{H=\left\{\begin{array}{ll}60(G-B)/(V-\min(R,G,B))&\mathrm{if~V=R}\\120+60(B-R)/(V-\min(R,G,B))&\mathrm{if~V=G}\\240+60(R-B)/(V-\min(R,G,B))&\mathrm{if~V=B}\\0&\mathrm{if~R=G=B}\end{array}\right. .}\right\} \end{gathered} V =max(R,G,B)S={VVmin(R,G,B)0if V =0otherwiseH= 60(GB)/(Vmin(R,G,B))120+60(BR)/(Vmin(R,G,B))240+60(RB)/(Vmin(R,G,B))0if V=Rif V=Gif V=Bif R=G=B.
转换之后V和S都是在0-1之间,H是在 0°到 360°之间(计算的结果可能小于0,如果小于0就加上360)。

假设要将像素(110, 20, 50)分别对应RGB分量,转换到HSV模型空间中。
在这里插入图片描述

那么转换后的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

rgb2hsv

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


固定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到 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随机增强前、后的效果,左图是随机增强前,右图是随机增强后。

LUT(val, lut_val).astype(dtype)
    aug_img = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2BGR)
    return aug_img

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1259446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java研学-集合框架

一 关于集合框架 1 集合是Java提出的用来进行多个数据存储的"容器",数组也具备这样的功能, 2 由于数组一旦创建长度固定,且只能存放一种数据类型,不够灵活,Java提出更灵活,存放任意的数据类型的容器也就是集合 3 集合和数组的异同点 相同点:都是用来存…

西南科技大学数字电子技术实验一(数字信号基本参数与逻辑门电路功能测试及FPGA 实现 )预习报告

手写报告稍微认真点写,80+随便有 目录 一、计算/设计过程 1、通过虚拟示波器观察和测量信号 2、通过实际电路(电阻、开关、发光二极管)模拟逻辑门电路 二、画出并填写实验指导书上的预表

ELK----日志分析

ELK相关知识 ELK的概念与组件 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 E:ElasticSearch (ES) ES是…

智能电表——电源应用

作为智能电网的重要组成部分,智能电表在智能电网中发挥着不可或缺的作用。智能电表是指以智能芯片为核心,通过运用通讯技术以及计算机技术等,能够进行电能计费、电功率的计量和计时,并且能够和上位机进行通讯、用电管理的电度表。…

STK Components 二次开发- 区域

1.创建区域 需要提供点坐标。最少三个点可以确定一个区域。 创建区域也是一样,创建对象然后设置点位置 ,然后设置区域属性。 var referenceSurface m_earth.Shape; // We specify the boundary in terms of nodes connected by geodesics.var result…

PlantUML语法(全)及使用教程-时序图

目录 1. 参与者1.1、参与者说明1.2、背景色1.3、参与者顺序 2. 消息和箭头2.1、 文本对其方式2.2、响应信息显示在箭头下面2.3、箭头设置2.4、修改箭头颜色2.5、对消息排序 3. 页面标题、眉角、页脚4. 分割页面5. 生命线6. 填充区设置7. 注释8. 移除脚注9. 组合信息9.1、alt/el…

卷积神经网络(CNN)识别神奇宝贝小智一伙

文章目录 一、前言二、前期工作1. 设置GPU(如果使用的是CPU可以忽略这步)2. 导入数据3. 查看数据 二、数据预处理1.加载数据2. 可视化数据4. 配置数据集 三、调用官方网络模型四、设置动态学习率五、编译六、训练模型七、模型评估八、保存and加载模型九、…

Linux网络——数据链路层

目录 一.认识以太网 二.以太网帧格式 三.认识MAC地址 四.认识MTU 五.以太局域网的通信原理 六.其他重要协议 1.DNS协议 2.域名简介 3.ICMP协议 4.NAT技术 5.NAT技术的缺陷 6.NAT和代理服务器 一.认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标…

C语言入门---位操作

目录 1. 两个数不同的二进制位个数 2.原码、反码、补码 3.不创建临时变量实现两个数的交换 4.求一个整数存储在内存中的二进制中1的个数 5. 特例-1 6.将指定的位置置1 7.将指定位置置1 8.a与a 9.||与&& 10.逗号表达式 11.srand与rand 12.sizeof 13.结构体初始…

一文了解低代码平台

随着数字化转型的加速,企业需要更快速地开发和交付应用程序,以适应市场需求和客户需求的变化。在这种情况下,低代码平台成为了企业的首选方案之一。 想象一下,你可以用一个可视化工具构建自己的应用程序,而无需编写繁琐…

保护IP地址不被窃取的几种方法

随着互联网的普及和信息技术的不断发展,网络安全问题日益凸显。其中,保护个人IP地址不被窃取成为了一个重要的问题。IP地址是我们在互联网上的身份标识,如果被他人获取,就可能导致个人隐私泄露、计算机受到攻击等一系列问题。因此…

你“瞧不起”的拼多多,原来还有这样的一面

有人说,自私是天性,刻印在基因里的本能。也有人持不同意见。 人类学家玛格丽特米德在授课中问学生,文明最早的标志是什么?有人说是陶罐,石器,或者武器,米德告诉他们,是一根愈合的股…

python scoket 多人聊天室 带界面

前言 本来是为了局域网内能够复制段儿代码方便远程调试用的,ssh当然也可以,当然还是我头脑风暴散发,想到这里了。于是从网上拉了一个,改通之后,留一个备份。 期望还是很好的,以后用来支持ubuntu聊天之类的…

新能源钠离子电池污废水如何处理

钠离子电池作为一种新能源电池,已经展示出了广阔的应用前景。然而,随着其生产和使用规模的不断扩大,对其产生的污废水问题也变得越来越重要。如何处理新能源钠离子电池的污废水,已经成为一个必须解决的问题。 首先,我…

第二十五章 解析cfg文件及读取获得网络结构

网络结构 以YOLOv3_SPP为例 cfg文件 部分,只是用来展示,全部的代码在文章最后 [net] # Testing # batch1 # subdivisions1 # Training batch64 subdivisions16 width608 height608 channels3 momentum0.9 de…

基于STM32 +(NVIC)中断概念应用和控制方案

前言 本次我们学习一下STM32的中断控制器—— NVIC,控制着整个STM32芯片中断相关的功能,它跟Cortex-M3 内核紧密联系,是内核里面的一个外设。 本篇博客大部分是自己收集和整理,借鉴了很多大佬的图片和知识点整理,如有侵…

中科大蒋彬课题组开发 FIREANN,分析原子对外界场的响应

内容一览: 使用传统方法分析化学系统与外场的相互作用,具有效率低、成本高等劣势。中国科学技术大学的蒋彬课题组,在原子环境的描述中引入了场相关特征,开发了 FIREANN,借助机器学习对系统的场相关性进行了很好的描述。…

一文读懂:IOPS、延迟和吞吐量等存储性能指标

各位ICT的小伙伴们大家好呀, 在我们谈存储性能的时候,总会听到IOPS、延迟(Latency)、带宽(Bandwidth)、吞吐量(Throughput)以及响应时间(Response Time)等技…

Lighthouse(灯塔)—— Chrome浏览器强大的性能测试工具

本文浏览器版本参考如下: 一、认识Lighthouse Lighthouse 是 Google 开发的一款工具,用于分析网络应用和网页,收集现代性能指标并提供对开发人员最佳实践的意见。 为 Lighthouse 提供一个需要审查的网址,它将针对此页面运行一连…

Typora+PicGo+Minio搭建博客图床

文章目录 TyporaPicGoMinio搭建博客图床前言什么是图床?为什么需要图床?准备工作一、Typora二、Picgo1. 下载Picgo2. 下载node.js3. 下载minio插件 三、服务器端配置1. 添加端口到安全组2. 使用Docker安装minio3. 配置minio image-20231127175530696四、minio插件配置五、Typ…