Quelqu'un peut-il expliquer l'algorithme derrière la couche d'ajustement "Noir et blanc" dans Photoshop?
Je dois le reproduire en utilisant C ++ pour une application qui met l'accent sur les pixels non rouges / magenta (ish) d'une image (avec une tolérance configurable en pourcentage), et cette ressource a montré le comportement que j'attends.
Je ne pouvais toujours pas le reproduire, mais j'ai trouvé un indice:
Chaque pixel est défini par jusqu'à deux contrôles, un additif (RVB) et un soustractif (CMJ).
Réponses:
J'ai parfaitement répliqué l'algorithme dans MATLAB (basé sur la réponse de @ Ivan Kuckir ):
Faites attention à ce que la conversion de
vPhotoshopValues
àvCoeffValues
se fasse commevCoeffValues = (vPhotoshopValues - 50) ./ 50
.Comme les valeurs Photoshop sont dans [-200, 300] et doivent être mappées linéairement dans [-5, 5] avec
50 -> 0
.Voici une comparaison avec Photoshop:
L'erreur maximale est inférieure à 1 dans la plage [0, 255].
Le code complet est disponible sur mon référentiel de traitement de signaux StackExchange Q688 GitHub .
la source
Chaque image (couleur) est composée de composants RVB. lorsque vous ajoutez (ou réduisez) une valeur constante à tous les pixels uniquement dans les composants RED, vous verrez l'effet équivalent à déplacer l'onglet RED vers la droite, et de la même manière, réduire le composant RED d'une constante aura l'effet inverse.
De la même manière, vous pouvez incrémenter / décrémenter chaque composant d'une valeur fixe comme décrit. Si vous augmentez / diminuez TOUS les composants RVB d'une même valeur, cela équivaudra à un changement de luminosité (fondamentalement, vous ajoutez / supprimez une couleur BLANCHE).
Le Cyan, Bleu, Magenta - correspond à une telle transformation dans l'espace colorimétrique CMJN. (Mais je suppose que le bleu dans cet espace colorimétrique correspond à un mélange de cyan et de jaune. C'est donc un peu délicat. La transformation est essentiellement la même pour tous.
Le dernier élément Tint: {Hue and Saturation} correspond aux mêmes opérations mais ici, les images sont d'abord transformées en modèle HSV puis HUE et Saturation sont ajoutées / soustraites indépendamment.
Je ne connais pas les relations exactes des marqueurs du cadran avec les numéros correspondants, mais que vous pouvez comprendre en essayant des valeurs pratiques.
la source
dotProduct(color, vec3(0.2989, 0.5870, 0.1140)
opération). 3. Le bleu ne "correspond à un mélange de cyan et de jaune" dans aucun espace colorimétrique.