OpenCV3 3.4 转换色彩空间

转换颜色表示法

我们常用的数字成像的默认色彩空间是RGB,是通过加色法(红、绿、蓝)三原色组合产生色域很宽的各种颜色。

但RGB并不是感知均匀的色彩空间,可能两种有较大数值差距的颜色看起来非常接近,看起来差别很大。

为解决这个问题,引入具有感知均匀特性的颜色表示法,如Lab、Luv颜色空间。在OpenCV4中,用cv::cvtColor函数即可将原图像转为目标的色彩空间。

//将BGR色彩空间转为Lab色彩空间
cv::cvtColor(image, result, cv::COLOR_BGR2Lab);

//将Lab色彩空间转回BGR色彩空间
cv::cvtColor(result, image2, cv::COLOR_Lab2BGR);

Lab色彩空间

Lab模式是根据国际照明委员会(CIE)在1931年所制定的一种测定颜色的国际标准建立的。于1976年被改进,并且命名的一种色彩模式。Lab颜色模型弥补了RGB和CMYK两种色彩模式的不足。它是一种设备无关的颜色模型,也是一种基于生理特征的颜色模型。

Lab颜色模型由三个要素组成,一个要素是亮度(L),范围是1-100,在使用8位图像时,范围会自动调整为0 ~ 255,a通道和b通道表示色度组建,包含像素的颜色信息,与亮度无关,值为-127 ~ 127,在8位图像下,范围会自动调整为0 ~255。从RGB到Lab会产生舍入误差,并不完全可逆。

Luv色彩空间

Luv是另一种感知均匀的色彩空间,Lab和Luv对亮度通道使用同样的转换公式,但对色度通道使用不同表示法。

上述两种色彩空间都扭曲了RGB的颜色范围,转换都是非线性且计算量巨大的。

GRAY色彩空间

即灰度色彩空间,只有一个通道,从RGB到GRAY再到RGB并不是可逆的,最终得到的彩色图像的三个通道数值相同。
BGR2GRAY转换原理

GRAY = B * 0.114 + G * 0.587 + R * 0.299

GRAY2BGR转换原理(其中A表示不透明度,0为完全透明)

R = G = B = GRAY; A = 0;

HSV色彩空间

HSV色彩空间是一种直觉色彩空间,由三个通道:色调(hue)、饱和度(saturation)、亮度(brightness,value) 组成。

色调表示主色,我们使用的颜色名称(如绿色、黄色、红色)对应不同的色调值。色调通常用0 ~ 360的角度来表示,对应圆锥面的旋转角度。对于8位图像,OpenCV把角度除以2。其中红色是0度,绿色为120度,蓝色为240度,转到360度又回到红色。有一点要特别注意,如果颜色的饱和度很低,计算出的色调不可靠。

饱和度表示颜色的鲜艳程度,柔和的颜色饱和度较低,而彩虹的颜色饱和度很高。饱和度也可理解为颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。

OpenCV中用下面的公司来计算饱和度,基于BGR组件的最小值和最大值。其原理是,灰度的B、G、R成分相等,饱和度为0,下面公式得到的饱和度范围为0 ~ 1,对于8位图像,最终OpenCV会将饱和度调节成一个0 ~ 255的值。

在这里插入图片描述

值得注意的是,由于像(0,0,1)这样的组合会得到1的饱和度,黑色区域计算得到的饱和度是不可靠的,

亮度表示某种颜色的光亮程度,对于光源色,明度值与发光体的光亮度有关;通常取值范围为0%(黑)到100%(白)。

在这里插入图片描述
HSV色彩空间通常可以用一个圆锥体来表示,圆锥体内部的每个点代表一种特定的颜色,角度位置表示颜色的色调,到中轴线的距离表示饱和度,高度表示亮度。


我们可以人为生成一幅图像,说明色调/饱和度的组合。

void showHueSaturation()
{
    cv::Mat hs(128, 360, CV_8UC3);
    cv::cvtColor(hs, hs, cv::COLOR_BGR2HSV);
    for (int h = 0; h < 360; h++)
    {
        for (int s = 0; s < 128; s++)
        {
            hs.at<cv::Vec3b>(s, h)[0] = h / 2;       //色调从左到右从0增加到180
            hs.at<cv::Vec3b>(s, h)[1] = 255 - s * 2; //饱和度从上到下从255减小到0
            hs.at<cv::Vec3b>(s, h)[2] = 255;         //亮度均为255

        }
    }
    cv::cvtColor(hs, hs, cv::COLOR_HSV2BGR);

    cv::imshow("hs", hs);
}

在这里插入图片描述


可以通过修改图像的亮度通道,实现特殊的效果。

void valuefull()
{
    cv::Mat dva = cv::imread("newdva.jpg");
    cv::cvtColor(dva, dva, cv::COLOR_BGR2HSV);
    std::vector<cv::Mat> images;
    //分别将色调、饱和度、亮度放进vector
    cv::split(dva, images);
    cv::imshow("hue", images[0]);
    cv::imshow("saturation", images[1]);
    cv::imshow("value", images[2]);
    //将亮度均设为最大
    images[2] = 255;
    cv::Mat result;
    cv::merge(images, result);
    cv::cvtColor(result, result, cv::COLOR_HSV2BGR);
    cv::imshow("result", result);
}

在这里插入图片描述

XYZ色彩空间

XYZ色彩空间是一种标准色彩空间,与设备无关。从RGB到XYZ之间的转换是线性的,其中Y通道对应图像的灰度版本。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值