图像处理之HSV颜色空间

目录

1 RGB 的局限性

2 HSV 颜色空间

3 RGB与HSV相互转换

4 HSV颜色模型对图像的色相、饱和度和明度进行调节

5 演示Demo

5.1 开发环境

5.2 功能介绍

5.3 下载地址

参考


1 RGB 的局限性

        RGB 是我们接触最多的颜色空间,由三个通道表示一幅图像,分别为红色(R),绿色(G)和蓝色(B)。这三种颜色的不同组合可以形成几乎所有的其他颜色。

        RGB 颜色空间是图像处理中最基本、最常用、面向硬件的颜色空间,比较容易理解。

        RGB 颜色空间利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,而且这三个分量是高度相关的,所以连续变换颜色时并不直观,想对图像的颜色进行调整需要更改这三个分量才行。

        自然环境下获取的图像容易受自然光照、遮挡和阴影等情况的影响,即对亮度比较敏感。而 RGB 颜色空间的三个分量都与亮度密切相关,即只要亮度改变,三个分量都会随之相应地改变,而没有一种更直观的方式来表达

        但是人眼对于这三种颜色分量的敏感程度是不一样的,在单色中,人眼对红色最不敏感,蓝色最敏感,所以 RGB 颜色空间是一种均匀性较差的颜色空间。如果颜色的相似性直接用欧氏距离来度量,其结果与人眼视觉会有较大的偏差。对于某一种颜色,我们很难推测出较为精确的三个分量数值来表示。所以,RGB 颜色空间适合于显示系统,却并不适合于图像处理。

2 HSV 颜色空间

        基于上述理由,在图像处理中使用较多的是 HSV 颜色空间,它比 RGB 更接近人们对彩色的感知经验。非常直观地表达颜色的色调、鲜艳程度和明暗程度,方便进行颜色的对比。

        在 HSV 颜色空间下,比 RGB 更容易跟踪某种颜色的物体,常用于分割指定颜色的物体。

        HSV 表达彩色图像的方式由三个部分组成:

  • Hue(色调、色相),相当于基调,是下图的俯视图得到的圆,圆上不同位置的颜色基调不同,把颜色分成了360°,每个位置有不同的颜色基调;

  • Saturation(饱和度、色彩纯净度):纯度,沿着俯视图得到的圆的半径看,因为圆弧上的点代表该处的颜色的基调,那么半径上就是从纯白色到该基调颜色过渡过程中不同位置的纯度,在圆心处纯度为0,在圆弧上(该色调)纯度为100;

  • Value(明度):亮度,沿着圆柱的高来看,圆柱表面上平行于圆柱轴上的点的颜色基调相同,纯度也相同,但是明暗程度不同。同时,该圆柱的半径也不同,相当于磁盘的柱面。

        用下面这个圆柱体来表示 HSV 颜色空间,圆柱体的横截面可以看做是一个极坐标系 ,H 用极坐标的极角表示,S 用极坐标的极轴长度表示,V 用圆柱中轴的高度表示。

  • 色相H:表示色彩信息,即所处的光谱颜色的位置。该参数用一角度量来表示,取值范围为0°~360°。其中0°为红色,60°为黄色,120°为绿色,180°为青色,240°为蓝色,300°为紫色。

  • 饱和度S:表示色彩的纯度,取值范围为0.0~1.0。值越大,纯度越高,接近光谱色的程度也就越高,图像越鲜艳。

  • 明度V:表示色彩的明亮程度,取值范围为0.0(黑色)~1.0(白色)。明度越高,色彩越亮。

3 RGBHSV相互转换

        了解了HSV的颜色特性之后,就可以在实际使用中RGB颜色值转换为HSV颜色值,然后对色相、饱和度和明度进行调整。达到效果需求之后,再转换为RGB值显示在屏幕上保存结果。

        下面使用C语言编程实现RGB与HSV的转换

#include"TRGB2HSV.h"
#include"Commen.h"
#include<stdlib.h>
#include<math.h>void RGB2HSV(unsigned char R, unsigned char G, unsigned char B, float* h, float* s, float * v)
{float min, max;float r = R / 255.0;float g = G / 255.0;float b = B / 255.0;min = MIN2(r,MIN2(g,b));max = MAX2(r,MAX2(g,b));if (max == min)*h = 0;else if (max == r && g >= b)*h = 60.0 * (g - b) / (max - min);else if (max == r && g < b)*h = 60.0 * (g - b) / (max - min) + 360.0;else if (max == g)*h = 60.0 * (b - r) / (max - min) + 120.0;else if (max == b)*h = 60.0 * (r - g) / (max - min) + 240.0; *h = CLIP3(*h, 0, 360);if (max == 0)*s = 0;else*s = (max - min) / max;*v = max;
};void HSV2RGB(float h, float s, float v, unsigned char* R, unsigned char *G, unsigned char *B)
{float q = 0, p = 0, t = 0, f = 0, r = 0, g = 0, b = 0;int hN = 0;if(h == 360)h = 0;if (h < 0)h = 360 + h;hN = (int)((int)h / 60);f = h / 60.0f - hN;p = v * (1.0 - s);q = v * (1.0 - f * s);t = v * (1.0 - (1.0 - f) * s);switch (hN){case 0:r = v;g = t;b = p;break;case 1:r = q;g = v;b = p;break;case 2:r = p;g = v;b = t;break;case 3:r = p;g = q;b = v;break;case 4:r = t;g = p;b = v;break;case 5:r = v;g = p;b = q;break;default:break;}*R = (unsigned char)CLIP3((r * 255.0),0,255);*G = (unsigned char)CLIP3((g * 255.0),0,255);*B = (unsigned char)CLIP3((b * 255.0),0,255);
};

4 HSV颜色模型对图像的色相、饱和度和明度进行调节

/*************************************************
功    能:HSV调整
参    数:srcData     - [输入/输出] 原始图像,格式为32位BGRA格式,执行后修为结果图像width       - [输入] 原始图像宽度height      - [输入] 原始图像高度tride       - [输入] 原始图像的Stride(也就是行字节数width*4)hIntensity  - [输入] h值sIntensity  - [输入] s值vIntensity  - [输入] v值
返    回: 0-成功, 其他-失败.
*************************************************/
int adjustHSV(unsigned char *srcData, int width, int height, int stride, float hIntensity, float sIntensity, float vIntensity)
{int ret = 0;if (srcData == NULL){printf("input image is null!");return -1;}//Processunsigned char R, G, B;float h = 0, s = 0, v = 0;unsigned char* pSrc = srcData;int offset = stride - width * 4;for (int j = 0; j < height; j++){for (int i = 0; i < width; i++){B = pSrc[0];G = pSrc[1];R = pSrc[2];RGB2HSV(R, G, B, &h, &s, &v);h = h + hIntensity > 360 ? h + hIntensity - 360 : h + hIntensity;s = CLIP3(s + sIntensity, 0, 1.0f);v = CLIP3(v + vIntensity, 0, 1.0f);HSV2RGB(h, s, v, &R, &G, &B);pSrc[0] = B;pSrc[1] = G;pSrc[2] = R;pSrc += 4;}pSrc += offset;}return ret;
};

5 演示Demo

5.1 开发环境

  • Windows 10 Pro x64

  • Visual Studio 2015

5.2 功能介绍

        演示程序主界面如下图所示,具有图像读取、显示、保存、显示RGBA值,以及HSV调整、鼠标按键按下显示原图、鼠标按键抬起显示效果图等功能。

原图

效果图(h=26, s=0.12, v=0.16)

5.3 下载地址

        开发环境:

  • Windows 10 pro x64

  • Visual Studio 2015

        下载地址: 图像处理之HSV颜色空间

参考

        图像视频滤镜与人像美颜美妆算法详解. 胡耀武、谭娟、李云夕. 电子工业出版社、2020-07

 

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

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

相关文章

DeepSeek是由杭州深度求索人工智能基础技术研究有限公司(简称“深度求索”)发布的一系列人工智能模型

DeepSeek是由杭州深度求索人工智能基础技术研究有限公司&#xff08;简称“深度求索”&#xff09;发布的一系列人工智能模型&#xff0c;其在知识类任务上展现出了卓越的性能。以下是对DeepSeek的详细介绍&#xff0c;内容虽无法达到10000字&#xff0c;但会尽可能全面且深入地…

【C++高并发服务器WebServer】-9:多线程开发

本文目录 一、线程概述1.1 线程和进程的区别1.2 线程之间共享和非共享资源1.3 NPTL 二、线程操作2.1 pthread_create2.2 pthread_exit2.3 pthread_join2.4 pthread_detach2.5 patch_cancel2.6 pthread_attr 三、实战demo四、线程同步五、死锁六、读写锁七、生产消费者模型 一、…

14-6-1C++STL的list

(一&#xff09;list容器的基本概念 list容器简介&#xff1a; 1.list是一个双向链表容器&#xff0c;可高效地进行插入删除元素 2.list不可以随机存取元素&#xff0c;所以不支持at.(pos)函数与[ ]操作符 &#xff08;二&#xff09;list容器头部和尾部的操作 list对象的默…

在sortablejs的拖拽排序情况下阻止input拖拽事件

如题 问题 在vue3的elementPlus的table中&#xff0c;通过sortablejs添加了行拖拽功能&#xff0c;但是在行内会有输入框&#xff0c;此时拖拽输入框会触发sortablejs的拖拽功能 解决 基于这个现象&#xff0c;我怀疑是由于拖拽事件未绑定而冒泡到后面的行上从而导致的拖拽…

21.Word:小赵-毕业论文排版❗【39】

目录 题目​ NO1.2 NO3.4 NO5.6 NO7.8.9 NO10.11.12 题目 NO1.2 自己的论文当中接收老师的修改&#xff1a;审阅→比较→源文档&#xff1a;考生文件夹&#xff1a;Word.docx→修订的文档&#xff1a;考生文件夹&#xff1a;教师修改→确定→接收→接收所有修订将合并之…

leetcode_链表 876.链表的中间节点

876.链表的中间节点 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。思路&#xff1a;快慢指针&#xff0c;创建两个指针fast和slow&#xff0c;fast指针每次移动两步&#xff0c;slow指针每次移动…

深度学习 DAY3:NLP发展史及早期的前馈神经网络(ANN)及多任务学习

NLP发展史 NLP发展脉络简要梳理如下&#xff1a; 2001 - Neural language models&#xff08;神经语言模型&#xff09; 2008 - Multi-task learning&#xff08;多任务学习&#xff09; 2013 - Word embeddings&#xff08;词嵌入&#xff09; 2013 - Neural networks for NL…

全面了解 Web3 AIGC 和 AI Agent 的创新先锋 MelodAI

不管是在传统领域还是 Crypto&#xff0c;AI 都是公认的最有前景的赛道。随着数字内容需求的爆炸式增长和技术的快速迭代&#xff0c;Web3 AIGC&#xff08;AI生成内容&#xff09;和 AI Agent&#xff08;人工智能代理&#xff09;正成为两大关键赛道。 AIGC 通过 AI 技术生成…

54.数字翻译成字符串的可能性|Marscode AI刷题

1.题目 问题描述 小M获得了一个任务&#xff0c;需要将数字翻译成字符串。翻译规则是&#xff1a;0对应"a"&#xff0c;1对应"b"&#xff0c;依此类推直到25对应"z"。一个数字可能有多种翻译方法。小M需要一个程序来计算一个数字有多少种不同的…

FileReader使用

FileReader : 读取文件内容的api&#xff0c;&#xff0c;&#xff0c;在前端处理上传的文件&#xff0c;&#xff0c;比如预览图片 readAsDataURL(file) &#xff1a; 读取为base64编码的 data urlreadAsText() &#xff1a; 读取为文本readAsArrayBuffer() : 读取为二进制 …

RabbitMQ5-死信队列

目录 死信的概念 死信的来源 死信实战 死信之TTl 死信之最大长度 死信之消息被拒 死信的概念 死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或直接到queue 里了&#xff0c;consumer 从 queue 取出消息进…

JavaScript系列(48)-- 3D渲染引擎实现详解

JavaScript 3D渲染引擎实现详解 &#x1f3ae; 今天&#xff0c;让我们深入探讨JavaScript的3D渲染引擎实现。通过WebGL和现代JavaScript技术&#xff0c;我们可以构建一个功能完整的3D渲染系统。 3D渲染基础概念 &#x1f31f; &#x1f4a1; 小知识&#xff1a;3D渲染引擎的…

10JavaWeb——SpringBootWeb案例01

前面我们已经讲解了Web前端开发的基础知识&#xff0c;也讲解了Web后端开发的基础(HTTP协议、请求响应)&#xff0c;并且也讲解了数据库MySQL&#xff0c;以及通过Mybatis框架如何来完成数据库的基本操作。 那接下来&#xff0c;我们就通过一个案例&#xff0c;来将前端开发、后…

【面试题】 Java 三年工作经验(2025)

问题列表 为什么选择 spring boot 框架&#xff0c;它与 Spring 有什么区别&#xff1f;spring mvc 的执行流程是什么&#xff1f;如何实现 spring 的 IOC 过程&#xff0c;会用到什么技术&#xff1f;spring boot 的自动化配置的原理是什么&#xff1f;如何理解 spring boot 中…

JAVA 接口、抽象类的关系和用处 详细解析

接口 - Java教程 - 廖雪峰的官方网站 一个 抽象类 如果实现了一个接口&#xff0c;可以只选择实现接口中的 部分方法&#xff08;所有的方法都要有&#xff0c;可以一部分已经写具体&#xff0c;另一部分继续保留抽象&#xff09;&#xff0c;原因在于&#xff1a; 抽象类本身…

ResNeSt: Split-Attention Networks论文学习笔记

这张图展示了一个名为“Split-Attention”的神经网络结构&#xff0c;该结构在一个基数组&#xff08;cardinal group&#xff09;内进行操作。基数组通常指的是在神经网络中处理的一组特征或通道。图中展示了如何通过一系列操作来实现对输入特征的注意力机制。 以下是图中各部…

数据收集后台服务概要设计

为了帮助大家设计一个数据指标汇总的后端应用&#xff0c;我将提供一个概要设计和表设计的建议。这个设计将基于常见的数据收集需求&#xff0c;假设你需要收集、存储和汇总来自不同数据源的指标数据。 1. 概要设计 1.1 系统架构 数据收集层&#xff1a;负责从不同数据源&am…

探秘 TCP TLP:从背景到实现

回家的路上还讨论了个关于 TCP TLP 的问题&#xff0c;闲着无事缕一缕。本文内容参考自 Tail Loss Probe (TLP): An Algorithm for Fast Recovery of Tail Losses 以及 Linux 内核源码。 TLP&#xff0c;先说缘由。自 TCP 引入 Fast retrans 机制就是为了尽力避免 RTO&#xf…

设计模式Python版 原型模式

文章目录 前言一、原型模式二、原型模式示例三、原型管理器 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对…

一文大白话讲清楚webpack进阶——5——dev-server原理及其作用

文章目录 一文大白话讲清楚webpack进阶——5——dev-server原理及其作用1. webpack的作用2. dev-server的作用3. dev-server的原理3.1 啥是webpack-dev-middleware3.2 HMR 一文大白话讲清楚webpack进阶——5——dev-server原理及其作用 1. webpack的作用 webpack的作用我们之…