图像处理之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
热门推荐
唐山大地震48周年:铭记历史,致敬英雄城市
唐山地震后的神秘气象现象揭秘
秋天牛肉正确吃法,搭配它,牛肉软烂入味,味道独特,汁都吃不剩
猪肘的历史文化背景研究
流星雨的奥秘:流星背后到底藏着什么
流星雨要来啦!专家科普流星颜色的奥秘
流星发光发热是因为和地球大气层的摩擦?
走进贵阳市,探寻千面风华,感受万般魅力之旅!
加拿大独立屋设计全解析:Bungalow、一层半与两层楼的优劣对比
秋冬白色西裤搭配指南:从基础款选择到搭配技巧全解析
秋冬复古高腰直筒休闲裤,这样搭最显瘦!
冬季护电瓶,这些小妙招你get了吗?
冬季来临,你的车电瓶准备好了吗?
冬季如何避免汽车电瓶亏电?
冬季汽车电瓶保养秘籍:让爱车不再"趴窝"
婴幼儿流鼻涕怎么治最有效的方法
宝宝红屁屁护理指南:有效解决红屁屁问题
加拿大驾照:不只是驾驶许可,更是重要身份证件
声音手术能选择声音吗?并不能直接选择声音,解析其手术原理、成效、价格等
"大消保"时代的金融消费者权益保护策略与实践
中国的世界地质公园之美
鲁菜经典:锅塌豆腐的历史传承与现代创新
超子美食教你锅塌豆腐绝技!
锅塌豆腐:一道传承百年的营养美味
《林海雪原》的诞生:曲波在齐齐哈尔的创作历程
Sony Android TV USB视频播放全攻略:从入门到精通
从草根到巨星,逆袭之路很励志,王宝强的人脉到底有多广?
加拿大枫叶卡照片攻略:从规格到拍摄全解析
无关年龄,心态年轻才是真谛,21天年轻3.5岁的秘密
昆山自驾一日游攻略路线?最全景点推荐