我无法将RGB图像另存为Lab图像

时间:2019-01-18 15:37:12

标签: opencv lab cielab

我正在尝试读取RGB 8位图像,将其转换为Lab并保存。结果总是被解释为RGB图像,并且非常奇怪(饱和)。

我试图不对值进行标准化或使用RGB2Lab或将图像转换为32FC,但是没有任何效果。

Mat image = imread(path);
cvtColor(image , image , COLOR_BGR2Lab);

Mat imageSplitted[3];
split(image, imageSplitted);
Mat* imageNormalized = normalizeLabValues(imageSplitted);
Mat imageMerged;
merge(imageNormalized, 3, imageMerged);
imwrite(newPathFiltered, imageMerged);

normalizeLabValues是一个函数,用于解决将8位图像转换为Lab的问题:

Mat* normalizeLabValues(Mat image[]) {
int rows = image[0].rows;
int cols = image[0].cols;

for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
        // L
        Scalar intensity = image[0].at<uchar>(i, j);
        Scalar normalized_intensity = intensity.val[0] * 100 / 256;
        image[0].at<uchar>(i, j) = normalized_intensity.val[0];

        // a
        intensity = image[1].at<uchar>(i, j);
        normalized_intensity = intensity.val[0] - 126;
        image[1].at<uchar>(i, j) = normalized_intensity.val[0];

        // b
        intensity = image[2].at<uchar>(i, j);
        normalized_intensity = intensity.val[0] - 126;
        image[2].at<uchar>(i, j) = normalized_intensity.val[0];
    }
}


 return image;
}

我想获取Lab图像,但是如果我尝试使用Photoshop打开结果,则该图像是RGB且高度饱和。

1 个答案:

答案 0 :(得分:0)

这并不奇怪。 imwrite将所有内容另存为RGB图像在硬盘上,这意味着您的L通道将被视为硬盘上的R通道(在Photoshop中也是如此)。对于Windows,IMAGE表示RGB。如果要保存Lab图像,则必须将其保存为一种文件,例如txt,xml,yml,二进制文件等。