图像处理之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
热门推荐
老照片修复,同样有很多市场需求
离岸市场“暗潮涌动” 各路资金正如何影响港股反弹动能?
秋天的使者—蓼花,有关蓼花的诗词,装点着秋天的画卷!
宝宝可以吃芒果吗?解锁芒果喂养的正确姿势!
城市最迟结婚年龄探究:晚婚现象背后的社会经济因素
员工旷工15天失联后讨薪?资深HR手把手教你合规处理全流程
过门石有几种颜色,如何选择最合适的?
中国动力电池产业与技术:2024年回顾
银行的商业电子支付服务如何操作?
上下班途中猝死算不算工伤?一文详解工伤认定标准与处理办法
上下班途中猝死算不算工伤?一文详解工伤认定标准与处理办法
全球航运市场迎来新一轮涨价潮,欧线运价突破4000点创新高
章若楠:从校园美少女到实力派演员的蜕变之路
中国十大最好吃的鸡
如何防止晕车比较有效
异维A酸软胶囊使用指南:剂量、方法与注意事项一文了解
江苏单招公办专科学校排名,附江苏省高职单招学校排名
杜帅:《哪吒2》文化与经济的双赢,如何延续“流量”奇迹?
2025江苏高考难吗排名全国第几 江苏历年高考难度趋势
缅因猫饲养指南:从喂养到训练,打造健康快乐的缅因猫生活
车辆违章罚款不及时缴纳,这些后果你承担得起吗?
交通事故务农误工费标准是多少?
【以案释法】务农老人被撞伤,能否主张误工费?
重塑表达新纪元,AI助力演讲力飞跃
详细解析125cc至500cc摩托车的油耗表现及差距
广州“开四停四”限行攻略:区域图解与常见问题解答
湖北:率先实现车网互动调频 充电桩变身电网稳定器
中药渣的妙用:变废为宝的居家保健指南
广州医科大学附属第三医院:百年传承的妇产科专科医院
网球减肥运动燃脂瘦出完美曲线