Який алгоритм "Чорно-білого" регулюючого шару Photoshop?


11

Чи може хтось пояснити алгоритм, що стоїть за шаром коригування "Чорно-біле" у фотошопі?

Скріншот Photoshop

Я повинен відтворити його, використовуючи C ++ для програми, яка підкреслює не червоні / пурпурові (іш) пікселі з зображення (з відсотково-налаштованою толерантністю), і цей ресурс показав поведінку, яку я очікую.


Ще не вдалося відтворити це, але я знайшов підказку:

Кожен піксель визначається до двома елементами управління, однією добавкою (RGB) та одним відніманням (CMY).


Ви коли-небудь наближалися до з'ясування алгоритму? Я також намагаюся розібратися в цьому.
піцафільми

Ні, я не: /
Blamoo

Відповіді:


4

Я відмінно повторив алгоритм у MATLAB (на основі відповіді @ Івана Кукіра ):

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:

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

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

Повний код доступний у моєму репозиторії G68-GitHub для обробки сигналів StackExchange .


8

Кожне (кольорове) зображення складається з компонентів RGB. коли ви додасте (або зменшите) постійне значення до всіх пікселів лише у червоних компонентах, ви побачите ефект, еквівалентний переміщенню вкладки ЧЕРВЕНЬ вправо, і таким же чином зменшення червоного компонента на константу матиме зворотний ефект.

Як і мудрі, ви можете збільшувати / зменшувати кожен компонент за фіксованим значенням, як описано. Якщо збільшити / зменшити ВСІ компоненти RGB на одне і те ж значення, це буде еквівалентно зміні яскравості (в основному ви додаєте / видаляєте БІЛИЙ колір).

Синя, блакитна, пурпурова - відповідають такій трансформації в кольоровому просторі CMYK. (Але я здогадуюсь, Блакитний у цьому кольоровому просторі відповідає поєднанню синього та жовтого. Отже, це трохи хитро. Трансформація по суті однакова для всіх.

Останній елемент відтінку: {Hue and Saturation} відповідає однаковим операціям, але тут зображення спочатку трансформуються у модель HSV, а потім HUE і Saturation додаються / віднімаються незалежно.

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


1
Є RGB і CMY, тому все, що вам потрібно зробити, це перетворитись у будь-який з двох кольорових просторів, і ви можете налаштувати скільки завгодно. Просто не забудьте оновити інший триплет після того, як ви закінчите коригування.
Йонас

Я вважаю, що ця відповідь є неправильною та неповною. 1. У реалізації PS, ковзання "блакитного" повзунка не впливає на яскравість синьо-піксельних пікселів, а ковзання повзунка "cyan" не змінює яскравість синіх пікселів. Такий підхід, описаний у цій відповіді, не працював би так. 2. Ви не описуєте, як після маніпулювання компонентами RGBCMY вони перетворюються в масштаб сірого (хоча це, мабуть, dotProduct(color, vec3(0.2989, 0.5870, 0.1140)операція). 3. Синій не "відповідає суміші синього і жовтого" в будь-якому кольоровому просторі.
Стефан Монов

4. Ви не згадуєте, що операція з відтінком виконується після перетворення в масштаб сірого, а не перед цим.
Стефан Монов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.