我正在尝试读取 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 且高度饱和。
这并不奇怪。
imwrite
将所有内容保存为硬盘上的 RGB 图像,这意味着您的 L 通道将被视为硬盘上的 R 通道(在 Photoshop 中也是如此)。对于 Windows,IMAGE 表示 RGB。如果你想保存Lab图像,你必须将其保存为一种文件,如txt、xml、yml、二进制文件等。