IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]LAB颜色空间各通道的取值范围

    bendanban发表于 2015-08-28 16:16:05
    love 0

    简介

    LAB颜色空间在计算机视觉中经常被使用,知道L,A,B三个通道的取值范围有一定的意义。

    L∈[0, 100]A∈[−86.1813, 98.2352]B∈[−107.8618, 94.4758]

    OpenCV获取LAB取值范围

    下面是一段实验代码,用于获取LAB的取值范围。

    基本思路是,排列组合所有RGB可能,然后转变成LAB,在所得LAB中求取最大最小值。

    
    #include <iostream>
    #include <vector>
    using namespace std;
    
    #include <opencv2/opencv.hpp>
    using namespace cv;
    
    
    int main(int argc, char** argv){
    
      Mat img(256, 256, CV_32FC3);
    
      vector<float> pv(256);
    
      // pixel color is in [0.f, 1.f];
      for (int t = 0; t < 256; t++){
        pv[t] = t / 255.f;
      }
    
      Mat img_lab;
      vector<Mat> mv;
    
      float min_l = FLT_MAX, max_l = FLT_MIN;
      float min_a = FLT_MAX, max_a = FLT_MIN;
      float min_b = FLT_MAX, max_b = FLT_MIN;
    
      for (int c1 = 0; c1 < 256; c1++){
        for (int c2 = 0; c2 < 256; c2++){
          for (int c3 = 0; c3 < 256; c3++){
            img.at<Vec3f>(c2, c3) = Vec3f(pv[c1], pv[c2], pv[c3]);
          }
        }
    
        cvtColor(img, img_lab, CV_BGR2Lab);
    
        cv::split(img_lab, mv);
        double min_val, max_val;
        cv::Point min_loc, max_loc;
        cv::minMaxLoc(mv[0], &min_val, &max_val, &min_loc, &max_loc); // L
        if (min_l > min_val) min_l = min_val;
        if (max_l < max_val) max_l = max_val;
    
        cv::minMaxLoc(mv[1], &min_val, &max_val, &min_loc, &max_loc); // A
        if (min_a > min_val) min_a = min_val;
        if (max_a < max_val) max_a = max_val;
    
        cv::minMaxLoc(mv[2], &min_val, &max_val, &min_loc, &max_loc); // B
        if (min_b > min_val) min_b = min_val;
        if (max_b < max_val) max_b = max_val;
    
        imshow("test", img);
        waitKey(10);
        cout << "step : " << c1 << endl;
      }
    
      cout << "L [" << min_l << ", " << max_l << "]" << endl;
      cout << "A [" << min_a << ", " << max_a << "]" << endl;
      cout << "B [" << min_b << ", " << max_b << "]" << endl;
    
      return 0;
    }


沪ICP备19023445号-2号
友情链接