c - 使用 opencv 将 CIE L*a*b* 中的白色表示为 RGB 转换

标签 c opencv rgb color-space

我正在使用 opencv 来执行某些图像处理代码。我需要从某张图片中提取颜色层。所以我所做的就是保持像素具有一定的值,并将剩余的像素设置为背景颜色(在本例中为白色)。对于某些问题,我必须在 CIE-L*a*b* 色彩空间中执行整个操作。当我使用 cvCvtColor() 将上面的图像转换为 RGB 时,背景不再保持白色,问题就出现了。我尝试过不同的值排列和组合,但它要么变成红色,要么变成蓝色,要么变成任何东西,但不是纯白色。

我什至用油漆(只是白色)制作了一张图片,并将其转换为 L*a*b* 空间,并将值打印在文本文件中。这是代码

IplImage *image, *lab;
uchar *data;
FILE *fp;
int i, j;
image = cvLoadImage( "white.png", CV_LOAD_IMAGE_UNCHANGED);
lab = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, 3);
cvCvtColor(image, lab, CV_BGR2Lab);
data = (uchar*)lab->imageData;
fp= fopen("white.txt", "w");
for(i=0; i<lab->height; i++)
         for(j=0; j<lab->width; j++)
                  fprintf(fp, "L = %d, a = %d, b = %d\n", data[i*lab->widthStep + j*lab->nChannels +0], data[i*lab->widthStep + j*lab->nChannels +0], data[i*lab->widthStep + j*lab->nChannels +0]);

它显示所有三个值都是255。但是当我在所需的程序中将像素值设置为它时,它变得微红。

这是设置像素值的代码片段

image = cvLoadImage( "pic11.png", CV_LOAD_IMAGE_UNCHANGED);
cvCvtColor(image, lab, CV_BGR2Lab);

copy = cvCreateImage(cvSize(lab->width,lab->height), IPL_DEPTH_8U, 3);
cvCopy(lab, copy, NULL);
data2 = (uchar*)copy->imageData;    

copied = cvCreateImage(cvSize(copy->width,copy->height), IPL_DEPTH_8U, 3);
data = (uchar*)copied->imageData;

for(i=x; i<copy->height; i++)
          for(j=y; j<copy->width; j++)
          {        
                   if(data2[i*copy->widthStep + j*copy->nChannels + 0] == r &&
                      data2[i*copy->widthStep + j*copy->nChannels + 1] == g &&
                      data2[i*copy->widthStep + j*copy->nChannels + 2] == b)
                   {
                           data[i*copy->widthStep + j*copy->nChannels + 0] = r;
                           data[i*copy->widthStep + j*copy->nChannels + 1] = g;
                           data[i*copy->widthStep + j*copy->nChannels + 2] = b;
                   }
                   else
                   {
                       data[i*copy->widthStep + j*copy->nChannels + 0] = 255;
                       data[i*copy->widthStep + j*copy->nChannels + 1] = 255;
                       data[i*copy->widthStep + j*copy->nChannels + 2] = 255;
                   }
          }

copy_im = cvCreateImage(cvSize(copied->width,copied->height), IPL_DEPTH_8U, 3);
cvCvtColor(copied, copy_im, CV_Lab2BGR);
cvSaveImage("copy.jpg", copy_im);

任何帮助将不胜感激。提前致谢!

最佳答案

粗略总结一下评论:

在 L*a*b* 中,值通常为 [0,100],并且“a 和”b” 带符号,没有明确定义的边界。在 opencv 中,8 位图像的值转换如下:

  • L <- L * 255/100
  • 一个<-a+128
  • b <- b+128

在 CIELab 中,“白色”大致表示为 (100,0,0),通过该变换变为 (255,128,128)。如果您使用 32 位浮点图像,则不需要最后一次转换,您可以使用 (100.0,0.0,0.0) 作为白色。

关于c - 使用 opencv 将 CIE L*a*b* 中的白色表示为 RGB 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11288568/

相关文章:

c - C 中的 MagickConstituteImage() 段错误

使用 gstreamer 0.10 更改时钟显示的文本

c++ - 用mingw编译opencv3.1

c++ - Opencv Mat结构坐标

javascript - 如何确定颜色的感知亮度?

c++ - 由于 C 和 C++ 中的序列点,您遇到过哪些问题?

c程序不等待输入

opencv - openCV安装/库问题

c++ - 如何获取鼠标在桌面上的像素的 RGB 值? (GetPixel 不符合这一点......)

java - 我怎么知道图像是 RGB 还是 BGR 格式?