图像处理之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
热门推荐
"原来你是这样的警察!":用漫画打破警察的刻板印象
熬夜之后迅速恢复精力的妙法
红楼梦中最可怕的丫头——探讨其角色与影响
体重与健康丨16+8减肥法
快来江西追星星!这些绝美星空你见过吗?
为什么要买全画幅相机 全画幅相机比半画幅相机到底强在哪
机器学习中的相似性度量方法:闵可夫斯基距离
粤S注意!春运将至,东莞这些路段预计会拥堵
截肢术后的康复
如何进行多元化投资
丝绸:蚕丝编织的灿烂文化
帮东北虎修指甲,给梅花鹿接生!她这份工作很“生猛”!
“二进制”“四进制”“八进制”“十进制”谁会是数据存储界的最强王者?
买房贷款利息计算标准,月供计算公式
制作笔录法条:法律实务中的重要性与实践技巧
三国群英传7天骑兵隐藏兵种的实战攻略与获取指南
恭王府:历史与文化的深度交融
鲜于姓的起源与发展:鲜于氏家族历史、文化与名人
春晚第一波流量强势抵达无锡:非遗文创卖爆单,景区迎来“春运式”客流
鸡眼会自愈吗?医生解析鸡眼自愈可能性及预防复发方法
西安市职工医保个人账户划入标准及使用指南
新手投资黄金哪种方式更好?
细菌VS病毒:结构差异与应对方法全解析
瑞士冬季旅游攻略:圣诞集市,滑雪,溜冰,小火车,温泉
什么是SaaS跨境支付?
证据不足民事案件怎么处理的
影响压滤机过滤效果的几大因素
“蟹”了bro!螃蟹食用指南
行星系统的边界:柯伊伯带与奥尔特云的发现
《狗与犬:揭秘吉凶说法之谜》