2012-06-15 52 views
2

我正在使用OpenCV处理一些与图像处理相关的代码。我被困在一个特定的点。在CIE L * a * b *色彩空间中访问像素信息

在一个特定的代码中,我需要根据它的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 *颜色模型也相似的地方?我的意思是在第一I由

cvCvtColor(img, lab, CV_BGR2Lab); 

转换图像,然后访问像在上述情况下,个别信道信息(因为L * A * B *也由3个信道,如果是没有错),可以我们得到像素值

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

在此先感谢!

回答

2

当然,你可以这样做,为什么不呢?要知道但是,输出是有些特定的(因为ab可以是负的):

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)。查看更多here

顺便说一句如果你的数据类型是unsigned char怎么能得到负数?

+0

哎呀!对不起,我忘了提及我使用int数据类型,因为我不确定值“a”和“b”的范围可以。所以... 但是,既然你给了特定的范围,现在对我来说实现它变得更加容易。非常感谢 !! – Koustav

+0

在OpenCV中这种类型的转换不支持16位(至少根据我提供的链接),也许这也是问题所在? –

+0

您提供的链接非常有帮助。现在我可以在这里和那里做一些调整,以获得我想要的。所以我想这个排序,直到一些新的错误再次出现。谢啦..!! 下一个工作是集群,所以我想很快会发布另一个问题:P – Koustav