LUT用于C ++中的不同通道,opencv2

时间:2012-07-16 11:22:24

标签: c++ opencv lookup-tables

我一直在玩用C ++实现的opencv2几天,并注意到查找表是将更改应用到图像的最快方法。但是,我一直在为我的目的使用它们遇到一些麻烦。

下面的代码显示了反转像素值的示例:

bool apply(Image& img) {
   int dim(256);
   Mat lut(1, &dim, CV_8U);
   for (int i=0; i<256; i++)
      lut.at<uchar>(i)= 255-i;
   LUT(img.final,lut,img.final);
   return true;
}

class Image {
public:
   const Mat& original;
   Mat final;
...
};

由于它非常高效,比将每个像素更改一个(通过我自己的测试验证)更有效,我想将此方法用于其他操作。但要做到这一点,我必须分别访问每一层(每种颜色,图片在BGR中)。例如,我想将蓝色更改为255-i,将绿色更改为255-i / 2,将红色更改为255-i / 3.

我一直在网上搜索一段时间,但无法找到正确的解决方案。据我所知,有可能(documentation),但我找不到实现它的方法。

1 个答案:

答案 0 :(得分:5)

关键是文档中的这一段:

  

该表应该具有单个通道(在这种情况下,所有通道使用相同的表)或者与源数组中的通道数相同

因此,您必须创建一个多声道LUT:

bool apply(Image& img) {
   int dim(256);

   Mat lut(1, &dim, CV_8UC(img.final.channels()));

   if( img.final.channels() == 1)
   {
      for (int i=0; i<256; i++)
         lut.at<uchar>(i)= 255-i;
   }
   else // stupid idea that all the images are either mono either multichannel
   {
      for (int i=0; i<256; i++)
      {
         lut.at<Vec3b>(i)[0]= 255-i;   // first channel  (B)
         lut.at<Vec3b>(i)[1]= 255-i/2; // second channel (G)
         lut.at<Vec3b>(i)[2]= 255-i/3; // ...            (R)
      }
   }

   LUT(img.final,lut,img.final); // are you sure you are doing final->final? 
   // if yes, correct the LUT allocation part

   return true;
}