问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

图像处理之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
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号