Was ist der Algorithmus hinter der Photoshop-Einstellungsebene „Schwarzweiß“?

11

Kann jemand den Algorithmus hinter der Einstellungsebene "Schwarz und Weiß" in Photoshop erklären?

Photoshop-Screenshot

Ich muss es mit C ++ für eine Anwendung reproduzieren, die nicht rote / magentafarbene (ish) Pixel aus einem Bild hervorhebt (mit einer prozentualen konfigurierbaren Toleranz), und diese Ressource zeigte das erwartete Verhalten.


Ich konnte es immer noch nicht reproduzieren, aber ich fand einen Hinweis:

Jedes Pixel wird durch bis zu zwei Steuerelemente definiert, ein Additiv (RGB) und ein Subtraktiv (CMY).

Blamoo
quelle
Sind Sie dem Algorithmus jemals näher gekommen? Ich versuche das auch herauszufinden.
Pizzafilme
Nein, ich habe nicht: /
Blamoo

Antworten:

4

Ich habe den Algorithmus perfekt in MATLAB repliziert (basierend auf der Antwort von @ 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

Achten Sie darauf, dass die Konvertierung von vPhotoshopValuesnach vCoeffValuesals erfolgen soll vCoeffValues = (vPhotoshopValues - 50) ./ 50.
Da Photoshop-Werte in [-200, 300] liegen und linear in [-5, 5] mit abgebildet werden sollten 50 -> 0.

Hier ist ein Vergleich zu Photoshop:

Geben Sie hier die Bildbeschreibung ein

Der maximale Fehler liegt im Bereich [0, 255] unter 1.

Der vollständige Code ist in meinem GitHub-Repository für die StackExchange-Signalverarbeitung Q688 verfügbar .

Royi
quelle
8

Jedes (Farb-) Bild besteht aus RGB-Komponenten. Wenn Sie allen Pixeln nur in ROTEN Komponenten einen konstanten Wert hinzufügen (oder reduzieren), sehen Sie den Effekt, der dem Verschieben der ROTEN Registerkarte nach rechts entspricht, und auf die gleiche Weise hat das Reduzieren der ROTEN Komponente um eine Konstante den umgekehrten Effekt.

Ebenso können Sie jede Komponente wie beschrieben um einen festen Wert erhöhen / verringern. Wenn Sie ALLE RGB-Komponenten um denselben Wert erhöhen / verringern, entspricht dies einer Änderung der Helligkeit (im Grunde fügen Sie WEISSE Farben hinzu / entfernen sie).

Cyan, Blau, Magenta - entspricht einer solchen Transformation im CMYK-Farbraum. (Aber ich denke, Blau in diesem Farbraum entspricht einer Mischung aus Cyan und Gelb. Das ist also etwas schwierig. Die Transformation ist im Wesentlichen für alle gleich.

Das letzte Element Tint: {Hue and Saturation} entspricht denselben Operationen, aber hier werden die Bilder zuerst im HSV-Modell transformiert und dann werden HUE und Saturation unabhängig voneinander addiert / subtrahiert.

Ich weiß nicht genau, wie sich die Markierungen des Zifferblatts auf die entsprechenden Zahlen beziehen, aber Sie können dies herausfinden, indem Sie praktische Werte ausprobieren.

Dipan Mehta
quelle
1
Es gibt RGB und CMY. Sie müssen also nur in einen der beiden Farbräume transformieren und können so viel anpassen, wie Sie möchten. Vergessen Sie nur nicht, das andere Triplett zu aktualisieren, sobald Sie mit der Anpassung fertig sind.
Jonas
Ich glaube, diese Antwort ist falsch und unvollständig. 1. In der PS-Implementierung wirkt sich das Verschieben des Schiebereglers "Blau" nicht auf die Helligkeit von Cyan-Pixeln aus, und das Schieben des Schiebereglers "Cyan" wirkt sich nicht auf die Helligkeit von Blau-Pixeln aus. Dieser in dieser Antwort beschriebene Ansatz würde so nicht funktionieren. 2. Sie beschreiben nicht, wie RGBCMY-Komponenten nach der Manipulation in Graustufen konvertiert werden (obwohl es sich wahrscheinlich um eine dotProduct(color, vec3(0.2989, 0.5870, 0.1140)Operation handelt). 3. Blau entspricht in keinem Farbraum einer Mischung aus Cyan und Gelb.
Stefan Monov
4. Sie erwähnen nicht, dass der Farbton nach der Konvertierung in Graustufen und nicht davor ausgeführt wird.
Stefan Monov