Implémentation Python du mode de fusion CSS3 et discussion sur l'espace colorimétrique

Qu'est-ce que le mode de fusion CSS3?

Il s'agit d'une fonction de "mode de fusion (mode de dessin)" installée dans les outils d'édition d'image tels que Photoshop, mais elle est également implémentée en CSS3 avec une propriété appelée "mix-blend-mode". Puisqu'il s'agit de CSS3, il est naturellement nécessaire d'unifier l'apparence dans chaque navigateur (autre que IE), de sorte que la formule de calcul pour chaque mode de fusion est répertoriée dans les spécifications du W3C.

Compositing and Blending Compositing and Blending Japanese translation

De plus, il semble que les employés d'Adobe soient également impliqués dans la formulation, et il semble que la même formule que le mode de fusion des produits Adobe tels que Photoshop soit utilisée.

"Mélange non séparable" étonnamment difficile

Lors de la lecture des spécifications W3C, les modes de fusion sont classés en deux types: "Mélange séparable" et "Mélange non séparable". «Mélange non séparable» est un mélange qui considère la combinaison de tous les composants de couleur sans traiter chaque composant individuellement.

"Separable blend" utilise des formules simples telles que "screen" et "overlay", donc il n'y a pas de problème. Il y a quatre problèmes: «teinte», «saturation», «couleur» et «luminosité», qui sont classés comme «mélange non séparable».

Par exemple, le mode «teinte» est un mode dans lequel la teinte (teinte) de l'image source est appliquée tout en maintenant la luminosité de l'image d'arrière-plan. Combinons les deux images ci-dessous en mode hue.

backdrop.png ducky.png

Le résultat de la composition est le suivant.

hue.png

Ce n'est pas une histoire simple, "Parce que je transplante la teinte, je la convertis en espace colorimétrique HSV et transplante le composant H ...". La luminance de l'image d'origine doit être conservée lors du portage de la teinte, ce qui signifie que le résultat composite doit être monochrome comme suit.

hue.png <iclass="fafa-arrow-right"aria-hidden="true">hue_mono.png

Ahiru a complètement disparu.

L'histoire de la valeur, de la légèreté et de la luminance

Il existe deux espaces colorimétriques couramment utilisés qui gèrent les teintes: l'espace colorimétrique HSV et l'espace colorimétrique HSL. L'espace colorimétrique HSV se compose de trois parties: Teinte, Saturation et Valeur.

Espace colorimétrique HSV-Wikipédia

L'espace colorimétrique TSL est composé de trois parties: teinte, saturation et clarté.

HSL Color Space-Wikipedia

Dans Wikipedia, il est décrit comme la luminosité dans l'espace colorimétrique HSL, mais cela est différent de la luminance. Sachez que le mot confusion se trouve ici sur différentes pages.

La formule générale pour la conversion de RVB en luminance est:

r * 0.298912 + g * 0.586611 + b * 0.114478

La formule de conversion de HSL en L (clarté) est la suivante.

(MAX(r, g, b) - MIN(r, g, b)) / 2

Clairement, c'est complètement différent. La traduction de la légèreté varie en fonction du matériau tel que "luminosité" et "luminosité", il est donc important de ne pas être confondu.

À propos de l'interprétation de SetSat

Une fonction pseudo-code appelée «SetSat» est décrite dans la formule du W3C.

SetSat(C, s)
    if(Cmax > Cmin)
        Cmid = (((Cmid - Cmin) x s) / (Cmax - Cmin))
        Cmax = s
    else
        Cmid = Cmax = 0
    Cmin = 0
    return C;

Quand j'ai vu ce pseudo-code pour la première fois, je n'ai pas compris ce que cela signifiait. «Cmin» est la valeur minimale du composant RVB, «Cmax» est la valeur maximale et «Cmid» est la valeur médiane.

Par exemple, si C = RVB (0,8, 0,6, 0,3), «Cmin» est l'élément B (0,3), «Cmax» est l'élément R (0,8) et «Cmid» est l'élément G (0,6). Je vais. La formule de calcul est la suivante.

G = (((G - B) x s) / (R - B))
R = s
B = 0.0

Cela signifie que. Au fait, je n'ai pas écrit ce qui se passe quand il y a deux Cmin et Cmax comme RVB (0,1, 0,1, 0,5) et RVB (0,5, 0,5, 0,1). Je ne sais pas quelle sera la bonne réponse, mais il semble que toute valeur fera l'affaire tant que les conditions suivantes sont remplies.

max(Cred, Cgreen, Cblue) - min(Cred, Cgreen, Cblue) == s

Implémentation en Python (oreiller)

Maintenant que nous connaissons la formule, nous allons l'implémenter dans la bibliothèque d'images Python oreiller. oreiller est essentiellement une bibliothèque d'images standard Python. Il n'a pas de fonctions avancées comme OpenCV, mais il peut convertir des données en diverses bibliothèques et dispose d'un traitement d'image compact et à grande vitesse.

Comme décrit dans PIL / Pillow Cheet Sheet, l'implémentation du mode de fusion utilise le module ʻImageMath`.

Implémentons hard-light comme exemple.

from PIL import ImageMath


def _hard_light(a, b):
    _cl = 2 * a * b / 255
    _ch = 2.0 * (a + b - a * b / 255.0) - 255.0
    return _cl * (b < 128) + _ch * (b >= 128)

bands = []
for cb, cs in zip(backdrop.split(), source.split()):
    t = ImageMath.eval(
        "func(float(a), float(b))",
        func=_hard_light,
        a=cb, b=cs
    ).convert("L")
    bands += [t]
    
Image.merge("RGB", bands)

Le module ʻImageMath` est utile car il vous permet de calculer des éléments comme des nombres. Pour un traitement simple tel que "Mélange séparable", vous pouvez l'implémenter comme ceci.

Le problème est le "mélange non séparable", qui est assez difficile en raison de la quantité étonnamment importante de calcul et du traitement délicat. En ce qui concerne l'implémentation, je publierai le code plus tard, donc si vous êtes intéressé, j'utiliserai pleinement les fonctions privées du module ʻImageMath`. Si vous voulez porter dans une autre langue, je pense que vous utiliserez GLSL etc., j'espère que cela vous sera utile.

Module "Image4Layer"

Nous avons regroupé ces processus sous le nom de module "Image4Layer". J'utilise souvent la composition «overlay» dans les systèmes de traitement d'image, donc je pense qu'il y a pas mal de choses à utiliser.

https://github.com/pashango2/Image4Layer

L'installation est facile avec pip, l'oreiller (PIL) doit être pré-installé pour fonctionner.

$pip install image4layer

C'est facile à utiliser, c'est un exemple de composition en mode couleur-esquive.

from PIL import Image
from image4layer import Image4Layer

source = Image.open("ducky.png ")
backdrop = Image.open("backdrop.png ")

Image4Layer.color_dodge(backdrop, source)

color_dodge.png

C'est simple, vous trouverez ci-dessous une liste des modes de fusion pris en charge.

Mode de fusion image
Image4Layer.normal normal.png
Image4Layer.multiply multiply.png
Image4Layer.screen screen.png
Image4Layer.overlay overlay.png
Image4Layer.darken darken.png
Image4Layer.lighten lighten.png
Image4Layer.color_dodge color_dodge.png
Image4Layer.color_burn color_burn.png
Image4Layer.hard_light hard_light.png
Image4Layer.soft_light soft_light.png
Image4Layer.difference diff.png
Image4Layer.exclusion exc.png
Image4Layer.hue hue.png
Image4Layer.saturation sat.png
Image4Layer.color color.png
Image4Layer.luminosity lum.png

Bien que ce ne soit pas dans CSS3, j'ai également implémenté le mode de fusion inclus dans Photoshop.

Mode de fusion image
Image4Layer.vivid_light vivid.png
Image4Layer.pin_light pin.png
Image4Layer.linear_dodge linear.png
Image4Layer.subtract sub.png

La licence étant MIT, elle peut être utilisée gratuitement indépendamment de l'usage commercial ou personnel.

Postscript

La version 0.4 ne fonctionnait pas avec Python 2 et il y avait un bogue dans l'opération entre RGBA, qui a été corrigé dans 0.43.

Épilogue

Traduction japonaise de composition et de fusion a le dessin attendu et l'affichage réel du navigateur, mais lorsque j'y accède avec Chrome Ce sera comme suit.

範囲を選択_040.png

cette···? La couleur n'est-elle pas assez différente? Il semble que les couleurs de l'écran ici diffèrent considérablement selon chaque navigateur.

Postscript

La couleur semble être différente selon la version de Chrome, mon environnement est l'environnement Ubuntu, et il semble qu'il y ait un bug dans la composition de la valeur alpha définie dans backdrop.png.

Au fait, le résultat d'affichage d'Image4Lyaer est presque le même que celui de Chrome, je pense qu'il a presque la même implémentation. S'il y a des informations, je les écrirai au besoin.

Recommended Posts

Implémentation Python du mode de fusion CSS3 et discussion sur l'espace colorimétrique
Implémentation du filtre à particules par Python et application au modèle d'espace d'états
Implémentation de l'arbre TRIE avec Python et LOUDS
Explication de la distance d'édition et de l'implémentation en Python
Explication et mise en œuvre de SocialFoceModel
Détecter les objets d'une couleur et d'une taille spécifiques avec Python
Implémentation Python du filtre à particules
Description et implémentation de Maxout (Python)
Implémentation du tri rapide en Python
Gestion de l'espace colorimétrique HSV inférieur et supérieur dans OpenCV
Installation source et installation de Python
Exploration avec Python et Twitter API 2-Implémentation de la fonction de recherche d'utilisateurs
[Python] J'ai expliqué en détail la théorie et la mise en œuvre de la régression logistique
[Python] J'ai expliqué en détail la théorie et la mise en œuvre de l'arbre de décision
[Python] Implémentation de la méthode Nelder – Mead et sauvegarde des images GIF par matplotlib
Construction d'environnement de python et opencv
L'histoire de Python et l'histoire de NaN
Explication et mise en œuvre de PRML Chapitre 4
Introduction et mise en œuvre de JoCoR-Loss (CVPR2020)
Explication et implémentation de l'algorithme ESIM
Installer SciPy et matplotlib (Python)
Introduction et mise en œuvre de la fonction d'activation
Algorithme de tri et implémentation en Python
Implémentation Python du filtre à particules auto-organisateur
Implémentation du jeu de vie en Python
Explication et mise en œuvre du perceptron simple
Ceci et cela des propriétés python
Implémentation des notifications de bureau à l'aide de Python
Implémentation Python de l'arborescence de segments non récursive
Implémentation de Light CNN (Python Keras)
Implémentation du tri original en Python
Implémentation de la méthode Dyxtra par python
Coexistence de Python2 et 3 avec CircleCI (1.0)
Résumé des index et des tranches Python
Réputation des livres Python et des livres de référence
Changer la saturation et la clarté des spécifications de couleur comme # ff000 dans python 2.5
Dérivation de la distribution t multivariée et implémentation de la génération de nombres aléatoires par python
Ouvrez un fichier Excel en Python et coloriez la carte du Japon
[Ingénierie de contrôle] Calcul des fonctions de transfert et des modèles d'espace d'états par Python
Installation du code Visual Studio et installation de python
Mise en œuvre et expérience de la méthode de clustering convexe
Module d'implémentation de file d'attente et Python "deque"
Extraction de tweet.js (json.loads et eval) (Python)
Structure de données Python et implémentation interne ~ Liste ~
Connectez beaucoup de Python ou et et
Explication et implémentation de l'algorithme Decomposable Attention
Introduction facile de la série python3 et d'OpenCV3
[Python] Diverses combinaisons de chaînes de caractères et de valeurs
Automatisation égale de l'installation de Python et PyPI
Compréhension complète du threading Python et du multitraitement
Implémentation Python du modèle Markov caché continu
Projet Euler # 1 "Multiple de 3 et 5" en Python
Fonction de transmission / modèle d'espace d'état du circuit série RLC et simulation par Python
[Python] Comparaison de la théorie de l'analyse des composants principaux et de l'implémentation par Python (PCA, Kernel PCA, 2DPCA)
Deep Learning from scratch La théorie et la mise en œuvre de l'apprentissage profond appris avec Python Chapitre 3
Créez un environnement python pour apprendre la théorie et la mise en œuvre de l'apprentissage profond
[Python] J'ai expliqué en détail la théorie et l'implémentation de la machine à vecteurs de support (SVM).