图像处理之HSV颜色空间
创作时间:
作者:
@小白创作中心
图像处理之HSV颜色空间
引用
CSDN
1.
https://m.blog.csdn.net/mickey2007/article/details/145354123
HSV颜色空间是图像处理中常用的一种颜色模型,它比RGB颜色空间更接近人类对颜色的感知方式。本文将详细介绍HSV颜色空间的原理、与RGB颜色空间的转换方法,以及如何使用HSV模型对图像的色相、饱和度和明度进行调节。
RGB的局限性
RGB是最常见的颜色空间,由红色(R)、绿色(G)和蓝色(B)三个通道组成。虽然RGB颜色空间在图像处理中应用广泛,但它存在一些局限性:
- 三个分量高度相关,连续变换颜色时不够直观
- 对亮度敏感,亮度改变会影响所有三个分量
- 人眼对三种颜色的敏感程度不同,导致颜色相似性度量与视觉感知存在偏差
HSV颜色空间
HSV颜色空间通过三个参数来描述颜色:
- 色调(Hue,H):表示颜色的基本类型,范围为0°到360°,其中0°为红色,60°为黄色,120°为绿色,180°为青色,240°为蓝色,300°为紫色。
- 饱和度(Saturation,S):表示颜色的纯度,范围为0.0到1.0。值越大,颜色越纯正。
- 明度(Value,V):表示颜色的亮度,范围为0.0(黑色)到1.0(白色)。
HSV颜色空间通过一个圆柱体来直观表示:
RGB与HSV相互转换
了解HSV的颜色特性后,可以通过编程实现RGB与HSV的转换。以下是C语言实现的示例代码:
#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);
};
HSV颜色模型对图像的色相、饱和度和明度进行调节
HSV颜色空间可以方便地对图像的色相、饱和度和明度进行调节。以下是C语言实现的示例代码:
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;
}
//Process
unsigned 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;
};
演示Demo
演示程序具有图像读取、显示、保存、显示RGBA值,以及HSV调整等功能。以下是部分功能的展示:
原图:
效果图(h=26, s=0.12, v=0.16):
参考文献
- 胡耀武、谭娟、李云夕.《图像视频滤镜与人像美颜美妆算法详解》. 电子工业出版社, 2020-07
热门推荐
二建每年报名时间和考试时间详解:掌握关键节点,不错过重要时刻
辍学的00后都在做什么?他们正以多元姿态绽放青春光彩!
本科毕业后想再读一个专业可以吗?课程免考吗?
Excel区域名(命名区域)的使用方法与技巧
私域用户的黄金运营周期: “T+” 消息线与场景转化策略
男装营销策略有哪些关键要素?
易经占卜的神秘起源与现代应用探讨
盐雾试验原理及标准介绍
樊哙:西汉相国之一,他的一生有着怎样的经历?
你到底是「內向」還是「社交恐懼」?「社交恐懼症」的5項特質!
历届奥运耗资排名:巴黎82亿排第六,东京280亿排第一,那北京呢
超声波清洗机为何能高效除油:原理与应用解析
书籍分类有多重要?一篇文章告诉你
“中国各省家里有多少矿”之江西篇,能源匮乏,但重金属资源天堂
痘坑到底怎么产生的你知道吗?
股票的横盘趋势如何准确判断?这种判断有哪些参考指标?
经济低迷下,德股为何能连创新高
脑炎后认知启航:为孩子的智慧之舟扬帆
HTML Entities
如何合法追债:从沟通到诉讼的全流程指南
如何制定有效的金融投资策略?这些策略在实际操作中会遇到哪些挑战?
神秘矿物之星——钾盐:作用、影响与合理摄取
千年石窟寺如何永葆“青春”
如何选择美国服务器提供商?助你找到适合的托管方案
自然笔记——做大自然的记录者
如何有效引导孩子解决行为问题
工业相机镜头焦距、工作距离、视野等选型的计算
Excel嵌套公式完全指南:从基础到实战
怎么做泡菜最好吃最脆
自动紧急制动系统升级为强标!各国AEBS法规盘点梳理