我正在尝试使用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
[]
[]
[]
答案 0 :(得分: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
看着红色像素,您将得到:
答案 1 :(得分:1)
要保持图像不变,您应该类似地将其读取为Mat图像:
Mat image;
image = imread(<path_of_image>, CV_LOAD_IMAGE_UNCHANGED)
在这种情况下,第二个参数应按原样保留您的图像颜色通道。
答案 2 :(得分:1)
使用@DanMašek使用@MarkSetchell图像,我们解决了这个问题。
使用读取功能,图像会自动转换为RGB图像,因此需要再次将其转换为Lab图像。 另一个问题涉及到8位图像。生成的图像遵循以下规则修改了L,a和b的值:
长* 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);
谢谢大家!