Photoshop“黑白”调整层背后的算法是什么?


11

有人可以解释一下photoshop中“黑白”调整层背后的算法吗?

Photoshop屏幕截图

对于必须强调图像中非红色/品红色像素(具有类似百分比的可配置公差)的应用程序,我必须使用C ++对其进行重现,并且该资源显示了我所期望的行为。


仍然无法复制它,但是我找到了一个线索:

每个像素最多由两个控件定义,一个为加法(RGB),一个为减法(CMY)。


您有没有进一步弄清楚算法的方法?我也想弄清楚这一点。
披萨电影

不,我没有:/
Blamoo

Answers:


4

我在MATLAB中完美地复制了算法(基于@ Ivan Kuckir的答案):

function [ mO ] = ApplyBlackWhiteFilter( mI, vCoeffValues )

FALSE   = 0;
TRUE    = 1;

OFF = 0;
ON  = 1;

numRows = size(mI, 1);
numCols = size(mI, 2);
dataClass = class(mI);

numCoeff    = size(vCoeffValues, 1);
hueRadius   = 1 / numCoeff;
vHueVal     = [0:(numCoeff - 1)] * hueRadius;

mHsl = ConvertRgbToHsl(mI);
mO = zeros(numRows, numCols, dataClass);

vCoeffValues = numCoeff * vCoeffValues;

for jj = 1:numCols
    for ii = 1:numRows
        hueVal = mHsl(ii, jj, 1);
        lumCoeff = 0;

        % For kk = 1 we're dealing with circular distance
        diffVal     = min(abs(vHueVal(1) - hueVal), abs(1 - hueVal));
        lumCoeff    = lumCoeff + (vCoeffValues(1) * max(0, hueRadius - diffVal));
        for kk = 2:numCoeff
            lumCoeff = lumCoeff + (vCoeffValues(kk) * max(0, hueRadius - abs(vHueVal(kk) - hueVal)));
        end

        mO(ii, jj) = mHsl(ii, jj, 3) * (1 + lumCoeff);
    end
end


end

请注意,从vPhotoshopValues到的转换vCoeffValues应按进行vCoeffValues = (vPhotoshopValues - 50) ./ 50
由于Photoshop的值在[-200,300]中,因此应使用线性映射到[-5,5] 50 -> 0

这是与Photoshop的比较:

在此处输入图片说明

在[0,255]范围内,最大误差小于1。

完整代码可在我的StackExchange Signal Processing Q688 GitHub存储库上找到


8

每个(彩色)图像均由RGB分量组成。当您仅向RED分量中的所有像素添加(或减少)常数值时,您将看到与向右移动RED选项卡等效的效果,并且以相同的方式减少RED分量的效果相同。

同样,您可以按照说明将固定值增加/减少每个分量。如果您将所有RGB分量增加/减少相同的值,这将等同于亮度变化(基本上是在添加/删除白色)。

青色,蓝色,洋红色-对应于CMYK颜色空间中的此类转换。(但是我猜想,这个颜色空间中的蓝色对应于青色和黄色的混合。所以这有点棘手。对于所有对象来说,转换基本上是相同的。

最后一个元素Tint:{色相和饱和度}对应于相同的操作,但是在这里,首先将图像转换为HSV模型,然后分别对色相和饱和度进行相减。

我不知道表盘标记与相应数字的确切关系,但可以通过尝试实际值来弄清楚。


1
有RGB和CMY,因此您要做的就是将其转换为两种颜色空间中的任何一种,并且可以根据需要进行任意调整。调整完毕后,别忘了更新另一个三元组。
乔纳斯(Jonas)

我相信这个答案是不正确和不完整的。1.在PS实现中,滑动“蓝色”滑块不会影响蓝绿色像素的亮度,而滑动“蓝绿色”滑块不会影响蓝绿色像素的亮度。此答案中描述的这种方法不会那样工作。2.您无需描述在操作RGBCMY组件后如何将它们转换为灰度(尽管这可能是一项dotProduct(color, vec3(0.2989, 0.5870, 0.1140)操作)。3.在任何颜色空间中,蓝色都不“对应于青色和黄色的混合色”。
Stefan Monov

4.您没有提到着色操作是在转换为灰度之后而不是在此之前执行的。
Stefan Monov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.