zoukankan      html  css  js  c++  java
  • OpenCV颜色空间——HLS颜色空间

    引自:http://blog.csdn.net/zhangping1987/article/details/73699335

    HLS颜色模型

    HLS颜色空间,三个分量分别是色相(H)、亮度(L)、饱和度(S),这三个分量进行数字化处理,取值范围为:

    模型可以通过以下两幅图像理解(来自维基百科)

              

    调节L分量,观察效果

    从上图种可以看出,我们固定一个颜色(H),那么随着饱和度(S,Chroma)的增加,颜色越来越深,OpenCV通过定义函数cvtColor实现BGR颜色空间向HLS颜色空间的转换,使用该函数时,最好将输入图像的BGR值归一到[0,1]范围,可以通过调节亮度(L分量)观察L造成的影响:

    #include<opencv2/core.hpp>
    #include<opencv2/imgproc.hpp>
    #include<opencv2/highgui.hpp>
    using namespace cv;
    #include<string>
    using namespace std;
    //颜色显示
    Mat colorMap;
    //H的取值范围[0,360]
    int H = 180;
    int MAX_H = 360;
    //L的取值范围[0,1]
    int L = 0;
    int MAX_L = 255;//可以自定义设定
    //S的取值范围[0,1]
    int S = 0;
    int MAX_S = 255;
    //颜色显示窗口
    string showColor = "H-S";
    //回调函数
    void callback(int, void*);
    int main(int argc, char*argv[])
    {
        colorMap.create(Size(MAX_S + 1, MAX_H + 1), CV_32FC3);
        //命名窗口
        namedWindow(showColor, WINDOW_GUI_EXPANDED);
        //调节 V 分量
        createTrackbar("L分量", showColor, &L, MAX_L, callback);
        waitKey(0);
        return 0;
    }
    void callback(int, void*)
    {
        for (int h = 0; h < MAX_H + 1; h++)
        {
            for (int s = 0; s < MAX_S + 1; s++)
            {
                colorMap.at<Vec3f>(h, s) = Vec3f(h, L / float(MAX_L), s / float(MAX_S));
            }
        }
        //颜色空间的转换
        cvtColor(colorMap, colorMap, COLOR_HLS2BGR);
        //显示颜色
        imshow(showColor, colorMap);
    }

    上述程序的运行界面如下,通过调节L分量,观察其效果:

     

    可以发现随着L的增大,所有的颜色逐渐消失,显示为白色,符合模型。

    调节S分量观察其效果

    #include<opencv2/core.hpp>
    #include<opencv2/imgproc.hpp>
    #include<opencv2/highgui.hpp>
    using namespace cv;
    #include<string>
    using namespace std;
    //颜色显示
    Mat colorMap;
    //H的取值范围[0,360]
    int H = 180;
    int MAX_H = 360;
    //L的取值范围[0,1]
    int L = 0;
    int MAX_L = 255;//可以自定义设定
    //S的取值范围[0,1]
    int S = 0;
    int MAX_S = 255;
    //颜色显示窗口
    string showColor = "H-L";
    //回调函数
    void callback(int, void*);
    int main(int argc, char*argv[])
    {
        colorMap.create(Size(MAX_L + 1, MAX_H + 1), CV_32FC3);
        //命名窗口
        namedWindow(showColor, WINDOW_GUI_EXPANDED);
        //调节 V 分量
        createTrackbar("S分量", showColor, &S, MAX_S, callback);
        waitKey(0);
        return 0;
    }
    void callback(int, void*)
    {
        for (int h = 0; h < MAX_H + 1; h++)
        {
            for (int l = 0; l < MAX_L + 1; l++)
            {
                colorMap.at<Vec3f>(h, l) = Vec3f(h, l / float(MAX_L), S / float(MAX_S));
            }
        }
        //颜色空间的转换
        cvtColor(colorMap, colorMap, COLOR_HLS2BGR);
        //显示颜色
        imshow(showColor, colorMap);
    }

    运行结果如下:

      

    可以发现S很小时,几乎看不到颜色,随着S的增大,颜色信息也越来越明显。

    通过上面显示的图谱可以看出,可以通过分割H分量,确定颜色。

    调节H分量

    #include<opencv2/core.hpp>
    #include<opencv2/imgproc.hpp>
    #include<opencv2/highgui.hpp>
    using namespace cv;
    #include<string>
    using namespace std;
    //颜色显示
    Mat colorMap;
    //H的取值范围[0,360]
    int H = 180;
    int MAX_H = 360;
    //L的取值范围[0,1]
    int L = 0;
    int MAX_L = 255;//可以自定义设定
    //S的取值范围[0,1]
    int S = 0;
    int MAX_S = 255;
    //颜色显示窗口
    string showColor = "L-S";
    //回调函数
    void callback(int, void*);
    int main(int argc, char*argv[])
    {
        colorMap.create(Size(MAX_S + 1, MAX_L + 1), CV_32FC3);
        //命名窗口
        namedWindow(showColor, WINDOW_GUI_EXPANDED);
        //调节 H 分量
        createTrackbar("H分量", showColor, &H, MAX_H, callback);
        callback(0, 0);
        waitKey(0);
        return 0;
    }
    void callback(int, void*)
    {
        for (int l = 0; l < MAX_L + 1; l++)
        {
            for (int s = 0; s < MAX_S + 1; s++)
            {
                colorMap.at<Vec3f>(l, s) = Vec3f(H, l / float(MAX_L), s / float(MAX_S));
            }
        }
        //颜色空间的转换
        cvtColor(colorMap, colorMap, COLOR_HLS2BGR);
        //显示颜色
        imshow(showColor, colorMap);
    }
    效果如下:
      
    观察到L很大或者很小时,H的变换颜色值的变化非常小
  • 相关阅读:
    vim使用笔记
    想象的天空
    修电脑记
    反编译 Component重要类,全文解释 - 组件篇
    被动扫描和主动处理的比较
    第一次运行起来XAML
    学习 Aero 随笔
    Google AdSense 申请已得到批准
    延迟加载的一般实现
    看见几篇文章,收藏一下。
  • 原文地址:https://www.cnblogs.com/Anita9002/p/7156437.html
Copyright © 2011-2022 走看看