Jaki jest algorytm „czarno-białej” warstwy dopasowania programu Photoshop?


11

Czy ktoś może wyjaśnić algorytm kryjący się za warstwą dopasowania „Czarno-białe” w Photoshopie?

Zrzut ekranu programu Photoshop

Muszę go odtworzyć za pomocą C ++ dla aplikacji, która wyróżnia piksele inne niż czerwony / magenta (ish) z obrazu (z konfigurowalną tolerancją procentową), a ten zasób pokazał oczekiwane zachowanie.


Nadal nie mogłem tego odtworzyć, ale znalazłem wskazówkę:

Każdy piksel jest definiowany przez maksymalnie dwie kontrolki, jedną addytywną (RGB) i jedną subtraktywną (CMY).


Czy kiedykolwiek zbliżyłeś się do zrozumienia algorytmu? Próbuję to rozgryźć.
pizzafilms

Nie, nie zrobiłem: /
Blamoo

Odpowiedzi:


4

Algorytm doskonale skopiowałem w MATLAB (na podstawie odpowiedzi @ 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

Zwróć uwagę, że konwersja z vPhotoshopValuesna vCoeffValuespowinna być wykonana jako vCoeffValues = (vPhotoshopValues - 50) ./ 50.
Ponieważ wartości Photoshopa są w [-200, 300] i powinny być mapowane liniowo na [-5, 5] przy pomocy 50 -> 0.

Oto porównanie z Photoshopem:

wprowadź opis zdjęcia tutaj

Błąd maksymalny jest mniejszy niż 1 w zakresie [0, 255].

Pełny kod jest dostępny w moim repozytorium GitHub Q688 StackExchange Signal Processing .


8

Każdy obraz (kolorowy) składa się ze składników RGB. gdy dodasz (lub zmniejszysz) stałą wartość do wszystkich pikseli tylko w komponentach CZERWONYCH, zobaczysz efekt równoważny przesunięciu zakładki CZERWONY w prawo, i tak samo zmniejszenie składnika CZERWONEGO o stałą spowoduje efekt odwrotny.

Podobnie można zwiększyć / zmniejszyć każdy składnik o stałą wartość zgodnie z opisem. Jeśli zwiększysz / zmniejszysz WSZYSTKIE składniki RGB o tę samą wartość, będzie to równoważne zmianie jasności (w zasadzie dodajesz / usuwasz BIAŁY kolor).

Cyjan, niebieski, magenta - odpowiada takiej transformacji w przestrzeni kolorów CMYK. (Ale wydaje mi się, że niebieski w tej przestrzeni kolorów odpowiada mieszance cyjanu i żółtego. To trochę skomplikowane. Transformacja jest zasadniczo taka sama dla wszystkich.

Ostatni element Tint: {Hue and Saturation} odpowiada tym samym operacjom, ale tutaj obrazy są najpierw przekształcane w modelu HSV, a następnie HUE i nasycenie są dodawane / odejmowane niezależnie.

Nie wiem o dokładnych związkach markerów tarczy z odpowiednimi liczbami, ale można to ustalić, wypróbowując praktyczne wartości.


1
Istnieje RGB i CMY, więc wszystko, co musisz zrobić, to przekształcić się w dowolną z dwóch przestrzeni kolorów i możesz dostosować tyle, ile chcesz. Po prostu nie zapomnij zaktualizować drugiego tripletu po zakończeniu dostosowywania.
Jonas,

Uważam, że ta odpowiedź jest niepoprawna i niekompletna. 1. W implementacji PS przesunięcie suwaka „niebieskiego” nie wpływa na jasność pikseli niebieskozielonych, a przesunięcie suwaka „niebieskozielonego” nie wpływa na jasność niebieskich pikseli. To podejście opisane w tej odpowiedzi nie zadziałałoby w ten sposób. 2. nie opisujesz, jak po zmanipulowaniu komponentów RGBCMY są one konwertowane na skalę szarości (chociaż prawdopodobnie jest to dotProduct(color, vec3(0.2989, 0.5870, 0.1140)operacja). 3. Niebieski nie „odpowiada mieszance cyjanu i żółtego” w żadnej przestrzeni kolorów.
Stefan Monov

4. Nie wspominasz, że operacja odcienia jest wykonywana po konwersji do skali szarości, a nie wcześniej.
Stefan Monov
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.