我正在使用opencv来处理某个图像处理代码。我需要从某张图片中提取颜色图层。所以我所做的是保持像素具有一定值并将剩余像素设置为背景颜色(在这种情况下为白色)。对于某些问题,我必须在CIE-L * a * b *颜色空间中执行整个操作。当我将上面的图像转换为RGB时出现问题,使用cvCvtColor()
背景不再保持白色。我试过不同的排列和值的组合,但它要么变成红色或蓝色,要么变成纯白色。
我甚至用油漆(只是白色)制作了一张照片并将其转换为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);
任何帮助都将受到高度赞赏。提前谢谢!
答案 0 :(得分:2)
粗略总结评论:
在L * a * b *中,值通常是[0,100],“a”和“b”是有符号的,没有明确定义的边界。对于8位图像的opencv,值的转换如下:
在CIELab中,“白色”大致表示为(100,0,0),通过该变换变为(255,128,128)。如果使用32位浮点图像,则不需要最后一次转换,可以使用(100.0,0.0,0.0)白色。