HSV转RGB

RGB是非常常用的颜色模型,然而使用RGB实现颜色和亮度这两个正交分量的同时编码,显然是非常困难的。除了RGB,此外还有HSV/SHB,HSL等颜色编码方案满足不同的需求,其中,HSV非常契合实现颜色和亮度的同时编码的需求。参考:http://colorizer.org/
HSV/SHB模型中,H代表颜色,取值范围为0-360,相当于一个时钟转一圈,0和360对应同一种颜色,S为颜色饱和度,describes how white the color is。V为亮度。S,V取值从 0100
在实际应用中,根据深度信息直接编码S,根据亮度直接编码V,饱和度直接取100。由于S代表的颜色从0-360循环,从0-360范围内存在红-蓝-红的过程,因此考虑只取红-蓝这一段,大概对应着0-256这个范围。然后需要将HSV颜色转换为RGB颜色进行图像显示,这里给出一个已经调试通过的代码。基本原理是:

1,亮度与RGB能达到的最大值成正比,为2.55倍关系。

2,饱和度从100每减一,RGB能达到的最小值从0到亮度设定的最大值线性增大1/100份.

3,根据H的变化分为6种情况,在每一种情况中,对RBG中一个参量在RGB能达到的最小值和最大值间进行线性变换(增大或减小).

void HSVtoRGB(unsigned char *r, unsigned char *g, unsigned char *b, int h, int s, int v)
{
    // convert from HSV/HSB to RGB color
    // R,G,B from 0-255, H from 0-260, S,V from 0-100
    // ref http://colorizer.org/

    // The hue (H) of a color refers to which pure color it resembles
    // The saturation (S) of a color describes how white the color is
    // The value (V) of a color, also called its lightness, describes how dark the color is

    int i;


    float RGB_min, RGB_max;
    RGB_max = v*2.55f;
    RGB_min = RGB_max*(100 - s)/ 100.0f;

    i = h / 60;
    int difs = h % 60; // factorial part of h

    // RGB adjustment amount by hue 
    float RGB_Adj = (RGB_max - RGB_min)*difs / 60.0f;

    switch (i) {
    case 0:
        *r = RGB_max;
        *g = RGB_min + RGB_Adj;
        *b = RGB_min;
        break;
    case 1:
        *r = RGB_max - RGB_Adj;
        *g = RGB_max;
        *b = RGB_min;
        break;
    case 2:
        *r = RGB_min;
        *g = RGB_max;
        *b = RGB_min + RGB_Adj;
        break;
    case 3:
        *r = RGB_min;
        *g = RGB_max - RGB_Adj;
        *b = RGB_max;
        break;
    case 4:
        *r = RGB_min + RGB_Adj;
        *g = RGB_min;
        *b = RGB_max;
        break;
    default:        // case 5:
        *r = RGB_max;
        *g = RGB_min;
        *b = RGB_max - RGB_Adj;
        break;
    }
}

转载来源:http://blog.youkuaiyun.com/u013701860/article/details/51997932

在OpenCV中,Hue Saturation Value (HSV)是一种色彩空间模型,用于描述颜色,而Red Green Blue (RGB)则是另一种常用的色彩模型,它们通常用于显示器显示。将HSV换为RGB涉及到从色调、饱和度和值这三个HSV通道获取对应的红色、绿色和蓝色分量。 以下是一个简单的步骤: 1. **读取HSV图像**:首先,你需要使用`cv2.cvtColor()`函数将输入图像从BGR(默认的OpenCV颜色空间)换到HSV颜色空间。 ```python import cv2 hsv_image = cv2.cvtColor(original_BGR_img, cv2.COLOR_BGR2HSV) ``` 2. **分离HSV通道**:然后你可以通过索引来访问HSV的三个通道:Hue(0-179),Saturation(0-255),Value(0-255)。 3. **换为RGB**:在OpenCV中,直接将HSV换为RGB不是直接操作,因为每个HSV颜色对应的颜色在RGB中可能有多种可能性。你需要创建一个查找表(LUT)或编写算法来确定每个HSV值对应的最佳RGB组合。这是一个常见的自定义过程,需要预先定义规则或查找表。 4. **构建RGB图像**:利用计算得到的RGB分量,你可以用`numpy`数组创建一个新的RGB图像。 ```python # 示例中的换可能需要用到一些数学和色彩理论知识,这里假设有一个预定义的映射函数map_hsv_to_rgb rgb_image = map_hsv_to_rgb(hsv_image) ``` 请注意,实际的映射函数可能相当复杂,尤其是对于非常特定的应用需求。如果没有现成的映射,你可能需要使用更高级的技术,如插值或机器学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值