0

我正在尝试使用 C++ 中的 openCV 加载 CIE L a b* 图像。在线我只能找到加载 RGB 图像并将其转换为 LAB 图像的示例,但我已经有了 LAB 图像,那么如何加载它并访问 L、a 和 b 的值?

我发现的唯一方法是加载 LAB 图像,将其视为 RGB 图像,并使用以下方法将其转换为 Lab 图像:

cvtColor(source, destination, CV_BGR2Lab);

但我认为这不是解决问题的好方法,因为如果我这样做,转换后的图像看起来与原始图像非常不同。

使用测试图像和以下代码:

    originalImage = imread(originalImagePath, CV_LOAD_IMAGE_UNCHANGED);
    cout << originalImage.type() << endl;
    Mat originalImageSplitted[3]; 
    split(originalImage, originalImageSplitted);
    cout << originalImageSplitted[0] << endl;
    cout << originalImageSplitted[1] << endl;
    cout << originalImageSplitted[2] << endl;

我得到结果:

0
[]
[]
[]
4

3 回答 3

2

不是一个真正的答案,但太多的评论。

您可以在 Linux、macOS 或 Windows 的终端中使用ImageMagick制作 Lab colourspace TIF 文件进行测试:

convert -depth 8 xc:black xc:white xc:red xc:lime xc:blue +append -colorspace Lab result.tif

如果我放大它,它看起来像这样,因为它目前只有 5 像素宽和 1 像素高:

在此处输入图像描述

然后,您可以转储像素以查看它们的值,并希望弄清楚OpenCV正在做什么:

convert result.tif txt:

样本输出

# ImageMagick pixel enumeration: 5,1,65535,cielab
0,0: (0,-0.5,-0.5)  #000000  cielab(0%,-0.000762951%,-0.000762951%)          <--- black pixel
1,0: (65535,-0.5,-0.5)  #FF0000  cielab(100%,-0.000762951%,-0.000762951%)    <--- white pixel
2,0: (34952,20559.5,17218.5)  #885043  cielab(53.3333%,31.3718%,26.2737%)    <--- red pixel
3,0: (57568,-22102.5,21330.5)  #E00053  cielab(87.8431%,-33.7263%,32.5483%)  <--- green pixel
4,0: (21074,20302.5,-27756.5)  #524F00  cielab(32.1569%,30.9796%,-42.3537%)  <--- blue pixel

查看红色像素,您会得到:

  • L=53.33%
  • a=256 的 31.37%,即 80.3
  • b=256 的 26.27%,即 67.2
于 2018-10-15T20:38:13.480 回答
1

通过@DanMašek 使用@MarkSetchell 图像,我们解决了这个问题。

使用 imread 功能,图像会自动转换为 RGB 图像,因此需要再次将其转换为 Lab 图像。另一个问题与 8 位图像有关。结果图像按照以下规则修改了 L、a 和 b 的值:

L * 255/100 a 作为 a+128 b 作为 b+128

所以我解决了以下问题:

    originalImage = imread(originalImagePath, CV_LOAD_IMAGE_UNCHANGED);
    Mat originalImageLab;
    cvtColor(originalImage, originalImageLab, COLOR_RGB2Lab);
    Mat originalImageSplitted[3];
    split(originalImageLab, originalImageSplitted);

谢谢你们!

于 2018-10-15T22:47:32.133 回答
1

要保持图像不变,您应该类似地将其读入 Mat 图像:

Mat image; image = imread(<path_of_image>, CV_LOAD_IMAGE_UNCHANGED)

在这种情况下,第二个参数应该保留您的图像颜色通道。

于 2018-10-15T17:57:14.993 回答