【问题标题】:OpenCV CV_RGB2Lab issuesOpenCV CV_RGB2Lab 问题
【发布时间】:2014-05-20 06:33:43
【问题描述】:

我现在在使用 opencv 的 CV_RGB2Lab 函数时遇到问题。我正在针对this site 运行一个示例,由于某种原因,我得到的值与我在该网站上得到的值不同。以前有人遇到过这个问题吗?下面是我正在谈论的测试用例。抱歉,如果这不是初始化矩阵的最佳方式。

void testLabConversion() {
  cv::Mat image(2, 2, CV_32FC3); // Temp Mat variable
  std::vector<cv::Mat> rgb_planes;           // Split along the channels
  split(image, rgb_planes);

  rgb_planes[0].at<float>(0,0) = 250; rgb_planes[1].at<float>(0,0) = 150; rgb_planes[2].at<float>(0,0) = 210;
  rgb_planes[0].at<float>(0,1) = 111; rgb_planes[1].at<float>(0,1) = 203; rgb_planes[2].at<float>(0,1) =  73;
  rgb_planes[0].at<float>(1,0) = 255; rgb_planes[1].at<float>(1,0) = 254; rgb_planes[2].at<float>(1,0) = 253;
  rgb_planes[0].at<float>(1,1) =   0; rgb_planes[1].at<float>(1,1) =   1; rgb_planes[2].at<float>(1,1) = 250;

  merge(rgb_planes, image); // Merge the channels back together.

  cv::Mat lab;
  cv::cvtColor(image, lab, CV_RGB2Lab);        // Convert to Lab format
  split(lab, rgb_planes);

  cv::Mat compare(2, 2, CV_32FC3); // Temp Mat variable
  std::vector<cv::Mat> comp_planes;           // Split along the channels
  split(compare, comp_planes);

  comp_planes[0].at<float>(0,0) = 74.05513399632304; comp_planes[1].at<float>(0,0) =  45.378087487482844; comp_planes[2].at<float>(0,0) = -14.622711663587662;
  comp_planes[0].at<float>(0,1) = 73.91543571217753; comp_planes[1].at<float>(0,1) =  -50.51869054958624; comp_planes[2].at<float>(0,1) =   54.66579060349854;
  comp_planes[0].at<float>(1,0) = 99.70362552637009; comp_planes[1].at<float>(1,0) = 0.16050508518777873; comp_planes[2].at<float>(1,0) =  0.5824734325686975;
  comp_planes[0].at<float>(1,1) = 31.63288764075348; comp_planes[1].at<float>(1,1) =   77.86147327459526; comp_planes[2].at<float>(1,1) = -106.17348604606846;

  for (int i=0;i<3;++i)
    for (int j=0;j<2;++j)
      for (int k=0;k<2;++k)
        TS_ASSERT_DELTA(comp_planes[i].at<float>(j,k), rgb_planes[i].at<float>(j,k), 1e-6);
}

【问题讨论】:

标签: c++ opencv


【解决方案1】:

问题在于如何指定 RGB 颜色。在 openCV 中,使用 CV_32F 格式的 RGB 颜色定义在 0-1 范围内,而 CV_8U 在 0-255 范围内。所以如果你这样做:

...
merge(rgb_planes, image); // Merge the channels back together.
image = (1.0/255.0) * image;
...

然后你会得到正确的结果。所有这些规范都可以在 cvtColor 函数文档here 中找到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-27
    • 2021-01-02
    • 2013-01-19
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2021-04-07
    相关资源
    最近更新 更多