图像处理之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.rhkb.cn/news/9009.html

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

相关文章

数据结构题目 课时9

题目 1、任何一个带权的无向连通图的最小生成树&#xff08; &#xff09;。 A. 只有一棵 B. 有一棵或多棵 C. 一定有多棵 D. 可能不存在 2、一个赋权网络如下图所示。从顶点 a 开始&#xff0c;用 Prim 算法求出一棵最小生成树。 3、请对下图的无向带权图按克鲁斯卡尔算法求…

Linux之详谈——权限管理

目录 小 峰 编 程 ​编辑 一、权限概述 1、什么是权限 2、为什么要设置权限 3、Linux中的权限类别- 4、Linux中文件所有者 1&#xff09;所有者分类&#xff08;谁&#xff09; 2&#xff09;所有者的表示方法 ① u(the user who owns it)&#xff08;属主权限&…

私有包上传maven私有仓库nexus-2.9.2

一、上传 二、获取相应文件 三、最后修改自己的pom文件

记录 | 基于Docker Desktop的MaxKB安装

目录 前言一、MaxKBStep 1Step2 二、运行MaxKB更新时间 前言 参考文章&#xff1a;如何利用智谱全模态免费模型&#xff0c;生成大家都喜欢的图、文、视并茂的文章&#xff01; MaxKB的Github下载地址 参考视频&#xff1a;【2025最新MaxKB教程】10分钟学会一键部署本地私人专属…

4.flask-SQLAlchemy,表Model定义、增删查改操作

介绍 SQLAlchemy是对数据库的一个抽象 开发者不用直接与SQL语句打交道 Python对象来操作数据库 SQLAlchemy是一个关系型数据库 安装 flask中SQLAlchemy的配置 from flask import Flask from demo.user_oper import userdef create_app():app Flask(__name__)# 使用sessi…

jemalloc 5.3.0的tsd模块的源码分析

一、背景 在主流的内存库里&#xff0c;jemalloc作为android 5.0-android 10.0的默认分配器肯定占用了非常重要的一席之地。jemalloc的低版本和高版本之间的差异特别大&#xff0c;低版本的诸多网上整理的总结&#xff0c;无论是在概念上和还是在结构体命名上在新版本中很多都…

【Elasticsearch】Elasticsearch的查询

Elasticsearch的查询 DSL查询基础语句叶子查询全文检索查询matchmulti_match 精确查询termrange 复合查询算分函数查询bool查询 排序分页基础分页深度分页 高亮高亮原理实现高亮 RestClient查询基础查询叶子查询复合查询排序和分页高亮 数据聚合DSL实现聚合Bucket聚合带条件聚合…

DeepSeek R1有什么不同

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

macbook安装go语言

通过brew来安装go语言 使用brew命令时&#xff0c;一般都会通过brew search看看有哪些版本 brew search go执行后&#xff0c;返回了一堆内容&#xff0c;最下方展示 If you meant "go" specifically: It was migrated from homebrew/cask to homebrew/core. Cas…

文本左右对齐

hello 大家好&#xff01;今天开写一个新章节&#xff0c;每一天一道算法题。让我们一起来学习算法思维吧&#xff01; function fullJustify(words, maxWidth) {// 用于存储最终排版好的每一行文本const result [];// 用于遍历单词数组的索引&#xff0c;初始化为 0let i 0;…

Oracle 创建用户和表空间

Oracle 创建用户和表空间 使用sys 账户登录 建立临时表空间 --建立临时表空间 CREATE TEMPORARY TABLESPACE TEMP_POS --创建名为TEMP_POS的临时表空间 TEMPFILE /oracle/oradata/POS/TEMP_POS.DBF -- 临时文件 SIZE 50M -- 其初始大小为50M AUTOEXTEND ON -- 支持…

树状数组讲解

文章目录 1395.统计作战单位数 树状数组b站博主 灵神博主 tree数组&#xff1a;Tree[i] 存储的是原本的数组中num[i - (i&-i)1]到nums[i]的和 更新的时候&#xff0c;num[i[更新&#xff0c;逐一修改num[i(i & -i)] 307.区间和检索-数组可修改 题目实战 总的代码&#…

PostGIS笔记:PostgreSQL中表、键和索引的基础操作

创建、查看与删除表 在数据库中创建一个表&#xff0c;使用如下代码&#xff1a; create table streets (id serial not null primary key, name varchar(50));这里的表名是streets&#xff0c;id是主键所以非空&#xff0c;采用serial数据类型&#xff0c;这个数据类型会自动…

【JavaEE进阶】图书管理系统 - 壹

目录 &#x1f332;序言 &#x1f334;前端代码的引入 &#x1f38b;约定前后端交互接口 &#x1f6a9;接口定义 &#x1f343;后端服务器代码实现 &#x1f6a9;登录接口 &#x1f6a9;图书列表接口 &#x1f384;前端代码实现 &#x1f6a9;登录页面 &#x1f6a9;…

大数据学习之SCALA分布式语言三

7.集合类 111.可变set一 112.可变set二 113.不可变MAP集合一 114.不可变MAP集合二 115.不可变MAP集合三 116.可变map一 package com . itbaizhan . chapter07 //TODO 2. 使用 mutable.Map 前导入如下包 import scala . collection . mutable // 可变 Map 集合 object Ma…

C++:多继承习题3

题目内容&#xff1a; 声明一个时间类Time&#xff0c;时间类中有3个私有数据成员(Hour&#xff0c;Minute&#xff0c;Second)和两个公有成员函数(SetTime和PrintTime)。要求&#xff1a; &#xff08;1&#xff09; SetTime根据传递的3个参数为对象设置时间&#xff1b; &a…

14-6-2C++STL的list

(一&#xff09;list对象的带参数构造 1.list&#xff08;elem);//构造函数将n个elem拷贝给本身 #include <iostream> #include <list> using namespace std; int main() { list<int> lst(3,7); list<int>::iterator it; for(itlst.begi…

Elasticsearch——Elasticsearch性能优化实战

摘要 本文主要介绍了 Elasticsearch 性能优化的实战方法&#xff0c;从硬件配置优化、索引优化设置、查询方面优化、数据结构优化以及集群架构设计等五个方面进行了详细阐述&#xff0c;旨在帮助读者提升 Elasticsearch 的性能表现。 1. 硬件配置优化 升级硬件设备配置一直都…

Linux进程调度与等待:背后的机制与实现

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 当一个进程发起某种操作&#xff08;如I/O请求、信号、锁的获取等&#xff09;&#xff0c;但该操作需要的资源暂时不可用时&#xff0c;进程会被操作系统挂起&#xff0c;进入“等待队列”或“阻塞状态”。…

【教学类-89-02】20250128新年篇02——姓名藏头对联(星火讯飞+Python,五言对联,有横批)

背景需求&#xff1a; 过年了&#xff0c;我想用幼儿的名字写对联&#xff0c;但是我根本不会写&#xff0c;于是尝试让AI来写。 1.我班的孩子的名字都是2字和3字的 2.惊喜发现&#xff0c;AI它很快就能生成带名字的对联 但是观察发现&#xff0c;如果是二个名字的对联&#…