2

我将 OpenCV 用于我的一些图像处理相关代码。我被困在一个特定的点上。

在特定代码中,我需要根据图像的 CIE L*a*b* 值比较图像的像素值。我知道对于 BGR,我们可以做这样的事情:

// img is the image, suppose
uchar *data = ( uchar* )img->imageData;

for(i=0; i< img->height; i++)
    for(j=0; j<img->width; j++)
     {
         b = data[i*img->widthStep + j*img->nChannels + 0];
         g = data[i*img->widthStep + j*img->nChannels + 1];
         r = data[i*img->widthStep + j*img->nChannels + 2]; 
     }

我的问题是,我们可以为 l*a*b* 颜色模型做类似的事情吗?我的意思是起初我将图像转换为

cvCvtColor(img, lab, CV_BGR2Lab);

然后像上述情况一样访问单个通道信息(因为 L*a*b* 也由 3 个通道组成,如果没有错的话),我们可以获得像素值吗?

我问这个的原因是我试图实现它,但是我得到了一些真正奇怪的值,比如非常高的负数(我使用 int 数据类型而不是 uchar,因为我不确定范围 'a' 和 'b' 可以有),而在维基百科中,我看到“L”的值只能在 0 到 100 的范围内。那么我怎样才能得到这些像素值呢?

提前致谢 !!

4

1 回答 1

2

当然,你可以做到这一点,为什么不呢?但是请注意,输出有些特定(因为a并且b可能是负数):

On output 0≤L≤100, -127≤a≤127, -127≤b≤127
The values are then converted to the destination data type:
    8-bit images:
        L <- L*255/100, a <- a + 128, b <- b + 128

请注意,L它也缩放到 0-255 范围(而不是 0-100)。在这里查看更多。

顺便说一句,如果您的数据类型是无符号字符,您如何获得负数?

于 2012-06-15T02:29:45.750 回答