图像中的洋红色像素(具有类似百分比的可配置公差),并且此资源显示了我所期望的行为。找到了一条线索:
每个像素最多由两个控件定义,一个为加法(RGB),一个为减法(CMY)。
#1 楼
我在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]中,应使用50 -> 0
线性映射到[-5,5]。这里是与Photoshop的比较:
在[0,255]范围内最大错误小于1。
完整的代码可在我的StackExchange Signal Processing Q688 GitHub存储库上找到。
#2 楼
每个(彩色)图像均由RGB分量组成。当仅向RED分量中的所有像素添加(或减少)常量值时,您将看到与向右移动RED选项卡等效的效果,并且以相同的方式减少RED分量的效果相同。同样,您可以按照说明将固定值增加/减少每个分量。如果您将所有RGB分量增加/减少相同的值,这将等同于亮度变化(基本上是在添加/删除白色)。
青色,蓝色,洋红色-对应于CMYK颜色空间中的此类转换。 (但我猜想,此颜色空间中的蓝色对应于青色和黄色的混合。所以这有点棘手。对于所有对象而言,转换基本上是相同的。
最后一个元素Tint:{色相和饱和度}对应于相同的操作,但是在这里,首先将图像转换为HSV模型,然后分别对HUE和饱和度进行添加/扣除。相应的数字,但您可以通过尝试实际值来找出答案。
评论
$ \ begingroup $
有RGB和CMY,因此您要做的就是将其转换为两种颜色空间中的任何一种,并且可以根据需要进行任意调整。调整完毕后,别忘了更新另一个三元组。
$ \ endgroup $
–乔纳斯(Jonas)
11年11月23日在17:13
$ \ begingroup $
我相信这个答案是不正确和不完整的。 1.在PS实施中,滑动“蓝色”滑块不会影响蓝绿色像素的亮度,而滑动“青色”滑块不会影响蓝绿色像素的亮度。此答案中描述的这种方法不会那样工作。 2.您无需说明在操作RGBCMY组件后如何将它们转换为灰度级(尽管可能是dotProduct(color,vec3(0.2989,0.5870,0.1140)操作)。3.蓝色不“对应于青色和黄色的混合颜色”。
$ \ endgroup $
– Stefan Monov
17年1月11日在21:09
$ \ begingroup $
4.您无需提及着色操作是在转换为灰度之后而不是在此之前执行的。
$ \ endgroup $
– Stefan Monov
17年1月11日在21:09
评论
您有没有进一步弄清楚算法的方法?我也在设法弄清楚。不,我没有:/