【发布时间】:2017-07-22 08:34:27
【问题描述】:
我想要完成的任务是复制 Photoshop RGB 到 LAB 的转换。
为简单起见,我将描述我为仅提取 L 通道所做的工作。
提取 Photoshop 的 L 通道
这是包含所有 RGB 颜色的 RGB 图片(请点击下载):
为了提取 Photoshop 的 LAB,我做了以下操作:
- 已将图像加载到 Photoshop 中。
- 将模式设置为 LAB。
- 在通道面板中选择了 L 通道。
- 将模式设置为灰度。
- 将模式设置为 RGB。
- 另存为 PNG。
这是 Photoshop 的 L 通道(这正是在 LAB 模式下选择 L 通道时在屏幕上看到的内容):
sRGB 到 LAB 转换
我的主要参考是Bruce Lindbloom great site。
还知道Photoshop is using D50 White Point in its LAB Mode(另见Wikipedia's LAB Color Space Page)。
假设 RGB 图像为 sRGB 格式,则转换为:
sRGB -> XYZ (White Point D65) -> XYZ (White Point D50) -> LAB
假设数据在 [0, 1] 范围内的浮点数中,阶段由下式给出:
-
Transform sRGB into XYZ.
转换矩阵由RGB -> XYZ Matrix 给出(参见 sRGB D65)。 - 从 XYZ D65 转换为 XYZ D50
使用Chromatic Adaptation Matrix 完成转换。由于上一步是矩阵乘法,它们可以组合成一个矩阵,从 sRGB -> XYZ D50 开始(参见RGB to XYZ Matrix 的底部)。请注意,Photoshop 使用 Bradford 适应方法。 - 从 XYZ D50 转换为 LAB
使用XYZ to LAB Steps 完成转换。
MATLAB 代码
因为,首先,我只是在 L 通道之后事情变得更简单一些。图像被加载到 MATLAB 并转换为 Float [0, 1] 范围。
这是代码:
%% Setting Enviorment Parameters
INPUT_IMAGE_RGB = 'RgbColors.png';
INPUT_IMAGE_L_PHOTOSHOP = 'RgbColorsL.png';
%% Loading Data
mImageRgb = im2double(imread(INPUT_IMAGE_RGB));
mImageLPhotoshop = im2double(imread(INPUT_IMAGE_L_PHOTOSHOP));
mImageLPhotoshop = mImageLPhotoshop(:, :, 1); %<! All channels are identical
%% Convert to L Channel
mImageLMatlab = ConvertRgbToL(mImageRgb, 1);
%% Display Results
figure();
imshow(mImageLPhotoshop);
title('L Channel - Photoshop');
figure();
imshow(mImageLMatlab);
title('L Channel - MATLAB');
函数ConvertRgbToL()由以下给出:
function [ mLChannel ] = ConvertRgbToL( mRgbImage, sRgbMode )
OFF = 0;
ON = 1;
RED_CHANNEL_IDX = 1;
GREEN_CHANNEL_IDX = 2;
BLUE_CHANNEL_IDX = 3;
RGB_TO_Y_MAT = [0.2225045, 0.7168786, 0.0606169]; %<! D50
Y_CHANNEL_THR = 0.008856;
% sRGB Compensation
if(sRgbMode == ON)
vLinIdx = mRgbImage < 0.04045;
mRgbImage(vLinIdx) = mRgbImage(vLinIdx) ./ 12.92;
mRgbImage(~vLinIdx) = ((mRgbImage(~vLinIdx) + 0.055) ./ 1.055) .^ 2.4;
end
% RGB to XYZ (D50)
mY = (RGB_TO_Y_MAT(1) .* mRgbImage(:, :, RED_CHANNEL_IDX)) + (RGB_TO_Y_MAT(2) .* mRgbImage(:, :, GREEN_CHANNEL_IDX)) + (RGB_TO_Y_MAT(3) .* mRgbImage(:, :, BLUE_CHANNEL_IDX));
vYThrIdx = mY > Y_CHANNEL_THR;
mY3 = mY .^ (1 / 3);
mLChannel = ((vYThrIdx .* (116 * mY3 - 16.0)) + ((~vYThrIdx) .* (903.3 * mY))) ./ 100;
end
正如人们所看到的那样,结果是不同的。
Photoshop 对于大多数颜色来说要暗得多。
有人知道如何复制 Photoshop 的 LAB 转换吗?
任何人都可以发现此代码中的问题?
谢谢。
【问题讨论】:
-
也许您关于 Photoshop 如何完成这项工作的参考资料不正确。由于它是专有软件,除了他们之外没有人可以回答这个问题。
-
不清楚具体要遵循哪些步骤。我会尝试分阶段验证/比较,以找出结果不同的地方。例如,您确定灰度转换是相同的吗?当您说它是“浮点数”时,您确定它是双精度而不是单精度吗?我也只会查看文件/数据中的值,而不是您在屏幕上看到的值。并且你尝试过 Matlab 的
rgb2lab和类似的功能吗? -
另外,您的一些资料来源似乎已有几年历史了。我们不知道 Photoshop 是否可能在此期间在后台进行了更改。您使用的是什么版本的 Photoshop 和 Matlab?
-
MATLAB 内部 RGB ro LAB 和 MATLAB File Exchange 上的任何文件都在进行上述数学运算,而无需使用 D65 白点进行 sRGB Gamma 补偿。即使是带有 D50 White Point 的 MATLAB 也无法与 Photoshop 匹配。
-
尝试反转我自己的代码来重写你的,你会得到你的结果
标签: matlab image-processing colors photoshop color-space