Каков алгоритм «черно-белого» корректирующего слоя Photoshop?

11

Может кто-нибудь объяснить алгоритм, стоящий за корректирующим слоем «Черно-белый» в фотошопе?

Скриншот фотошоп

Я должен воспроизвести его, используя C ++ для приложения, которое выделяет не красные / пурпурные (иш) пиксели изображения (с настраиваемым допуском в процентах), и этот ресурс показал ожидаемое поведение.


Все еще не мог воспроизвести это, но я нашел подсказку:

Каждый пиксель определяется максимум двумя элементами управления, одним аддитивным (RGB) и одним вычитающим (CMY).

Blamoo
источник
Вы когда-нибудь подходили к выяснению алгоритма? Я тоже пытаюсь это понять.
pizzafilms
Нет, я не: /
Blamoo

Ответы:

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.

Вот сравнение с фотошопом:

введите описание изображения здесь

Максимальная ошибка меньше 1 в диапазоне [0, 255].

Полный код доступен в моем хранилище обработки сигналов StackExchange Q688 GitHub .

Royi
источник
8

Каждое (цветное) изображение состоит из компонентов RGB. Когда вы добавите (или уменьшите) постоянное значение ко всем пикселям только в КРАСНЫХ компонентах, вы увидите эффект, эквивалентный перемещению КРАСНОЙ вкладки вправо, и аналогичным образом уменьшение КРАСНОГО компонента на константу будет иметь обратный эффект.

Точно так же вы можете увеличивать / уменьшать каждый компонент на фиксированное значение, как описано. Если вы увеличите / уменьшите ВСЕ компоненты RGB на одно и то же значение, это будет эквивалентно изменению яркости (в основном вы добавляете / удаляете БЕЛЫЙ цвет).

Cyan, Blue, Magenta - соответствует такому преобразованию в цветовом пространстве CMYK. (Но я полагаю, что синий цвет в этом цветовом пространстве соответствует сочетанию голубого и желтого. Это немного сложнее. Трансформация практически одинакова для всех.

Последний элемент Tint: {Hue and Saturation} соответствует тем же операциям, но здесь изображения сначала преобразуются в модели HSV, а затем HUE и Saturation добавляются / вычитаются независимо.

Я не знаю точных отношений маркеров циферблата с соответствующими номерами, но что вы можете выяснить, попробовав практические значения.

Дипан Мехта
источник
1
Есть RGB и CMY, поэтому все, что вам нужно сделать, это преобразовать в любое из двух цветовых пространств, и вы можете настроить столько, сколько хотите. Только не забудьте обновить другой триплет, как только вы закончите настройку.
Джонас
Я считаю, что этот ответ является неправильным и неполным. 1. В реализации PS скольжение «синего» ползунка не влияет на яркость пикселей голубого цвета, а перемещение ползунка «голубого» не влияет на яркость пикселей синего цвета. Этот подход, описанный в этом ответе, не будет работать так. 2. вы не описываете, как после манипулирования компонентами RGBCMY они преобразуются в оттенки серого (хотя это, вероятно, dotProduct(color, vec3(0.2989, 0.5870, 0.1140)операция). 3. Синий не "соответствует смеси голубого и желтого" в любом цветовом пространстве.
Стефан Монов
4. Вы не упоминаете, что операция оттенка выполняется после преобразования в оттенки серого, а не до этого.
Стефан Монов