gpt4 book ai didi

c++ - C++ 中不同 channel 的 LUT,opencv2

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:51 27 4
gpt4 key购买 nike

几天来,我一直在研究用 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 ),但我找不到实现它的方法。

最佳答案

关键是文档中的这段话:

the table should either have a single channel (in this case the same table is used for all channels) or the same number of channels as in the source array

因此,您必须创建一个多 channel 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;
}

关于c++ - C++ 中不同 channel 的 LUT,opencv2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11503219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com