⚠️ Ceci est un site de traduction non officiel, sans lien avec ImageMagick Studio LLC. Pour des informations officielles, consultez la page originale (https://usage.imagemagick.org/color_mods/index.html).

Exemples ImageMagick -- Modifications de couleur

Exemples ImageMagick : préface et index
Conversion de la couleur en niveaux de gris
Ajustements de niveaux de l'image

Nous examinons ici des techniques pour modifier toutes les couleurs d'une image dans son ensemble. Qu'il s'agisse d'éclaircir ou d'assombrir l'image, ou de modifications de couleur plus radicales. Pour explorer ces techniques, nous aurons besoin d'une image de test...
Ne vous préoccupez pas de la manière dont j'ai réellement généré cette image, ce n'est pas important pour l'exercice. Je l'ai conçue pour qu'elle contienne une gamme de couleurs, de transparences et d'autres caractéristiques, précisément afin de mettre IM à l'épreuve lorsqu'on l'utilise. | [Sortie IM]
---|---
Si les commandes utilisées pour générer cette image vous intéressent vraiment, vous pouvez consulter le script spécial "[**generate_test**](../static/img/scripts/generate_test)" que j'utilise pour la créer. | AVERTISSEMENT : les traitements de couleur ci-dessous supposent généralement que l'image utilise un espace colorimétrique linéaire. La plupart des images sont cependant enregistrées dans un espace colorimétrique sRGB ou corrigé en gamma ; pour faire les choses correctement, une correction de l'espace colorimétrique devrait donc aussi être appliquée au préalable.
---|---


Conversion de la couleur en niveaux de gris

Les images en niveaux de gris peuvent être très utiles pour de nombreux usages, comme le traitement ultérieur de l'image d'origine ou l'utilisation dans des compositions d'arrière-plan. La meilleure méthode pour convertir une image en niveaux de gris est simplement de demander à IM de transformer l'image en une représentation d'espace colorimétrique en niveaux de gris.

  magick test.png  -colorspace Gray   gray_colorspace.png

[Sortie IM] [Sortie IM]

Remarquez comme le bleu est bien plus sombre que le rouge, en raison de la pondération destinée à correspondre à l'intensité telle qu'elle semble apparaître à l'œil humain. Autrement dit, 'red' est une couleur assez vive comparée à 'blue' qui paraît plus sombre. Cela équivaut à l'utilisation de la formule de conversion 'rec709luma' avec l'opérateur dédié "[-grayscale](https://imagemagick.org/command-line-options/#grayscale)" (ajouté dans IM v6.8.3-10). |

  magick test.png  -grayscale rec709luma  gray_grayscale.png

[Sortie IM]
La valeur 'rec709luma' n'est que l'une des nombreuses formules de conversion en niveaux de gris qui ont été définies pour être utilisées par le réglage "[-intensity](https://imagemagick.org/command-line-options/#intensity)" (voir ci-dessous). Voici par exemple l'autre formule courante de conversion en niveaux de gris, 'rec601luma' |

  magick test.png  -grayscale rec601luma  gray_grayscale_601.png

[Sortie IM]
Comme vous pouvez le constater, il y a une légère différence dans les niveaux d'intensité pour les différents canaux de couleur rouge, vert et bleu.
Il existe cependant bien d'autres méthodes, et significations, de la notion de 'niveaux de gris'... Par exemple, vous pouvez retirer toute la couleur de l'image en utilisant l'opérateur Modulate, pour régler à zéro tous les niveaux de saturation des couleurs. |

  magick test.png  -modulate 100,0  gray_modulate.png

[Sortie IM]
Cela convertit essentiellement l'image en espace colorimétrique HSL, et en extrait la valeur de 'Lightness' (clarté) en niveaux de gris. Cependant, en utilisant un "-define modulate:colorspace", vous pouvez spécifier d'autres modèles d'espace colorimétrique à utiliser. Voir Modulate dans d'autres espaces colorimétriques ci-dessous. Remarquez que la couleur 'green' d'IM que j'ai utilisée pour le disque coloré central de mon image de test n'est pas réellement un vert pur, tel que celui employé dans l'arc-en-ciel coloré, mais le vert à demi-luminosité défini par la nouvelle norme SVG -- Scalable Vector Graphics. Si vous avez besoin d'un vert RGB pur, vous pouvez utiliser à la place la couleur 'lime'. Voir Conflits de noms de couleur pour plus de détails. Une autre façon de faire consiste à utiliser l'opérateur FX DIY pour faire la moyenne des trois canaux et obtenir une signification purement mathématique des niveaux de gris. |

  magick test.png -fx '(r+g+b)/3' gray_fx_average.png

[Sortie IM]
| La moyenne des valeurs des canaux sRGB est aussi équivalente au canal d'intensité de l'espace colorimétrique 'OHTA' (canal rouge). Ou au canal 'I' de l'espace colorimétrique HSI.
---|---
Une autre technique consiste simplement à additionner les trois canaux (une mesure de couleur connue sous le nom de distance de Manhattan) et, bien que l'image résultante ne perde pas d'information en tant que telle, les effets d'« arrondi quantique » peuvent vous faire perdre de l'information sur les couleurs les plus vives. Malheureusement, vous perdez aussi le canal de transparence. |

  magick test.png -separate \
          -background black -compose plus -flatten   gray_added.png

[Sortie IM]
Vous pouvez utiliser cette même technique d'addition des canaux pour contrôler la pondération des différents canaux de couleur. Par exemple, voici une formule DIY que vous pouvez utiliser... |

  magick test.png -fx '0.3*r+0.6*g+0.1*b' gray_diy.png

[Sortie IM]
Vous pouvez aussi utiliser 'intensity' si vous voulez la même signification au sein de l'opérateur "[-fx](https://imagemagick.org/command-line-options/#fx)". |

  magick test.png  -fx intensity  gray_intensity.png

[Sortie IM]

Cependant, comme l'opérateur FX DIY est interprété, il peut s'exécuter très très lentement. Pour des opérations plus complexes, vous pouvez utiliser l'opérateur Evaluate plus simple, "[-evaluate](https://imagemagick.org/command-line-options/#evaluate)". Par exemple, voici une image en niveaux de gris selon un ratio 2/5/3, bien que là encore je ne tente pas de préserver le canal de transparence de l'image d'origine. | |

  magick test.png -channel R -evaluate multiply .2 \
                   -channel G -evaluate multiply .5 \
                   -channel B -evaluate multiply .3 \
                   -channel RGB -separate -compose add -flatten gray_253.png

[Sortie IM]
| _Ce qui précède souffrirait d'effets de 'quantification' pour un ImageMagick compilé avec un niveau de qualité 'Q8'. Cela s'explique par le fait que les résultats de "[-evaluate](https://imagemagick.org/command-line-options/#evaluate)" seront enregistrés dans un petit entier de 8 bits, utilisé pour les valeurs de l'image. Ce n'est qu'ensuite que ces valeurs sont additionnées, avec la perte de précision qui en résulte.

Un ImageMagick compilé avec les options de compilation de qualité 'Q16', ou mieux encore HDRI, produira un résultat bien plus exact. Une autre nouvelle solution est l'opérateur Poly -- fusion pondérée d'images, qui effectue la pondération et l'addition des images de canaux séparés en une seule opération, évitant ainsi les effets d'arrondi quantique.

_
---|---
Une technique similaire peut servir à générer des niveaux de gris purement mathématiques, en faisant directement la moyenne à parts égales des trois canaux RGB. |

  magick test.png -separate -evaluate-sequence mean  gray_average.png

[Sortie IM]
Cependant, comme vous pouvez le voir, je n'ai pas tenté de préserver le canal alpha de l'image résultante. Une autre solution rapide consiste à utiliser l'opérateur de matrice de couleurs "[-recolor](https://imagemagick.org/command-line-options/#recolor)", qui vous permet de spécifier la pondération des trois canaux de couleur. |

  magick test.png -recolor '.2 .5 .3
                             .2 .5 .3
                             .2 .5 .3'   gray_recolor.png

[Sortie IM]
Cela n'affecte pas la transparence, mais en fait une bien meilleure façon de convertir les couleurs à l'aide d'une pondération spécifique. Fondamentalement, la première ligne de nombres correspond à la pondération des canaux pour le canal rouge de l'image résultante, les 3 suivants pour le vert, et les trois derniers nombres pour le bleu. Vous pouvez aussi utiliser "[-type](https://imagemagick.org/command-line-options/#type)" pour indiquer à IM de traiter l'image comme des niveaux de gris, lors de la lecture ou de l'écriture de l'image. |

  magick test.png  -type GrayScaleAlpha  gray_type.png

[Sortie IM]
| Le réglage "[-type](https://imagemagick.org/command-line-options/#type)" n'est généralement utilisé que comme indication lorsqu'une image est lue depuis un fichier ou écrite dans un fichier. Son action est donc différée jusqu'à l'écriture finale de l'image. Son effet dépend aussi fortement des capacités du format de fichier image concerné et sert à outrepasser la détermination normale d'ImageMagick au cours de ce processus. Voir les exemples de Type pour plus d'informations.
---|---
| Avant IM v6.3.5-9, ce qui précède aurait supprimé toute transparence dans l'image écrite (équivalent d'un "[-type](https://imagemagick.org/command-line-options/#type) Grayscale") à cause d'un bug. Cela a été corrigé dès que j'ai remarqué le problème et l'ai signalé. (Il y a une leçon à en tirer :-)
---|---

Une technique bien plus intéressante consiste à extraire diverses significations de la luminosité en extrayant le canal de couleur approprié de différentes représentations en espace colorimétrique de l'image. Pour des exemples, voir Canaux de niveaux de gris à partir de représentations d'espaces colorimétriques.


Ajustements de niveaux de l'image

La forme d'ajustement la plus élémentaire que vous puissiez apporter aux images est ce qu'on appelle les ajustements de 'niveaux'. Cela consiste essentiellement à prendre les différentes valeurs de couleur RGB (voire les valeurs du canal alpha) et à les ajuster de manière à étirer ou compresser ces valeurs. Comme seules les valeurs des canaux sont ajustées, il est préférable de les démontrer sur une image en niveaux de gris plutôt que sur une image en couleur. Cependant, si vous ajustez tous les canaux de couleur d'une image de la même quantité, vous pouvez les utiliser sur des images en couleur, dans le but soit de rehausser, soit d'ajuster l'image. Ne confondez pas cela avec la forme plus automatique d'ajustement de niveaux, que nous verrons dans la prochaine grande section d'exemples ci-dessous, Ajustements Normalize. Cette fonction effectuera exactement la même opération quel que soit le contenu réel de l'image. Peu importe que l'image soit claire ou sombre, ou qu'elle ait une teinte bleue ou jaune. Les opérations sont aveugles au contenu réel de l'image. [Graphe IM] Pour démontrer ces opérations, j'utiliserai un graphe "[gnuplot](http://www.gnuplot.info/)" modifié comme celui montré à droite, que je génère à l'aide d'un script spécial "[im_graph](../static/img/scripts/im_graph)". Le graphe comporte une ligne rouge qui met en correspondance la valeur 'x' d'origine donnée (représentant la valeur en niveaux de gris du dégradé le plus haut) avec la valeur 'y' affichée. Le dégradé de couleur résultant est également montré sous le dégradé linéaire d'entrée. Le graphe montré à droite est celui de l'opérateur IM "[-noop](https://imagemagick.org/command-line-options/#noop)" qui, en réalité, ne fait rien à une image. Ainsi, chacune des valeurs de couleur de l'image est simplement mise en correspondance avec exactement la même valeur, sans changement. Le dégradé inférieur est donc identique au dégradé supérieur.

Négation de l'image

L'ajustement de niveaux global le plus simple et le plus élémentaire que vous puissiez faire est de négativer l'image, à l'aide de l'opérateur d'image "[-negate](https://imagemagick.org/command-line-options/#negate)". Essentiellement, cela rend le blanc noir et le noir blanc, en ajustant toutes les couleurs en conséquence. Autrement dit, il transformera la couleur rouge en sa couleur complémentaire, le cyan, et le bleu en jaune, etc. Vous pouvez le constater avec le graphe de correspondance montré ci-dessous, où j'utilise l'opérateur "[-negate](https://imagemagick.org/command-line-options/#negate)" à la fois sur l'image 'test' et sur l'image intégrée standard 'rose' d'IM. Remarquez comme le dégradé inférieur dans l'image du graphe de correspondance est maintenant inversé, de sorte que le noir et le blanc sont permutés, et que la même inversion apparaît dans l'image 'test' négativée.

  magick test.png  -negate  test_negate.png
  magick rose:    -negate  rose_negate.gif

[Sortie IM]
[Sortie IM] | [Graphe IM] | [Sortie IM]
[Sortie IM]
---|---|---

En interne, negate est en réalité plutôt rudimentaire. Il traite les trois canaux de couleur indépendamment et, par défaut, ignore le canal alpha. Si ce n'était pas le cas, vous obtiendriez un résultat très absurde comme celui-ci...

  magick test.png -channel RGBA  -negate  negate_rgba.png

[Sortie IM] [Sortie IM]

L'image est négativée, comme vous pouvez le voir grâce au dégradé de couleur semi-transparent. Mais comme le canal de transparence a lui aussi été négativé, vous perdez toutes les couleurs opaques de l'image. C'est pourquoi le réglage par défaut de "[-channel](https://imagemagick.org/command-line-options/#channel)" est 'RGB'. Voir Canaux de couleur pour plus d'informations. Vous pouvez limiter la négation à un seul canal, disons le canal de couleur vert. Cela peut ne pas sembler très utile, mais c'est parfois d'une importance vitale.

  magick test.png -channel green  -negate  negate_green.png

[Sortie IM] [Sortie IM]

L'opérateur "[-negate](https://imagemagick.org/command-line-options/#negate)" est en réalité son propre inverse. Effectuer deux négations avec le même réglage "[-channel](https://imagemagick.org/command-line-options/#channel)" les annule mutuellement.

  magick negate_green.png  -channel green  -negate  negate_restore.png

[Sortie IM] [Sortie IM]

La négation est extrêmement courante en traitement d'image, en particulier lorsqu'on traite des images en niveaux de gris, comme étape avant ou après d'autres options de traitement. Je vous recommande donc de l'essayer et de la garder à l'esprit chaque fois que vous faites quelque chose, car travailler avec des images négativées peut résoudre certains problèmes autrement difficiles.

Ajustements directs de niveaux

L'opérateur "[-level](https://imagemagick.org/command-line-options/#level)" est l'opérateur d'ajustement de niveaux le plus général. Vous lui donnez essentiellement deux valeurs, un 'black_point' (point noir) et un 'white_point' (point blanc), ainsi qu'une troisième valeur facultative (ajustement de gamma), que j'examinerai plus loin. Ce qu'il fait, c'est mettre en correspondance toute valeur de couleur de l'image égale ou inférieure au 'black_point' et la rendre noire (soit une valeur de 0). De même, toute valeur de couleur égale ou plus claire que le 'white_point' sera rendue blanche (soit une valeur maximale). Les couleurs situées entre ces deux points sont alors 'étirées' linéairement pour occuper toute la plage des valeurs. Cela a pour effet d'améliorer le contraste, en rehaussant les couleurs au sein d'une image. Par exemple, voici un rehaussement de contraste de 25 % de notre image de test, en utilisant les mêmes valeurs que celles montrées par le graphe. Comme on ajuste habituellement à la fois le point noir et le point blanc de la même quantité par rapport aux valeurs 0% et 100%, vous pouvez ne spécifier que le 'black_point'. Le point blanc sera ajusté de la même quantité vers l'intérieur.

  magick test.png  -level 25%,75%  test_level.png
  magick rose:    -level 25%      rose_level.gif

[Sortie IM]
[Sortie IM] | [Graphe IM] | [Sortie IM]
[Sortie IM]
---|---|---

Notez que 25% est un rehaussement de contraste énorme pour n'importe quelle image, mais il montre clairement ce qu'il fait. Vous n'êtes pas obligé de modifier à la fois les points 'noir' et 'blanc'. Il est tout à fait permis d'ajuster seulement l'une des extrémités de la plage de couleurs. Par exemple, nous pouvons créer une image rose très claire, ou très sombre.

  magick rose: -level 0,75%     rose_level_light.gif
  magick rose: -level 25%,100%  rose_level_dark.gif

[Graphe IM] [Sortie IM] [Graphe IM] [Sortie IM]

Cependant, je vous mets à nouveau en garde : les couleurs situées en dehors de la plage donnée sont 'clippées' ou 'brûlées', et ne seront donc plus disponibles pour un traitement d'image ultérieur. C'est le plus gros problème de l'utilisation d'un opérateur "[-level](https://imagemagick.org/command-line-options/#level)". [Graphe IM] En utilisant une valeur négative, vous pouvez effectuer un dé-contraste approximatif d'une image. Cela signifie qu'au lieu de fournir une valeur de couleur pour les valeurs à mettre en correspondance avec le 'noir' et le 'blanc', et donc d'étirer les couleurs intermédiaires, vous compressez au contraire les valeurs de couleur de manière à mettre en correspondance la couleur négative imaginaire avec le noir ou le blanc. Le résultat est un grisonnement général de l'image. |

  magick rose: -level -25%  rose_decontrast.gif

[Sortie IM]

Cette méthode de dé-contraste d'une image est cependant très imprécise et n'est pas recommandée, à moins que vous n'ayez un IM plus ancien que la version 6.4.2 où vous n'avez pas accès au nouvel opérateur de niveaux inversé. [Graphe IM] Vous pouvez utiliser l'opérateur "[-level](https://imagemagick.org/command-line-options/#level)" pour négativer une image (comme montré précédemment plus haut), simplement en permutant les valeurs des points 'noir' et 'blanc' données, en utilisant "-level 100%,0". |

  magick rose: -level 100%,0  rose_level_neg.gif

[Sortie IM]

[Graphe IM] Ou bien, en les réglant à la même valeur, vous pouvez faire en sorte que toutes les valeurs de couleur de l'image soient effectivement seuillées. Utiliser "[-level](https://imagemagick.org/command-line-options/#level)" pour seuiller une image revient exactement au même que d'utiliser un opérateur de seuil avec cette valeur. Le graphe de correspondance montré à droite illustre les résultats d'une opération "-level 50%,50%", et son effet sur un dégradé en niveaux de gris. |

  magick rose: -level 50%,50%  rose_level_thres.gif

[Sortie IM]

Notez que, contrairement à "[-threshold](https://imagemagick.org/command-line-options/#threshold)", l'image n'est pas automatiquement convertie en image en niveaux de gris lorsqu'elle est utilisée avec le réglage "[-channel](https://imagemagick.org/command-line-options/#channel)" par défaut. La nature générale de l'utilisation de level pour modifier linéairement une image rend l'opérateur "[-level](https://imagemagick.org/command-line-options/#level)" adapté aux modifications générales d'images en niveaux de gris et aux ajustements de masques. Ajoutez à cela le fait que vous pouvez modifier des canaux individuels (à l'aide du réglage "[-channel](https://imagemagick.org/command-line-options/#channel)") au lieu de l'image entière, et il devient l'un des meilleurs opérateurs de modification de couleur dont disposent les utilisateurs d'IM. Notez que vous pouvez aussi utiliser lesopérateurs Evaluate et Function pour une modification mathématique plus directe des valeurs de couleur, afin d'obtenir les mêmes résultats pour les deux formes + et - de -level).
Attention : l'opérateur "[-level](https://imagemagick.org/command-line-options/#level)" traite le canal de transparence comme des valeurs de 'matte'. Ainsi, 100 % est complètement transparent et 0 % est opaque. Veuillez en tenir compte lorsque vous utilisez "[-level](https://imagemagick.org/command-line-options/#level)" avec une image de forme floutée. Cela se fait le plus souvent après avoir flouté une image de 'forme', afin d'en étendre et d'en étirer les résultats. Pour des exemples de cela, voir Bords doux et Contours d'ombres.
--- ---

Ajustements de niveaux inversés -- Dé-contraste des images

Depuis la version 6.4.2 d'IM, l'opérateur Level a été étendu pour fournir une forme 'inversée' "[+level](https://imagemagick.org/command-line-options/#level)" (notez le 'plus'). Vous pouvez aussi utiliser la forme originale "[-level](https://imagemagick.org/command-line-options/#level)" de l'opérateur, mais en ajoutant un '!' à l'argument level donné (pour les interfaces d'API plus anciennes). Les arguments de cette variante sont exactement les mêmes, mais au lieu d'étirer les valeurs de manière à mettre en correspondance le 'black_point' et le 'white_point' avec le 'noir' et le 'blanc', elle met en correspondance le 'noir' et le 'blanc' avec les points donnés. En d'autres termes, "[+level](https://imagemagick.org/command-line-options/#level)" est l'exact inverse de "[-level](https://imagemagick.org/command-line-options/#level)". Par exemple, ici nous mettons en correspondance le 'noir' avec un gris à 25 %, et le blanc avec un gris à 75 %, dé-contrastant ainsi l'image de manière très précise, en utilisant les deux méthodes de spécification de la forme 'inversée'.

  magick test.png   +level 25%    test_level_plus.png
  magick rose:     -level 25%\!  rose_level_plus.gif

[Sortie IM]
[Sortie IM] | [Graphe IM] | [Sortie IM]
[Sortie IM]
---|---|---

Si vous comparez l'opération "+level 25%" ci-dessus avec l'utilisation du dé-contraste négatif "-level -25%" que nous avons montrée précédemment, vous verrez qu'elles ne sont pas identiques. La version 'plus' produit une image bien plus fortement dé-contrastée (elle est plus grise), mais elle le fait en effectuant la correspondance vers les valeurs exactes que vous donnez à l'opérateur, et non vers les valeurs 'imaginaires' qu'utilisait la forme 'moins'. Cette utilisation de valeurs exactes est importante, et l'une des raisons pour lesquelles la forme 'plus' de l'opérateur a été ajoutée. Bien sûr, '25%' est là encore une très grande valeur, et son usage n'est pas recommandé pour un travail d'image typique. Notez que "[-level](https://imagemagick.org/command-line-options/#level)" et "[+level](https://imagemagick.org/command-line-options/#level)" sont en réalité l'exact inverse l'un de l'autre lorsqu'on leur donne le même argument. Autrement dit, l'un met les valeurs en correspondance avec les extrêmes de la plage, tandis que l'autre les met en correspondance à partir des extrêmes de la plage. Par exemple, ici nous compressons les couleurs de l'image de test à l'aide de "[+level](https://imagemagick.org/command-line-options/#level)", puis nous les décompressons de nouveau à l'aide de "[-level](https://imagemagick.org/command-line-options/#level)", de façon à restaurer l'image dans un état proche de son apparence d'origine.

  magick test.png  +level 20%  -level 20%  test_level_undo.png

[Sortie IM] [Graphe IM] [Sortie IM]

Les deux images paraissent très très semblables et, comme j'utilise une version 'Q16' d'IM de haute qualité, vous aurez bien du mal à remarquer la moindre différence. Cependant, les valeurs peuvent ne pas être exactement les mêmes, car vous avez de fait compressé les valeurs de couleur de l'image dans une plage d'entiers plus petite, puis les avez de nouveau restaurées. Dans les cas extrêmes, cela peut entraîner des effets d'arrondi quantique. Effectuer ces deux opérations dans l'ordre inverse (étirer, puis compresser les valeurs de couleur) produira des effets de clipping quantique. Un autre aspect utile de l'opérateur "[+level](https://imagemagick.org/command-line-options/#level)" est que vous pouvez compresser complètement toutes les valeurs de couleur d'une image au même niveau de gris.

  magick test.png  +level 30%,30%  test_level_const.png

[Sortie IM] [Graphe IM] [Sortie IM]

En spécifiant les niveaux selon les valeurs de couleurs précises pour chaque canal individuel, vous pouvez de fait transformer un dégradé en niveaux de gris en un dégradé de couleur spécifique. Cependant, cela est assez difficile à calculer et à réaliser. C'est pourquoi un opérateur "[-level-colors](https://imagemagick.org/command-line-options/#level-colors)" a également été fourni, qui vous permet de spécifier les points noir et blanc en termes de couleurs spécifiques plutôt que de valeurs de 'niveau'. Voir Niveaux par couleur ci-dessous.

Ajustements de niveaux par gamma

Les deux variantes de "[-level](https://imagemagick.org/command-line-options/#level)" ci-dessus permettent aussi d'utiliser un troisième réglage. La valeur d'ajustement 'gamma'. Par défaut, elle est réglée à une valeur de 1.0', qui n'effectue aucun ajustement des tons moyens de l'image résultante, produisant une correspondance purement linéaire des valeurs de l'ancienne image vers la nouvelle image. Cependant, en rendant cette valeur plus grande, vous courberez la ligne résultante de manière à éclaircir l'image, tandis qu'en la réduisant, vous assombrirez l'image. Par exemple, ici j'utilise uniquement le réglage 'gamma' pour éclaircir et assombrir seulement les tons moyens de l'image.

  magick rose: -level 0%,100%,2.0   rose_level_gamma_light.gif
  magick rose: -level 0%,100%,0.5   rose_level_gamma_dark.gif

[Graphe IM] [Sortie IM] [Graphe IM] [Sortie IM]

Les valeurs vont généralement de 10 pour une image d'une clarté aveuglante, à .2 pour une image très sombre. Comme mentionné, une valeur de 1.0 n'apportera aucun changement de 'gamma' à l'image. Cependant, la valeur spéciale de '2.0' (voir ci-dessus) peut servir à obtenir la racine carrée de la couleur normalisée de l'image. Les deux versions de l'opérateur "[-level](https://imagemagick.org/command-line-options/#level)" gèrent le 'gamma' de la même façon. Cela signifie que vous pouvez combiner l'ajustement de niveaux des extrémités 'noire' et 'blanche' avec un ajustement 'gamma' non linéaire. Vous pouvez aussi n'ajuster qu'un seul canal d'une image. Par exemple, ici nous donnons à une image une teinte subtile à l'extrémité noire du seul canal bleu, tout en utilisant le gamma pour préserver les niveaux de couleur des tons moyens de l'image.

  magick test.png  -channel B +level 25%,100%,.6 test_blue_tint.png

[Sortie IM] [Graphe IM] [Sortie IM]

Cet exemple précis pourrait servir à teinter une photo satellite météorologique, où seule la mer est d'un noir pur, tandis que la terre est plus grise. D'autres alternatives à cet ajustement du canal bleu sont données ci-dessous dans Ajustements non linéaires mathématiques DIY.

Ajustements par l'opération gamma

L'opérateur "[-gamma](https://imagemagick.org/command-line-options/#gamma)" est aussi fourni, et a exactement le même effet que le réglage 'gamma' de l'opérateur "[-level](https://imagemagick.org/command-line-options/#level)". Cependant, il vous permet aussi d'ajuster le niveau d'ajustement 'gamma' pour chaque canal individuel. Son véritable usage réside dans l'ajustement de la fonction 'gamma' d'une image avant d'effectuer des opérations linéaires sur celle-ci. Pour plus de détails, voir Perception humaine de la couleur et correction gamma. Nous pouvons aussi utiliser cette fonction pour éclaircir l'image différemment pour chaque canal RGB individuel. |

  magick rose: -gamma 0.8,1.3,1.0  gamma_channel.gif

[Sortie IM]
Comme vous pouvez le voir, cela peut servir à appliquer des teintes et des ajustements de couleur subtils à une image, ou à corriger des images qui contiennent trop d'une couleur donnée. | _Pour les raisons pour lesquelles vous devriez utiliser cette fonction, voirCorrection gamma.

_
---|---
Cette fonction est en réalité équivalente à la fonction POW d'Evaluate mais avec l'argument inversé. Ainsi, un "-evaluate POW 2.2" effectuera en réalité une opération "-gamma 0.45455" (0.45455 est égal à 1/2.2), qui est l'inverse d'un "-gamma 2.2".
L'un des usages moins évidents de "[-gamma](https://imagemagick.org/command-line-options/#gamma)" est de mettre à zéro des canaux d'image spécifiques (voir Mise à zéro des canaux de couleur). Ou de colorer une image entièrement en 'noir', en 'blanc' ou dans une autre couleur primaire (voir Toiles de couleur primaire).

Ajustement de niveaux par couleur

L'opérateur "[-level-colors](https://imagemagick.org/command-line-options/#level-colors)" a été ajouté à IM v6.2.4-1. Essentiellement, il est exactement identique à l'opérateur Level dont nous avons parlé plus haut, mais avec la valeur de chaque canal spécifiée sous forme de valeur de couleur. Autrement dit, l'option "[-level-colors](https://imagemagick.org/command-line-options/#level-colors)" mettra les couleurs données en correspondance avec le 'noir' et le 'blanc' et étirera linéairement toutes les autres couleurs entre elles. Cela retire de fait de l'image la plage de couleurs donnée. Et si cela fonctionne, ce n'est pas particulièrement utile, car cela a tendance à échouer pour des couleurs qui ont des valeurs communes dans un canal. Par exemple, les couleurs 'DodgerBlue' et 'White' ont les mêmes valeurs de couleur dans le canal bleu. Ainsi, "-level-colors DodgerBlue,White" peut ne pas toujours mettre ces couleurs en correspondance avec le noir et le blanc. La meilleure technique dans ce cas est d'extraire une image en niveaux de gris du canal présentant les plus grandes différences (comme le rouge) et d'appliquer level ou normalize à ce canal. AVERTISSEMENT : méfiez-vous des couleurs 'transparentes'.
La forme plus de l'opérateur "[+level-colors](https://imagemagick.org/command-line-options/#level-colors)" est en revanche extrêmement utile, car elle mettra la couleur 'noir' et 'blanc' en correspondance avec les valeurs données, en compressant linéairement toutes les autres couleurs pour les faire tenir entre les deux couleurs que vous donnez. Par exemple, mettons 'black' et 'white' en correspondance avec 'green' et 'gold'...

  magick test.png  +level-colors green,gold   levelc_grn-gold.png

[IM Output] [IM Output]

Comme vous pouvez le constater, le dégradé en niveaux de gris est remappé vers un dégradé délimité par les couleurs fournies, et bien que les couleurs situées en dehors de la plage de niveaux de gris soient également modifiées, elles suivront elles aussi le style de base de la plage de couleurs spécifiée. Cela fait de l'opérateur "[+level-colors](https://imagemagick.org/command-line-options/#level-colors)" un outil extrêmement utile, en particulier pour le remappage d'images en niveaux de gris. Si vous ne fournissez qu'un seul nom de couleur tout en incluant une virgule, la couleur manquante prendra par défaut la valeur 'black' ou 'white' selon le cas.

  magick test.png  +level-colors ,DodgerBlue   levelc_dodger.png
  magick test.png  +level-colors ,Gold         levelc_gold.png
  magick test.png  +level-colors ,Lime         levelc_lime.png
  magick test.png  +level-colors ,Red          levelc_red.png

  magick test.png  +level-colors Navy,         levelc_navy.png
  magick test.png  +level-colors DarkGreen,    levelc_darkgreen.png
  magick test.png  +level-colors Firebrick,    levelc_firebrick.png

[IM Output] [IM Output] [IM Output] [IM Output]
[IM Output] [IM Output] [IM Output]

Cela permet de transformer facilement des images en niveaux de gris en un dégradé de la couleur de votre choix. Par exemple, ici je remappe un dégradé noir et blanc vers un dégradé rouge et blanc (notez la ',' dans l'argument)...

  magick cow.gif   +level-colors red,   cow_red.gif

[IM Output] [IM Output]

Cela n'a pas simplement remplacé le 'noir' par le 'rouge', mais a aussi remappé toutes les couleurs grises anticrénelées vers un mélange approprié de 'rouge' et de 'blanc', produisant un résultat très lisse. [IM Output] Si j'avais simplement effectué un remplacement direct de couleur convertissant les couleurs noires pures en rouge, j'aurais obtenu l'image affreuse (montrée à droite). Voir Facteur de flou pour l'exemple utilisé pour générer cette image. Bien entendu, si vous souhaitez plutôt rendre l'une des couleurs transparente, il vaut mieux utiliser l'opérateur -alpha Shape, car cela nécessite de transférer le dégradé dans le canal alpha.
Si vous ne spécifiez qu'une seule couleur, sans aucun séparateur 'virgule', cette couleur sera utilisée à la fois pour le point noir et le point blanc. Cela signifie que toutes les couleurs de l'image seront réinitialisées vers cette unique couleur (selon les limitations du réglage "[-channel](https://imagemagick.org/command-line-options/#channel)" en cours). |

  magick test.png  +level-colors dodgerblue  levelc_blue.png

[IM Output]
Le résultat est identique à celui obtenu en utilisant "-fill DodgerBlue -colorize 100%" pour Coloriser les images (voir ci-dessous). Si vous voulez aussi régler la transparence de l'image, vous devrez configurer "[-channel](https://imagemagick.org/command-line-options/#channel)" pour inclure le canal de transparence, OU régler le canal alpha sur entièrement opaque, en utilisant soit "-alpha opaque", soit "-alpha off". |

  magick test.png -channel ALL +level-colors dodgerblue levelc_blue2.png

[IM Output]
Voir aussi Vider des images existantes. Voici quelques exemples supplémentaires d'utilisation de cette technique pour ajuster ou 'teinter' une image en couleurs, plutôt qu'une image en niveaux de gris.

  magick rose: +level-colors             navy,lemonchiffon  levelc_faded.gif
  magick rose: +level-colors        firebrick,yellow        levelc_fire.gif
  magick rose: +level-colors 'rgb(102,75,25)',lemonchiffon  levelc_tan.gif

[IM Output] [IM Output] [IM Output] [IM Output]

En résumé, "[+level-colors](https://imagemagick.org/command-line-options/#level-colors)" est un remplacement de couleur par dégradé, un opérateur de teintage linéaire, et peut aussi réinitialiser complètement les couleurs.

Contraste par non-linéarité sigmoïde

À partir d'un article PDF intitulé 'Fundamentals of Image Processing ' (page 44), les auteurs présentent une alternative au contrôle de contraste linéaire (level), fondée sur la correction gamma et connue sous le nom de 'contrôle de contraste par non-linéarité sigmoïde '. Le résultat est un changement de contraste non linéaire et lisse (une 'fonction sigmoïde' en termes mathématiques) sur toute la plage de couleurs, préservant les couleurs blanches et noires, ce qui est bien mieux adapté aux ajustements de couleur des photos. La formule exacte de l'article est très complexe, et contient même une erreur, mais requiert essentiellement deux valeurs d'ajustement. Un niveau de seuil sur lequel centrer la fonction de contraste (typiquement centré sur '50%'), et un facteur de contraste ('10' étant très élevé, et '0.5' très faible). | Pour ceux que cela intéresse, la formule corrigée du 'contrôle de contraste par non-linéarité sigmoïde' est... ( 1/(1+exp(**β** *(**α** -u))) - 1/(1+exp(**β** *(**α**)) ) / ( 1/(1+exp(**β** *(**α** -1))) - 1/(1+exp(**β** * **α**)) ) _Oùα est le niveau de seuil, et β le facteur de contraste à appliquer.

Voici une version alternative de la formule utilisant des variables intermédiaires. x = exp(**β** * (**α** - u)) y = exp(**β** + 1 result (x / y + 1) * (1 / (x + 1) - 1 / y) _La formule est en réalité une courbe exponentielle très simple, l'essentiel de la formule ci-dessus étant conçu pour garantir que 0 reste zéro et que 1 reste un. Autrement dit, le graphe passe toujours par les points 0,0 et 1,1. Et le gradient de changement le plus élevé se trouve au seuil donné.
---|---
Voici par exemple une implémentation en "[-fx](https://imagemagick.org/command-line-options/#fx)" de la formule ci-dessus, résultant d'une valeur de contraste très élevée de '10' et d'une valeur de seuil de '50%'. Ces valeurs ont été intégrées dans les constantes à virgule flottante afin d'accélérer la fonction.

  magick test.png  -fx '(1/(1+exp(10*(.5-u)))-0.006693)*1.013567' \
              sigmoidal.png

[IM Output] [IM Graph] [IM Output]

Heureusement pour nous, IM v6.2.1 intégrait déjà cette fonction complexe sous la forme d'un nouvel opérateur "[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)", permettant une application bien plus simple. |

    magick test.png  -sigmoidal-contrast 10,50% test_sigmoidal.png

[IM Output]
En prime, IM fournit aussi l'inverse, une fonction de 'réduction de contraste sigmoïde' (sous la forme plus '+' de l'opérateur) qui, appliquée avec les mêmes arguments, restaure notre image d'origine (presque exactement). |

    magick test_sigmoidal.png +sigmoidal-contrast 10,50% \
                                             test_sigmoidal_inv.png

[IM Output]
Et ici nous l'appliquons à l'image rose... |

    magick rose: -sigmoidal-contrast 10,50%  rose_sigmoidal.gif

[IM Output]
J'ai bien dit que '10' était un facteur de contraste très fort. En réalité, toute valeur supérieure à celle-ci peut être considérée comme relevant davantage d'une opération de seuil flou que d'un rehaussement de contraste. Pour un exemple pratique d'utilisation de cet opérateur, voir l'exemple d'effets "Gel" avancés, où il est utilisé pour accentuer la zone claire ajoutée à la couleur d'une zone en forme.

Opérateurs de contraste divers

En construction

   -contrast  and   +contrast
         Rather useless minor contrast adjustment operator

<a id="threshold"></a>-threshold
   Threshold the image, any value less than or equal to the given value is
   set to 0 and anything greater is set to the maximum value.

   Note that like level, this is a channel operator, but if the default
   'channel setting' is used only the gray-scale intensity of the image is
   thresholded producing a black and white image.

   magick rose: -threshold 45%  x:

   You can force normal channel behaviour, where each channel is thresholded
   individually buy using "-channel All"

   magick rose: -channel All -threshold 45%  x:

<a id="black-threshold"></a>-black-threshold
<a id="white-threshold"></a>-white-threshold
   This is like -threshold except that only one side of the threshold value is
   actually modified.

   For example, here anything that is darker than 30% is set to black.

   magick rose: -black-threshold 30%  x:
   magick rose: -white-threshold 50%  x:

   These operators however do not seem to be channel effected, so may only be
   suitable for gray-scale images!

Ajustements par modification de l'histogramme

Cette section est le fruit d'un travail conjoint deFred Weinhaus et d'Anthony Thyssen. Qu'est-ce qu'un histogramme ? Un histogramme est un type particulier de graphique. Il se contente de trier les niveaux de couleur des pixels d'une image dans un nombre fixe de 'casiers', chacun couvrant une petite plage de valeurs. Ainsi, chaque casier contient un décompte du nombre de niveaux de couleur (valeurs de pixels) de l'image qui tombent dans cette plage. Le résultat est une représentation de la manière dont les valeurs de couleur qui composent une image sont distribuées, du noir à gauche jusqu'au blanc à droite. L'histogramme peut être généré pour chaque canal séparément ou sous forme d'histogramme global qui considère les valeurs de tous les canaux combinés. Le résultat est souvent affiché sous forme d'image de diagramme en barres. Dans IM, cela se fait à l'aide du format de sortie spécial Histogram:. Par exemple... |

  magick rose: histogram:histogram.gif

[IM Output]
Mais il peut aussi être affiché sous forme de graphique en courbe où la ligne relie les sommets des barres. Cela sera démontré plus loin dans la discussion ci-dessous. Voir Histogram: pour plus de détails sur ce format de sortie spécial. Sa lecture est recommandée à ce stade, car c'est la meilleure façon d'extraire les informations d'histogramme des images avec IM. La hauteur réelle d'un diagramme d'histogramme a peu de signification en soi, car elle est généralement mise à l'échelle de sorte que le pic le plus élevé touche le haut de l'image. Ainsi, la hauteur de chaque 'barre' individuelle n'est pas pertinente. Ce qui importe bien davantage, c'est la distribution de l'histogramme sur toute la plage, et la manière dont les hauteurs relatives se rapportent les unes aux autres sur l'ensemble du diagramme. Lorsque vous examinez un histogramme, vous devez tenir compte des facteurs suivants.

  • L'histogramme forme-t-il une seule large bande de valeurs ? Cela signifie que l'image utilise largement l'espace colorimétrique et possède donc un bon contraste.
  • Ou bien tout est-il regroupé de façon serrée au milieu ou à une extrémité de la plage ? Cela signifie que l'image a un faible contraste, ce qui lui donne un aspect 'voilé' ou 'grisâtre', ou peut-être excessivement clair ou sombre.
  • Forme-t-il deux pics ou plus ? En raison de zones ou régions très différentes au sein de l'image.
  • Où se trouve la plupart des pixels ? À gauche, ce qui signifie que l'image est très sombre. Ou à droite, ce qui signifie qu'elle est très claire. Ou répartis autour du milieu ?
  • Y a-t-il des espaces réguliers ou des vides entre les barres individuelles ? Cela signifie généralement soit que l'image a très peu de pixels, si bien qu'elle n'a pas pu remplir entièrement tout l'histogramme, soit que l'image a subi une réduction de couleurs, ou a été modifiée d'une manière ou d'une autre, produisant ces espaces.

Fondamentalement, un histogramme est une représentation plus simple d'une image, et de ce fait il est bien plus facile de modifier ou d'ajuster une image en termes de son histogramme. Presque toute transformation de couleur mathématique appliquée à une image entraînera normalement non seulement la modification de l'image, mais aussi celle de son histogramme. Cela inclut les opérations linéaires comme l'opérateur Level ou les opérations non linéaires comme l'opérateur Gamma (voir ci-dessus). Les graphes de mappage que nous avons vus plus haut représentent la manière dont les niveaux de gris d'une image, et donc l'histogramme de l'image, sont transformés. Par exemple, créons une image à faible contraste pour l'illustrer. Cependant, le résultat final est qu'il ne modifie pas seulement l'image, mais le fait en modifiant l'histogramme de l'image (en le compressant).

  magick chinese_chess.jpg -contrast -contrast -contrast -contrast \
          chinese_contrast.png

  magick chinese_chess.jpg     histogram:chinese_chess_hist.gif
  magick chinese_contrast.png  histogram:chinese_contrast_hist.gif

[IM Output] [IM Output]
[IM Output] [IM Output]

Dans le cas ci-dessus, "-contrast" est un simple opérateur de type Level qui ajoute juste un peu plus de contraste à l'image. Il en résulte que l'histogramme lui-même s'étale davantage, ce qui l'amène à mieux couvrir l'ensemble de la plage de couleurs possible. Vous pouvez aussi voir, d'après les histogrammes avant et après, que les couleurs se retrouveront avec des espaces et des trous entre les 'casiers', en raison de la façon dont l'étirement a été réalisé. Plus précisément, il crée un 'histogramme' où toutes les couleurs sont placées dans des 'casiers'. Ces couleurs 'mises en casiers' sont ensuite modifiées dans leur ensemble, ce qui provoque le regroupement des couleurs de l'image. Ce n'est pas une manière particulièrement bonne de traiter les couleurs d'une image. Cet opérateur fonctionne cependant à l'aveugle, sans aucune connaissance du contenu de l'image ni de la distribution des couleurs. Il ne peut donc pas s'utiliser sans un certain contrôle de l'utilisateur, car l'opérateur pourrait très facilement rendre toute image à laquelle il est appliqué pire plutôt que meilleure. Dans cette section, nous examinerons des opérateurs de traitement d'image qui étudient l'histogramme de l'image dans le cadre de leur processus de décision. Ils modifient ensuite les images à partir du résultat de cette étude, afin de rehausser une certaine qualité de la distribution des couleurs de l'image. Comme ces opérateurs exploitent des informations réelles provenant de l'image traitée, ils peuvent souvent être utilisés de façon plus globale sur de nombreuses images sans grand contrôle de la part de l'utilisateur. Les opérateurs de ce type incluent des opérateurs de type 'level' linéaires automatiques comme "[-normalize](https://imagemagick.org/command-line-options/#normalize)", "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" et "[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)", mais aussi des opérateurs non linéaires comme "[-equalize](https://imagemagick.org/command-line-options/#equalize)", ainsi que d'autres qui pourraient éventuellement être intégrés à ImageMagick, tel que le script "redist" de Fred Weinhaus.

Étirement de l'histogramme

Les techniques les plus simples, comme dans l'exemple précédent, se contentent d'étirer l'histogramme de l'image vers l'extérieur afin d'améliorer la plage de couleurs. Cependant, au lieu de choisir aveuglément le point noir et le point blanc pour l'opération Level, elles sélectionnent des points d'après l'histogramme de l'image. Fondamentalement, elles comptent le nombre de valeurs de couleur dans chaque casier de l'histogramme, à partir de chacune des deux extrémités et vers l'intérieur, jusqu'à atteindre un certain seuil. Ces points seront alors utilisés comme point noir et point blanc pour l'étirement (level) de l'histogramme. Diagramme nécessaire Fondamentalement, les décomptes de l'histogramme fournissent les valeurs de niveau de gris que l'étirement forcera vers le noir et le blanc. Cela signifie que tous les pixels de l'image qui tombent dans la plage de casiers allant du noir pur jusqu'au niveau de gris correspondant au casier du point noir sélectionné finiront en noir pur. De même, les pixels de l'image qui tombent dans la plage de casiers allant du blanc pur jusqu'au niveau de gris correspondant au casier du point blanc finiront en blanc pur. Les pixels situés en dehors de ces points auront cependant été étirés au-delà de la plage de valeurs de couleur possible, et de ce fait ils seront simplement fixés aux limites de la plage. Autrement dit, ces pixels sont 'écrêtés' 'brûlés' à mesure qu'ils sont convertis vers l'extrême du noir pur ou du blanc pur. Par conséquent, si les limites de 'seuil' pour sélectionner le point noir et le point blanc sont réglées trop haut, vous obtiendrez de nombreuses zones noires et blanches dans l'image, l'histogramme résultant présentant de grands décomptes (barres hautes) aux casiers des extrémités. Exemple de brûlure sévère -- image Chinese Chess ? Récapitulatif des opérateurs d'étirement ('stretch')... -contrast-stretch et -linear-stretch génèrent tous deux un histogramme (utilisant 1024 casiers) pour déterminer la position de couleur à étirer. Ce n'est donc pas 'exact'. L'autre différence tient à la façon dont 'zéro' est géré, et au fait que -linear-stretch effectue en réalité une opération -level pour réaliser l'étirement, tandis que -contrast-stretch utilise les valeurs des casiers de l'histogramme pour un étirement par remplacement de couleur (ce qui introduit un effet d'arrondi sur 1024 quanta). -normalize utilise -contrast-stretch en interne. L'opérateur d'étirement de normalisation mathématiquement parfait est -auto-level. Bien qu'une version parfaite 'point blanc uniquement' ou 'point noir uniquement' soit possible, elle n'a pas été implémentée pour l'instant.

Auto-Level - normalisation mathématique parfaite

"[-auto-level](https://imagemagick.org/command-line-options/#auto-level)" trouve les valeurs les plus grandes et les plus petites de l'image afin de les utiliser pour étirer l'image jusqu'à la pleine plage quantique (Quantum Range). À aucun moment les valeurs ne deviennent 'écrêtées' ou 'brûlées' du fait que l'histogramme soit étiré au-delà de la plage de valeurs. Le réglage "[-channel](https://imagemagick.org/command-line-options/#channel)" déterminera si tous les canaux sont étirés de façon égale et 'synchronisée' (en utilisant le maximum et le minimum sur tous les canaux) ou séparément (chaque canal individuel comme une entité distincte). Pour l'instant, la couleur cachée des pixels entièrement transparents est également utilisée pour déterminer les niveaux, ce qui peut poser certains problèmes lorsque la transparence est en jeu. Cela est considéré comme un bogue.

FUTURE: We actually need three modes of operation...
  synced color channels with 'alpha' (and 'read') masking.
  synced channels (as defined by channel)       (current default)
  individual separate channels   (currently if -channel is set by user)

Il s'agit d'un étirement d'histogramme purement mathématique, tout comme l'opérateur Level manuel. Autrement dit, le minimum sera ajusté à zéro et le maximum à la plage quantique, et une équation linéaire est utilisée pour ajuster toutes les autres valeurs de l'image. Il n'utilise pas de 'casiers d'histogramme' ni aucun autre 'regroupement de valeurs' que d'autres méthodes pourraient employer, que ce soit pour déterminer les niveaux à utiliser ou pour d'autres ajustements d'histogramme.

Normalize

L'opérateur "[-normalize](https://imagemagick.org/command-line-options/#normalize)" est le plus simple de ces trois opérateurs. Il se contente d'étendre l'histogramme en niveaux de gris de façon à ce qu'il occupe toute la plage dynamique des valeurs de gris, tout en écrêtant ou brûlant 2 % à l'extrémité basse (noir) et 1 % à l'extrémité haute (blanc) de l'histogramme. Autrement dit, 2 % des gris les plus sombres de l'image deviendront noirs et 1 % des gris les plus clairs deviendront blancs. Ce n'est pas une grande perte dans la plupart des images, et le résultat global est que le contraste (la plage d'intensité) de l'image sera automatiquement maximisé. Un diagramme idéalisé serait nécessaire ici !__Exemple utilisant chinese chess ? Ici nous créons un dégradé en niveaux de gris, et l'étendons à la pleine plage noir et blanc.

  magick -size 150x100 gradient:gray70-gray30 gray_range.jpg
  magick gray_range.jpg  -normalize  normalize_gray.jpg

[IM Output] [IM Output]

| _Pour des raisons pratiques liées aux imprécisions de couleur du JPEG (voirDistorsion des couleurs JPEG pour plus de détails) et au bruit des images numérisées, "[-normalize](https://imagemagick.org/command-line-options/#normalize)" n'étend pas les couleurs les plus claires et les plus sombres, mais un peu au-delà de ces valeurs. Autrement dit, cela équivaut à un "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" avec une valeur de '2%,99%' (voir ci-dessous).

Cela signifie que si les valeurs de couleur les plus élevées et les plus basses sont très proches, "[-normalize](https://imagemagick.org/command-line-options/#normalize)" échouera, et aucune action ne sera entreprise.

Si vous voulez vraiment étendre exactement les valeurs de couleur les plus claires et les plus sombres jusqu'à leurs extrêmes, utilisez plutôt "[-auto-level](https://imagemagick.org/command-line-options/#auto-level)"._
---|---
Jusqu'à la version IM 6.2.5-5, "[-normalize](https://imagemagick.org/command-line-options/#normalize)" fonctionnait purement comme un opérateur en niveaux de gris. Autrement dit, chacun des canaux rouge, vert, bleu et alpha était étendu indépendamment des autres selon le réglage "[-channel](https://imagemagick.org/command-line-options/#channel)". À partir de la version IM 6.2.5-5, si seul le réglage par défaut "[+channel](https://imagemagick.org/command-line-options/#channel)" est donné, alors "[-normalize](https://imagemagick.org/command-line-options/#normalize)" lie ensemble tous les canaux de couleur et les normalise tous d'une même quantité. Cela garantit que les couleurs des pixels au sein de l'image ne sont pas décalées. Cependant, cela signifie aussi que vous n'obtiendrez peut-être pas de pixel de couleur blanc ou noir pur. Par exemple, ici nous avons ajouté quelques couleurs supplémentaires (un dégradé du bleu au marine) à notre image de test de normalisation.

  magick -size 100x100 gradient:gray70-gray30 \
          -size  50x100 gradient:blue-navy  +append  color_range.jpg
  magick color_range.jpg -normalize  normalize.jpg

[IM Output] [IM Output]

Comme vous pouvez le voir dans le dernier exemple, pour les images en couleurs "[-normalize](https://imagemagick.org/command-line-options/#normalize)" a maximisé tous les canaux ensemble, de sorte qu'un canal a une valeur nulle et un autre canal une valeur maximale. Autrement dit, aucun pixel noir n'a été généré, car toutes les couleurs bleues ajoutées contiennent déjà des valeurs 'nulles' dans les canaux 'rouge' et 'vert'. De ce fait, la borne inférieure de l'image ne s'est pas étendue. Si vous voulez l'ancien comportement de "[-normalize](https://imagemagick.org/command-line-options/#normalize)" (avant IM v6.2.5-5), vous devrez spécifier un réglage "[-channel](https://imagemagick.org/command-line-options/#channel)" non par défaut. Pour les images qui ne contiennent pas de canal alpha (ou matte), vous pouvez simplement utiliser le réglage de canal 'all'. |

  magick color_range.jpg -channel all  -normalize   normalize_all.jpg

[IM Output]
Autrement, vous pouvez normaliser chaque canal comme une image distincte à l'aide de l'opérateur "[-separate](https://imagemagick.org/command-line-options/#separate)" (à partir d'IM v6.2.9-2), puis les "[-combine](https://imagemagick.org/command-line-options/#combine)" à nouveau en une seule image. |

  magick color_range.jpg -separate -normalize -combine normalize_sep.jpg

[IM Output]
Dans ces deux derniers exemples, on voit que les zones en niveaux de gris de l'image sont devenues jaunes, car les canaux 'red' et 'green' ont été éclaircis, tandis que le canal 'blue' n'a été que légèrement assombri. Cela nous amène à un point important

Normalize et les autres opérateurs d'histogramme sont en réalité des opérateurs en niveaux de gris,
la prudence est de mise lorsqu'on les utilise avec des images en couleurs.

En fait, "[-normalize](https://imagemagick.org/command-line-options/#normalize)" n'est qu'un sous-ensemble du "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" plus général, avec des valeurs par défaut de point noir 2 % et point blanc = 1 %. Alors qu'est-ce que "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" ?

contrast-stretch

L'opérateur "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" (ajouté dans IM v6.2.6) est similaire à "[-normalize](https://imagemagick.org/command-line-options/#normalize)", sauf qu'il permet à l'utilisateur de spécifier le nombre de pixels qui seront écrêtés ou brûlés. Autrement dit, il vous donne un certain contrôle sur sa sélection du 'point noir ' et du 'point blanc ' qu'il utilisera pour l'étirement de l'histogramme. Ainsi, l'utilisateur spécifie un décompte (ou un décompte en pourcentage) des gris les plus sombres de l'image qui deviennent noirs et le décompte des gris les plus clairs qui deviennent blancs. Par exemple, ceci remplacera à la fois les 15 % supérieurs et les 15 % inférieurs des couleurs par leurs extrêmes (blanc et noir), en étirant convenablement les 70 % de couleurs restants. Le résultat final est de tenter d'améliorer le contraste global de l'image.

  magick gray_range.jpg  -contrast-stretch 15%  stretch_gray.jpg

[IM Output] [IM Output]

Vous pouvez aussi voir facilement les effets de 'brûlure' et d''écrêtage' en haut et en bas du dégradé ci-dessus, car ces couleurs grises se retrouvent étirées bien au-delà des limites de la plage de couleurs. Et ici je 'brûle' délibérément 90 % des gris les plus sombres, ne laissant que 10 % des pixels les plus clairs à étirer en un dégradé linéaire serré en haut de l'image. |

  magick gray_range.jpg  -contrast-stretch 90%x0%  stretch_black.jpg

[IM Output]
Cela peut être fort utile pour trouver les 'N' pixels les plus clairs d'une image, car ce seront les seuls à ne pas être 'brûlés' vers une valeur de zéro. (Une meilleure méthode consiste à utiliser "[-threshold-black](https://imagemagick.org/command-line-options/#threshold-black)".) Un aspect important de "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" est l'utilisation de zéro pour les décomptes de seuil du point noir et du point blanc. Dans ce cas, "-contast-stretch 0" localisera les casiers minimal et maximal de l'histogramme de l'image. Comme les décomptes commencent effectivement à ces casiers, le résultat est simplement d'étirer les casiers min et max vers le noir plein et le blanc plein. Il en résulte un étirement de contraste avec un écrêtage minimal, voire nul, toutes les valeurs de ces 'casiers' devenant 0 et les valeurs maximales.


| | | |
En construction

Linear-Stretch

À bien des égards, "[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)" est très similaire à l'opérateur "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)" précédent. Les deux fonctions peuvent prendre les arguments de point noir et de point blanc soit comme des décomptes bruts, soit comme des pourcentages du nombre total de pixels concernés. Il existe toutefois plusieurs différences importantes. Une différence tient à la manière dont le point noir et le point blanc par défaut sont calculés. Avec "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)". Si une seule valeur, le point noir, est fournie, alors le point blanc prendra la même valeur. Ainsi "-contrast-stretch 1" équivaut à "-contrast-stretch 1x1" et "-contrast-stretch 1%" équivaut à "-contrast-stretch 1x1%"". Cependant, avec "[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)", si une seule valeur, le point noir, est fournie, alors le point blanc prendra la valeur complémentaire. Autrement dit, si le point noir est spécifié comme un décompte brut, alors le point blanc sera le nombre total de pixels de l'image moins le décompte du point noir. De même, si le point noir est spécifié comme un décompte en pourcentage, alors le point blanc sera 100 % moins le décompte en pourcentage du point noir. Ainsi "-linear-stretch 1%" équivaudra à "-linear-stretch 1x99%". La deuxième différence tient à l'endroit où commencent les décomptes. Considérons un histogramme de 256 casiers (certains 'casiers' pouvant avoir des décomptes nuls) allant du niveau de gris 0 au niveau de gris 255. Dans "[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)", les décomptes commencent à zéro avec les casiers les plus bas (min) et les plus hauts (max) peuplés de l'image (qui peuvent ou non se trouver au casier 0 ou au casier 255 de l'histogramme). Ainsi un point noir de 10 % cumulera les décomptes de tous les casiers après le casier min jusqu'à atteindre 10 %, et étirera le côté noir à partir de ce niveau de gris. Ainsi la quantité brûlée du côté noir de l'histogramme finira par être 10 % plus ce qui se trouvait déjà dans les 'casiers' plus sombres avant lui. De même pour le comptage à partir du côté clair de l'histogramme. Avec "[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)", le décompte commence aux extrémités de l'histogramme, à savoir au casier 0 et au casier 255. Ainsi la quantité brûlée du côté sombre sera toujours la valeur du point noir et la quantité brûlée du côté clair sera toujours la valeur du point blanc. À titre d'exemple, prenons un dégradé de 100 pixels et examinons son histogramme. |

  magick -size 1x100 gradient: \
          -depth 8 -format "%c" histogram:info:

[IM Text]

Comme prévu, chaque casier est également peuplé d'un seul pixel, produisant un décompte de 1. (Pour voir la liste complète, cliquez sur l'image texte de sortie ci-dessus.) Maintenant, faisons la même chose après avoir utilisé "-contrast-stretch 10x10%".

  magick -size 1x100 gradient:   -contrast-stretch 10x10%  \
          -depth 8 -format "%c" histogram:info:

[IM Text]

Et maintenant "-linear-stretch 10x10%".

  magick -size 1x100 gradient:   -linear-stretch 10x10%  \
          -depth 8 -format "%c" histogram:info:

[IM Text]

Nous confirmons donc que pour "-contrast-stretch 10x10%" nous obtenons 11 pixels à chaque extrémité. C'est-à-dire l'équivalent du décompte dans les casiers d'extrémité plus 10 % des pixels de l'image, ce qui équivaut à 10 pixels. Donc 10+1=11 pixels brûlés. En revanche, avec "-linear-stretch", les casiers d'extrémité finissent par ne contenir que 10 pixels, soit 10 % de l'image. Une conséquence de la différence évoquée plus haut est que "-contrast-stretch 0x0" peut modifier l'image, si les casiers peuplés les plus bas et/ou les plus hauts ne sont pas les casiers d'extrémité à 0 et 255. Dans ce cas, l'image sera étirée entre les niveaux de gris correspondant à ces casiers. En revanche, "-linear-stretch 0x0" ne modifiera jamais l'image. Par exemple, prenons le dégradé et compressons ses niveaux de gris de 10 % à chaque extrémité. Autrement dit, nous allons remonter le point noir de 10 % au niveau de gris 26 et abaisser le point blanc de 10 % au niveau de gris 230.

  magick -size 1x100 gradient:   +level 10x90%  \
          -depth 8 -format "%c" histogram:info:

[IM Text]

Maintenant, appliquons "-contrast-stretch 0x0" au dégradé décontrasté ci-dessus

  magick -size 1x100 gradient: -level 10x90%  -contrast-stretch 0x0  \
          -depth 8 -format "%c" histogram:info:

[IM Text]

Et maintenant "-linear-stretch 0x0"

  magick -size 1x100 gradient: -level 10x90%  -linear-stretch 10x10% \
          -depth 8 -format "%c" histogram:info:

[IM Text]

Nous voyons donc que l'image d'origine avait un histogramme qui ne couvrait pas toute la plage dynamique de 0 à 255. Il n'allait qu'entre les niveaux de gris 26 et 230. Mais après application de "-contrast-stretch 0x0", il a été étiré à la pleine plage dynamique. En revanche, "-linear-stretch 0x0" n'a apporté aucune modification à l'histogramme résultant. La troisième différence est que "-contrast-stretch" est sensible aux canaux, alors que "-linear-stretch" ne l'est pas. Cela signifie qu'avec "-contrast-stretch" un ou plusieurs canaux peuvent être modifiés sans affecter les autres. Ainsi, si aucun canal n'est spécifié, l'histogramme global de tous les canaux sera utilisé pour modifier tous les canaux de la même manière, de sorte qu'aucun décalage de couleur ne soit produit. Cependant, si "-channel RGB" est spécifié, alors chaque canal sera étiré séparément et le résultat dépendra des casiers d'extrémité de chaque canal. S'ils sont différents, alors un décalage de couleur sera produit entre les canaux individuels dans l'image résultante. Avec "-linear-stretch", tous les canaux seront traités de façon commune, ce qui garantit qu'aucun décalage de couleur relatif entre canaux ne sera produit. Alors obtenons un identify verbeux et l'histogramme d'une image réelle.

  magick port.png  -verbose -identify +verbose  histogram:port_hist.gif

[IM Text] | [IM Output]
[IM Output]
---|---

Nous voyons qu'aucun des canaux de l'image ci-dessus ne couvre toute la plage dynamique. Notez aussi que chacun des canaux couvre une plage de valeurs uniquement différente. Maintenant, appliquons "-contrast-stretch 1x1%" sans réglage "[-channel](https://imagemagick.org/command-line-options/#channel)".

  magick port.png -contrast-stretch 1x1% \
          -write histogram:port_cs1_hist.gif   port_cs1.png

[IM Output] [IM Output]

Dans le résultat ci-dessus, l'image est étirée de manière cohérente sur tous les canaux. Ainsi, il n'y a aucun décalage de couleur entre les canaux. Maintenant, faisons la même chose mais avec "-channel RGB".

  magick port.png  -channel RGB  -contrast-stretch 1x1% \
          -write histogram:port_cs1rgb_hist.gif    port_cs1rgb.png

[IM Output] [IM Output]

Dans le résultat ci-dessus, parce que nous avons réglé "-channel RGB" au lieu d'utiliser le réglage de canal par défaut, l'image est étirée différemment pour chaque canal. Cela provoque un décalage de couleur entre les canaux. Maintenant, appliquons "-linear-stretch" sans réglage "-channel".

  magick port.png   -linear-stretch 1x1% \
          -write histogram:port_ls1_hist.gif \
          port_ls1.png

[IM Output] [IM Output]

Dans le résultat ci-dessus, l'image est étirée de manière cohérente sur tous les canaux. Il n'y a donc aucun décalage de couleur entre les canaux. Maintenant, faisons la même chose, mais avec "-channel RGB".

  magick port.png  -channel RGB  -linear-stretch 1x1% \
          -write histogram:port_ls1rgb_hist.gif    port_ls1rgb.png

[IM Output] [IM Output]

Dans le résultat ci-dessus avec "-linear-stretch", l'image est étirée de manière cohérente sur tous les canaux et "-channel RGB" est ignoré. Il n'y a donc aucun décalage de couleur entre les canaux et le résultat est identique à celui ci-dessus sans "-channel RGB".

Redistribution de l'histogramme

La redistribution de l'histogramme est une technique non linéaire qui redistribue les casiers d'un histogramme afin d'obtenir une forme particulière. Les deux formes les plus courantes sont uniforme (plate) et gaussienne (en cloche), bien que l'hyperbolique et la loi de Rayleigh soient d'autres types de distributions également utilisés.

Equalize - Redistribution uniforme de l'histogramme

Dans le cas d'une distribution uniforme, les casiers de l'histogramme sont décalés, espacés et combinés de sorte qu'en moyenne l'histogramme présente une hauteur plate ou constante sur toute la plage. C'est ce qu'on appelle l'égalisation d'histogramme. La fonction IM "[-equalize](https://imagemagick.org/command-line-options/#equalize)" fait cela. Malheureusement, elle opère sur chaque canal séparément, plutôt que d'appliquer la même opération à tous les canaux. De ce fait, des décalages de couleur sont possibles lorsqu'elle est appliquée à l'espace colorimétrique RGB. Voici un exemple d'égalisation d'histogramme utilisant la fonction IM -equalize. Remarquez le décalage de la balance des couleurs dû à l'égalisation de chaque canal indépendamment.

  magick zelda.png  -write histogram:zelda_hist.gif \
          -equalize  -write histogram:zelda_equal_hist.gif \
          zelda_equal.png

[IM Output] [IM Output]
[IM Output] [IM Output]

Vous remarquerez peut-être que l'histogramme ne paraît pas très uniforme. Mais si nous convertissons l'image résultante en niveaux de gris et affichons son histogramme, celui-ci semble un peu plus uniforme comparé à l'histogramme en niveaux de gris de l'image d'origine

  magick zelda.png  -colorspace gray   histogram:zelda_ghist.gif

  magick zelda_equal.png  -colorspace gray \
          histogram:zelda_equal_ghist.gif

[IM Output] [IM Output]

L'autre façon d'aborder la redistribution des cases consiste à utiliser une table de correspondance de transformation générée à partir des histogrammes cumulés distincts de chaque canal et de la courbe de distribution intégrée souhaitée. Si l'on ne veut aucun décalage de couleur entre les canaux, alors on utilise l'histogramme combiné de tous les canaux de l'image. Une approximation consiste simplement à utiliser l'histogramme de l'image après l'avoir convertie en niveaux de gris. Fred Weinhaus a développé un script, appelé « redist », qui fait exactement cela. Il redistribue l'histogramme d'une image en une distribution uniforme, tout en appliquant le même changement de manière égale à tous les canaux de couleur.

  redist -s uniform zelda.png  zelda_uniform.png

  magick zelda_uniform.png   histogram:zelda_uniform_hist.gif

[IM Output] [IM Output]
[IM Output] [IM Output]

Remarquez à quel point les résultats diffèrent de l'opérateur IM intégré « [-equalize](https://imagemagick.org/command-line-options/#equalize) ». Plus précisément, toutes les couleurs sont préservées, sans le décalage de couleur que vous avez vu précédemment. Ce que fait le script, c'est travailler sur l'histogramme en niveaux de gris, qu'il applique ensuite à tous les canaux de couleur, de sorte que toutes les couleurs restent solidaires. Pour comparer avec les histogrammes du « [-equalize](https://imagemagick.org/command-line-options/#equalize) » de IM, montrons ici aussi les résultats de l'histogramme en niveaux de gris. Notez que l'histogramme redistribué semble un peu plus aplani (plat, ou uniforme) que celui du equalize de IM.

  magick zelda.png  -colorspace gray   histogram:zelda_ghist.gif

  magick zelda_uniform.png  -colorspace gray \
          histogram:zelda_uniform_ghist.gif

[IM Output] [IM Output]

À VENIR : Ajouter des exemples d'égalisation dans d'autres espaces colorimétriques ! C'est-à-dire le canal des niveaux de gris dans les espaces colorimétriques HSL, HSB et CMYK.

Redistribution gaussienne

L'égalisation d'un histogramme n'est pas la seule façon de modifier la distribution d'histogramme d'une image. En réalité, ce n'est normalement pas très utile, sauf dans les applications de vision par ordinateur. Voici la même image, mais transformée de sorte que son histogramme ait une distribution gaussienne (en forme de cloche). Les valeurs utilisées ici sont une moyenne de gris à 60 %, avec un affaiblissement de 60 sigma de part et d'autre de cette moyenne.

  redist -s gaussian 60,60,60  zelda.png \
         zelda_gaussian.png

  magick zelda_gaussian.png -colorspace gray \
          histogram:zelda_gaussian_ghist.gif

[IM Output] [IM Output]
[IM Output] [IM Output]

À partir de l'histogramme en niveaux de gris résultant, vous pouvez voir que l'image est modifiée de sorte que ses couleurs suivent une distribution de type courbe en cloche gaussienne. Pour les photos, cela produit un résultat d'apparence plus « naturelle ». L'image n'aura pas seulement été optimisée en contraste, mais aussi ajustée en luminosité de sorte que la plupart des pixels de l'image aient une luminosité en niveaux de gris d'environ 60 %.

Méthodologie de redistribution d'histogramme

Alors, comment fonctionne ce type d'ajustement direct de l'histogramme ? Fondamentalement, il calcule l'histogramme de l'image actuelle et celui de la distribution souhaitée. Il détermine ensuite comment la valeur de niveau de gris de chaque « case » doit être modifiée pour que les comptages dans les cases suivent au mieux la distribution souhaitée. Certaines cases peuvent être décalées vers le plus sombre, tandis que d'autres peuvent être décalées vers le plus clair. C'est en fait un processus assez complexe, alors parcourons-le étape par étape.
D'abord, nous devons obtenir les données réelles de l'histogramme depuis ImageMagick, plutôt qu'une image graphique de l'histogramme. Notez que les données proviennent de toutes les valeurs de couleur, combinées en niveaux de gris. Cela a été fait afin de distribuer tous les canaux ensemble, et d'ajuster la luminosité globale de l'image pour suivre la courbe souhaitée.

  magick zelda.png -colorspace gray \
         -depth 8 -format "%c" histogram:info:- |\
    tr -cs '0-9\012' ' ' |\
      awk '# collect the histogram data.
           { bin[$2] += $1; }
           END { for ( i=0; i<256; i++ ) {
                   print bin[i]+0;
                 }
               } ' > zelda_hist_data.txt

  # get the maximum count for any one histogram 'bin'
  max_count=`sort -n zelda_hist_data.txt | tail -n 1`

  # magick histogram into a profile graph of the data
  echo "P2 256 1 $max_count" | cat - zelda_hist_data.txt |\
    im_profile -s - zelda_hist_graph.gif

[IM Output] [IM Output]

Pour recueillir les données, je prends les métadonnées « commentaire » de l'image d'histogramme, que IM y inclut justement à cet effet. Les données sont ensuite nettoyées pour ne laisser que les nombres bruts (à l'aide d'un programme appelé « tr », abréviation de « translate »). Ces données brutes sont ensuite fournies à un autre utilitaire appelé « awk », qui sert à recueillir les comptages réels de l'histogramme pour chaque case. Afin que nous puissions examiner les résultats, je transforme aussi les comptages de l'histogramme en une image de dégradé (via le format de fichier image NetPBM, PGM texte en niveaux de gris, et je l'affiche sous forme de graphe linéaire à l'aide du script « [im_profile](../static/img/scripts/im_profile) ». Il s'agit essentiellement d'une autre façon de générer une image d'histogramme, cette fois directement à partir d'un fichier de données numériques. Maintenant que nous avons les données d'histogramme dans un fichier texte, nous avons aussi besoin de l'histogramme de la fonction que nous voulons que les données redistribuées correspondent. Dans ce cas, il s'agit d'une distribution gaussienne avec une valeur moyenne de 153 (60 % de gris) et une largeur sigma de 60. Les deux valeurs sont exprimées par rapport à la plage de 256 des « cases » de l'histogramme.

  awk '# AWK to generate gaussian distribution graph
        BEGIN { mean = 153;   sigma = 60;
                fact = 1/(2*(sigma/256)^2);
                expo = exp(1);
                for ( i=0; i<256; i++ ) {
                  print int(65535*expo^(-(((i-mean)/256)^2)*fact));
                }
              }' /dev/null  > gaussian_hist_data.txt

   # magick gaussian data into a profile graph
   echo "P2 256 1 65535" | cat - gaussian_hist_data.txt |\
     im_profile -s -b - gaussian_hist_graph.gif

[IM Output]

Les histogrammes ci-dessus sont intéressants et reflètent la distribution d'histogramme d'origine de l'image ainsi que l'état souhaité de l'histogramme. Mais à des fins de conversion, cette forme d'histogramme, bien qu'utile pour notre compréhension, n'est pas très pratique pour nos besoins. En réalité, ce dont nous avons vraiment besoin, ce sont les histogrammes cumulés. Ces histogrammes sont très semblables à un histogramme normal, sauf que chaque « case » de l'histogramme est un comptage de sa « case » plus toutes les « cases » qui la précèdent, en commençant à 0. Autrement dit, chaque « case » est une « accumulation » ou un comptage de toutes les « cases » plus sombres. Ceux-ci sont en fait plus faciles à générer directement à partir de l'image d'origine. Alors, répétons le processus, mais en calculant et en enregistrant les comptages « cumulés ».

  magick zelda.png -colorspace gray \
         -depth 8 -format "%c" histogram:info:- |\
    tr -cs '0-9\012' ' ' |\
      awk '# Collect the cumulative histogram for an image
               { bin[$2] += $1; }
           END { for ( i=0; i<256; i++ ) {
                   cum += bin[i];
                   print cum;
                 }
               } ' > zelda_cumhist_data.txt

  total_count=`tail -n 1 zelda_cumhist_data.txt`
  echo "P2 256 1 $total_count" | cat - zelda_cumhist_data.txt |\
    im_profile -s - zelda_cumhist_graph.gif

  awk '# AWK to generate gaussian distribution cumulative graph
        BEGIN { mean = 153;   sigma = 60;
                fact = 1/(2*(sigma/256)^2);
                expo = exp(1);
                for ( i=0; i<256; i++ ) {
                  gas[i] = expo^(-(((i-mean)/256)^2)*fact);
                  total += gas[i]
                }
                for ( i=0; i<256; i++ ) {
                  cum += gas[i];
                  print int(65535*cum/total);
                }
              }' /dev/null  > gaussian_cumhist_data.txt

  total_count=`tail -n 1 gaussian_cumhist_data.txt`
  echo "P2 256 1 $total_count" | cat - gaussian_cumhist_data.txt |\
    im_profile -s -b - gaussian_cumhist_graph.gif

[IM Output]
Histogramme cumulé
de l'image | [IM Output]
Histogramme cumulé
gaussien
---|---

Maintenant, ce que nous devons faire, c'est transformer l'histogramme cumulé de l'image en l'histogramme cumulé gaussien. Pour cela, chaque valeur de gris de l'image d'entrée sert à trouver sa valeur cumulée « normalisée ». Celle-ci est ensuite mise en correspondance avec la même valeur cumulée dans la distribution gaussienne, puis sa valeur de gris correspondante est trouvée. Ce diagramme devrait rendre le processus de correspondance plus clair…

[diagram]

La commande suivante effectue la recherche pour chaque valeur de couleur 8 bits possible, afin de générer une table de correspondance de couleurs, ou CLUT. Cette image spéciale peut ensuite servir à mettre en correspondance les valeurs de couleur de l'image d'origine avec les nouvelles valeurs nécessaires pour redistribuer l'histogramme de l'image.

  # Generate a CLUT to Redistribute the Histogram
  paste  zelda_cumhist_data.txt   gaussian_cumhist_data.txt |\
    awk '# AWK to generate gaussian distribution graph
              { bin[NR] = $1;   gas[NR] = $2;  }
          END { k=0;  # number of pixels less than this value
                print "P2 256 1 65535";
                for ( j=0; j<256; j++ ) {
                  while ( k<255 &&
                            gas[k]/gas[255] <= bin[j]/bin[255] ) {
                    k++;
                  }
                  print 65535*k/255;
                }
              }' |\
      magick pgm:- gaussian_clut.png

  magick zelda.png   gaussian_clut.png -clut   zelda_redist.png

[IM Output] [IM Output]
[IM Output] [IM Output]

Comme vous pouvez le voir, convertir l'histogramme d'une image pour tenter de suivre une fonction de distribution spécifique, telle qu'une courbe en cloche gaussienne, est un processus assez complexe et fortement numérique. Le voici tout entier en une seule commande plutôt longue et complexe…

  magick zelda.png -colorspace gray \
         -depth 8 -format "%c" histogram:info:- |\
    tr -cs '0-9\012' ' ' |\
      awk '# AWK to generate gaussian distribution graph
            { # just read in image histogram into a 'bin' table
                  bin[$2] += $1;
                }
            END { # Generate Gaussian Histogram
                  mean = 153;   sigma = 60;
                  fact = 1/(2*(sigma/256)^2);
                  expo = exp(1);
                  for ( i=0; i<256; i++ ) {
                    gas[i] = expo^(-(((i-mean)/256)^2)*fact);
                  }
                  # Convert normal histograms to cumulative histograms
                  for ( i=0; i<256; i++ ) {
                    gas[i] += gas[i-1];
                    bin[i] += bin[i-1];
                  }
                 # Generate Redistributed Histogram
                 k=0;  # number of pixels less than this value
                 print "P2 256 1 65535";
                 for ( j=0; j<256; j++ ) {
                   while ( k<255 &&
                            gas[k]/gas[255] <= bin[j]/bin[255] ) {
                     k++;
                   }
                   print 65535*k/255;
                 }
                }' |\
        magick zelda.png   pgm:-  -clut   zelda_gaussian_redist.png

[IM Output] [IM Output]

Juste quelques derniers mots sur la technique ci-dessus.

  • L'usage de « awk » pour effectuer les calculs afin d'accélérer le script « [redist](http://www.fmwconcepts.com/imagemagick/redist/) » de Fred Weinhaus a été suggéré et contribué par Anthony Thyssen.
  • Pour appliquer la technique de redistribution ci-dessus afin de générer une distribution « uniforme » ou « égalisée », l'histogramme de la fonction est simplement une constante. Cela donne à son tour une distribution intégrée qui est simplement la formule y = x, ou une simple ligne droite diagonale. Appliquer la même technique de conversion conduit à une image CLUT qui s'avère identique à l'histogramme cumulé de l'image d'entrée. Autrement dit, pour une égalisation de l'histogramme, vous pouvez simplement transformer l'histogramme cumulé de l'image en un CLUT et l'appliquer directement à l'image.
  • La plupart des logiciels de traitement d'image, y compris ImageMagick à l'heure actuelle, appliquent les formules de transformation directement aux valeurs de l'image elle-même, plutôt que de générer un CLUT intermédiaire. Cependant, comme les histogrammes et donc les histogrammes cumulés ont une taille limitée (256 « cases » typiquement), cela peut conduire à de graves erreurs, puisque les valeurs de couleur de l'image peuvent être arrondies au cours du processus. Or, avec ImageMagick, nous générons un CLUT intermédiaire (contenant ces mêmes erreurs d'arrondi), puis nous transformons les valeurs non arrondies de l'image d'origine au travers du CLUT préparé en utilisant une interpolation linéaire des valeurs. Grâce à cette interpolation, les valeurs de couleur de la nouvelle image sont plus précises, car elles n'ont pas été arrondies ou « rangées en cases » pendant le traitement.

Le procédé ci-dessus finira, espérons-le, par être intégré à ImageMagick. En attendant, le script « redist » de Fred Weinhaus est disponible pour accomplir cette tâche. Vous pourriez aussi être intéressé par le script « retinex » de Fred, qui tente d'apporter des améliorations automatiques similaires aux images, dans des régions localisées de l'image, plutôt que globalement comme le fait cette technique.


Ajustements de niveaux à faire soi-même

Ajustements linéaires mathématiques de l'histogramme

Les diverses formes de base d'ajustements de niveaux présentées ci-dessus ajustent linéairement les couleurs de l'image. Ces changements peuvent aussi être appliqués mathématiquement. Par exemple, en multipliant l'image par une couleur donnée, nous fixons toutes les zones purement blanches à cette couleur. Alors lisons simplement notre image, créons une image contenant la couleur voulue, puis multiplions l'image d'origine par cette couleur à l'aide de l'opérateur libre « [-fx](https://imagemagick.org/command-line-options/#fx) » de IM, ou opérateur à faire soi-même.

  magick test.png  -size 1x1 xc:Yellow \
          -fx 'u*v.p{0,0}'    fx_linear_white.png

[IM Output] [IM Output]

En faisant lire à « [-fx](https://imagemagick.org/command-line-options/#fx) » la couleur depuis une seconde image « v », il devient facile de changer la couleur, sans avoir besoin de convertir les couleurs en valeurs RGB pour les mathématiques. Si vous utilisiez un logiciel de traitement d'image graphique sophistiqué comme « [Gimp](http://www.gimp.org/) » ou « [Photoshop](http://www.adobe.com/products/photoshopfamily.html) », l'opération ci-dessus aurait été appliquée à une image en ajustant la « courbe » du graphe d'histogramme des couleurs de l'image. [IM Output] Par exemple, à droite se trouve un graphe généré par « [gnuplot](http://www.gnuplot.info/) » (voir le script « [**im_histogram**](../static/img/scripts/im_histogram) ») de la formule mathématique montrant ce qui arrive à un seul des trois canaux RGB. La couleur d'origine (ligne verte) est remise en correspondance linéairement vers une couleur plus sombre (ligne rouge). Teinter linéairement les couleurs noires est aussi assez simple. Par exemple, pour mettre en correspondance linéaire « black » vers une couleur or telle que « rgb(204,153,51) » (tout en laissant « white » à « white »), il faudrait une formule mathématique telle que…

          result = 1-(1-color)*(1-intensity)

Cette formule inverse les couleurs, multiplie l'image par la couleur inversée voulue, puis inverse à nouveau l'image. Le résultat est une teinte du côté noir de l'échelle de gris, laissant le blanc inchangé.

  magick test.png  -size 1x1 xc:'rgb(204,153,51)'  \
          -fx '1-(1-v.p{0,0})*(1-u)'   fx_linear_black.png

[IM Output] [IM Output] [IM Output]

Un graphe d'histogramme « gnuplot » de la formule de remise en correspondance est également affiché ci-dessus pour votre référence. Avec une formule légèrement plus compliquée, vous pouvez remplacer linéairement à la fois l'extrémité « black » et l'extrémité « white » de l'échelle de gris par des couleurs spécifiques.

  magick test.png  -size 1x2  gradient:gold-firebrick \
          -fx 'v.p{0,0}*u+v.p{0,1}*(1-u)'   fx_linear_color.png

[IM Output] [IM Output] [IM Output]

Le « -size 1x2 gradient:color1-color2 » ci-dessus ne sert qu'à générer une image de deux pixels colorés que la formule « [-fx](https://imagemagick.org/command-line-options/#fx) » peut référencer. La première couleur remplace le blanc, tandis que la seconde remplace le noir, toutes les autres étant interpolées entre le blanc et le noir. Comme c'est typique d'un opérateur en niveaux de gris, chaque canal RGB est traité comme un canal en niveaux de gris distinct, bien que l'interpolation linéaire soit différente pour chaque canal. Ceci équivaut d'ailleurs exactement à l'opérateur d'ajustements de niveaux par couleur « [+level-colors](https://imagemagick.org/command-line-options/#level-colors) ». Cependant, contrairement à « [+level-colors](https://imagemagick.org/command-line-options/#colors) », les couleurs à utiliser peuvent bien sûr provenir de n'importe quelle source d'image, et pas seulement des noms de couleur fournis en argument. L'usage direct de noms de couleur reste toutefois possible. |

  magick test.png   -fx "yellow*u+green*(1-u)"  fx_linear.png

[IM Output]

Ajustements non linéaires mathématiques de l'histogramme

Bien que les ajustements linéaires de couleur soient importants, et que des méthodes plus rapides soient disponibles, il existe de nombreuses situations où un ajustement « de niveaux » linéaire n'est pas ce que l'on veut, et c'est là que l'opérateur à faire soi-même « [-fx](https://imagemagick.org/command-line-options/#fx) » devient plus utile. Eh bien, une formule alternative pour l'ajustement linéaire est « -fx 'v.p{0,1}+(v.p{0,0}-v.p{0,1})*u' », qui a l'avantage que le « u » peut être remplacé par une seule fonction aléatoire « f(u) » pour produire un changement de couleur non linéaire. Cela vous permet de faire des choses plus intéressantes. Par exemple, que faire si, dans le dernier exemple, vous vouliez pousser toutes les couleurs vers le côté « black », donnant à l'image une couleur plus proche de « firebrick ».

  magick test.png -size 1x2  gradient:gold-firebrick \
          -fx 'v.p{0,1}+(v.p{0,0}-v.p{0,1})*u^4'  fx_non-linear.png

[IM Output] [IM Output] [IM Output]

Dans un exemple plus concret, Adelmo Gomes avait besoin d'un ajustement de couleur pour un script automatisé de recoloration de cartes météo qu'il développait. Dans ce cas, il voulait teinter les parties purement noires de l'image en un bleu à 0,25, mais laisser le reste de l'échelle de gris intact, en particulier les blancs et les gris intermédiaires de l'image. Seule la couleur bleue nécessitait un tel ajustement, ce qu'il faisait alors à la main dans un éditeur d'image. Par exemple, vous pourriez utiliser une formule quadratique comme « u^2 » pour teinter l'extrémité noire de l'histogramme en une couleur bleue « .25 ». Seul le canal bleu a besoin d'être modifié, si bien que la valeur a été insérée directement dans la formule.

  magick test.png  -channel B  -fx '.25+(1-.25)*u^2'  fx_quadratic.png

[IM Output] [IM Output] [IM Output]

Cependant, bien que cela produise un résultat raisonnable, cela assombrit légèrement les gris intermédiaires, produisant une couleur jaunâtre maladive. Pour éviter cela, on peut utiliser à la place une fonction « exponentielle », afin de donner un meilleur contrôle du processus de teinte.

  magick test.png  -channel B  -fx '.3*exp(-u*4.9)+u'  fx_expotential.png

[IM Output] [IM Output] [IM Output]

Là encore, le graphe montre comment le canal bleu a été modifié pour donner au noir une teinte bleu foncé distinctive. La seconde valeur (« 4.9 ») est l'affaiblissement vers un graphe linéaire « +u ». Plus cette valeur est petite, plus l'affaiblissement est lent et plus l'ajustement devient linéaire. Plus la valeur est grande, plus l'« affaiblissement » est spectaculaire. La valeur peut avoir besoin d'être ajustée pour différentes valeurs de couleur, ce n'est donc pas une bonne formule générale pour teinter le noir en général, mais elle est parfaite pour teinter des cartes météo. En règle générale, si vous pouvez exprimer mathématiquement l'ajustement de couleur voulu, vous pouvez alors utiliser l'opérateur « [-fx](https://imagemagick.org/command-line-options/#fx) » pour obtenir les résultats désirés.

Ajustements par « courbes »

[diagram] Normalement, dans un éditeur photo graphique, on vous présenterait un diagramme de « courbes » d'histogramme tel que celui que j'ai montré à gauche. L'utilisateur peut alors modifier la « courbe » en déplaçant quatre (ou plus) points de contrôle, et la fonction d'ajustement de l'histogramme suivra ces points. Les points de contrôle spécifient généralement qu'après ajustement, le premier niveau de gris devient le second niveau de gris. Ainsi, un point comme 0.0,0.2 signifie fondamentalement qu'un gris à 0 % (noir) devrait, après ajustement, devenir un niveau de gris à 20 %. Or IM ne vous permet pas de spécifier directement des « points de contrôle » pour générer un ajustement par « courbe » ; ce qu'il veut, c'est la formule mathématique de cette « courbe » générée. Heureusement pour nous, il existe des programmes capables de générer la formule de la courbe à partir des points de contrôle, notamment « [gnuplot](http://www.go.dlr.de/pdinfo_dv/gnuplot.html) », « [fudgit](http://www.go.dlr.de/pdinfo_dv/fudgit.html) », « mathematica » et « [matlab](http://www.mathworks.com/) », ainsi que bien d'autres logiciels mathématiques. Ce qui suit est une méthode que vous pouvez utiliser pour générer la formule à partir de quatre points de contrôle à l'aide de « gnuplot », qui est un paquet supplémentaire standard installable sur la plupart des distributions Linux, ainsi que sous Windows.

  ( echo "0.0 0.2";  echo "1.0 0.9"; \
    echo "0.2 0.8";  echo "0.7 0.5"; )   > fx_control.txt

  ( echo 'f(x) = a*x**3 + b*x**2 + c*x + d'; \
    echo 'fit f(x) "fx_control.txt" via a, b, c, d'; \
    echo 'print a,"*u^3 + ",b,"*u^2 + ",c,"*u + ",d'; \
  ) | gnuplot 2>&1 | tail -1             > fx_funct.txt

| [Data]

Points de contrôle [Gnuplot]
[Gnuplot]
Fonction FX ajustée par Gnuplot

| _Notez que le nombre de paramètres (« a » à « d » ci-dessus) nécessaires à l'ajustement de courbe doit être égal au nombre de points de contrôle que vous fournissez. Ainsi, si vous voulez cinq points de contrôle, vous devez inclure un terme « e » supplémentaire à la fonction.

Si votre courbe d'histogramme passe par les points de contrôle fixes 0,0 et 1,1, vous n'avez en réalité besoin que de deux paramètres, car « d » sera égal à « 0 » et « c » sera égal à « 1-a-b ».

_
---|---
Un guide d'utilisation plus détaillé de ce qui précède, spécifiquement destiné aux utilisateurs de Windows mais valable aussi pour les utilisateurs de Linux, a été publié sur StackOverflow : IM Curves using Gnuplot on Windows. Comme vous pouvez le voir sur l'image supplémentaire générée par « gnuplot » ci-dessus, la fonction générée s'ajuste parfaitement aux points de contrôle. De plus, comme elle a généré une formule de style « -fx », elle peut être utilisée telle quelle comme argument de IM. Par exemple… |

  magick test.png    -fx "`cat fx_funct.txt`"     fx_funct_curve.png

[IM Output]
Pour permettre aux utilisateurs de transformer plus facilement des points de contrôle en une fonction d'ajustement d'histogramme, j'ai créé un script shell appelé « [**im_fx_curves**](../static/img/scripts/im_fx_curves) » qui appelle « gnuplot » et produit une équation polynomiale d'apparence plus soignée à partir des points de contrôle donnés. Gabe Schaffer a également fourni une version perl (utilisant un module de bibliothèque « Math::Polynomial » téléchargé) appelée « [**im_fx_curves.pl**](../static/img/scripts/im_fx_curves.pl) » pour faire la même chose. L'un ou l'autre script peut être utilisé. Par exemple, voici une courbe différente avec 5 points de contrôle…

    im_fx_curves  0,0.2  0.3,0.7  0.6,0.5  0.8,0.8  1,0.6  > fx_curve.txt

[Gnuplot] | | | [Gnuplot]

Cependant, la fonction FX est très lente. Mais depuis IM 6.4.8-9, vous pouvez désormais passer directement les coefficients découverts de l'expression polynomiale ajustée dans une méthode de fonction polynomiale. Vous pouvez générer la liste des coefficients séparés par des virgules à l'aide de « [**im_fx_curves**](../static/img/scripts/im_fx_curves) » avec une option spéciale « -c »…

    im_fx_curves -c  0,0.2  0.3,0.7  0.6,0.5  0.8,0.8  1,0.6  > coefficients.txt

[Gnuplot] | | | [Gnuplot]

Par exemple, appliquons ces courbes à notre image de test… |

  magick test.png  -function Polynomial `cat coefficients.txt`  test_curves.png

[IM Output]
Un exemple plus concret de cette méthode est détaillé dans l'exemple avancé des effets « Aqua ». Une autre façon de générer des « courbes » est examinée dans la discussion du forum IM Arbitrary tonal reproduction curves.


Teinter les images

Teinter uniformément les images en couleur

Généralement, teinter une image s'obtient en mélangeant l'image avec une couleur dans une certaine proportion. Cela peut se faire à l'aide d'un opérateur Evaluate ou de techniques de mélange d'images, mais celles-ci ne sont pas simples à utiliser. Heureusement pour nous, une méthode plus simple pour diffuser une couleur uniforme dans une image est disponible à l'aide de l'opérateur d'image « [-colorize](https://imagemagick.org/command-line-options/#colorize) ». Cet opérateur mélange la couleur « [-fill](https://imagemagick.org/command-line-options/#fill) » courante dans toutes les images de la séquence d'images actuelle. Le canal alpha de l'image d'origine est préservé, seuls les canaux de couleur étant modifiés. Par exemple, pour éclaircir une image (en niveaux de gris ou non), nous utilisons « [-colorize](https://imagemagick.org/command-line-options/#colorize) » pour mélanger une certaine quantité de blanc dans l'image, la rendant plus lumineuse sans la saturer complètement.

  magick test.png  -fill white -colorize 50%  colorize_lighten.png

[IM Output] [IM Output]

De la même manière, on peut utiliser une couleur de remplissage « black » pour assombrir une image.

  magick test.png  -fill black -colorize 50%  colorize_darken.png

[IM Output] [IM Output]

Pour ramener les deux extrémités de l'image vers les tons moyens, on utilise une couleur de remplissage grise précise. La couleur « gray50 » est exactement la couleur médiane du spectre de couleurs RGB.

  magick test.png  -fill gray50 -colorize 40%  colorize_grayer.png

[IM Output] [IM Output]

Cette méthode sert aussi souvent de « décontraste », semblable à ce que fournit l'opérateur d'ajustement de niveaux inversé, mais avec moins de contrôle. L'opérateur « [-colorize](https://imagemagick.org/command-line-options/#colorize) » vous permet aussi de spécifier des pourcentages de dissolution pour chacun des trois canaux de couleur séparément. C'est utile pour assombrir (ou éclaircir) une image de façon linéaire et particulière. Avant IM v6.7.9, l'opérateur « [-colorize](https://imagemagick.org/command-line-options/#colorize) » ne modifiait pas du tout le canal alpha. À partir de cette version, comme on le voit ci-dessus, il teinte désormais uniformément tous les pixels, y compris les pixels entièrement transparents.
Un usage courant de l'opérateur « [-colorize](https://imagemagick.org/command-line-options/#colorize) » consiste simplement à remplacer toutes les couleurs d'une image existante (teinte à « 100% »), tout en préservant la forme de transparence (alpha) de l'image, afin de produire un masque coloré. Cependant, à partir d'IM v6.7.9, vous devrez protéger le canal alpha de cet opérateur en le désactivant, puis en le réactivant. (Voir Alpha On pour plus de détails). Par exemple…
  magick test.png -alpha off \
          -fill blue -colorize 100% \
          -alpha on  colorize_shape.png

[IM Output]
Sans cette protection, colorize aurait entièrement vidé le canevas vers la couleur donnée… |

  magick test.png -fill blue -colorize 100% colorize_blank.png

[IM Output]
Toutefois, s'il est possible d'utiliser une version d'IM antérieure à IM v6.7.9, je vous recommande d'inclure une opération « -alpha opaque » ou « -alpha off » dans ce qui précède afin de garantir que l'image obtenue est bien l'image entièrement vide que vous attendez. Notez que vous pouvez vider des canevas plus rapidement avec l'opérateur Ajustements de niveaux par couleur en utilisant une seule couleur, plutôt qu'une plage de couleurs. Voir aussi Canevas vierges.

Teinte des couleurs de tons moyens

Alors que l'opérateur Colorize applique la couleur « [-fill](https://imagemagick.org/command-line-options/#fill) » pour teinter linéairement toutes les couleurs d'une image, l'opérateur « [-tint](https://imagemagick.org/command-line-options/#tint) » applique la couleur « [-fill](https://imagemagick.org/command-line-options/#fill) » de manière à ne teinter que les couleurs de tons moyens d'une image. C'est un opérateur en niveaux de gris, et la couleur est atténuée ou renforcée par le pourcentage donné (0 à 200). Pour en limiter les effets, elle est aussi ajustée à l'aide d'une formule mathématique afin de ne pas affecter le noir et le blanc, mais d'avoir le plus grand effet sur les couleurs de tons moyens de chaque canal de couleur. Un « -tint 100 » teinte essentiellement une couleur grise parfaite de sorte qu'elle atteigne la moitié de l'intensité de la couleur de remplissage. Une valeur plus faible la teinte vers une couleur plus sombre, tandis qu'une valeur plus élevée la teinte vers une correspondance parfaite avec cette couleur.

  magick test.png  -fill red  -tint 40 tint_red.png

[IM Output] [IM Output]

Le vert de l'image de test n'est pas un vert RGB véritable, mais le « green » de Scalable Vector Graphics, qui n'est que moitié moins lumineux qu'un vert véritable. À ce titre, c'est également une couleur de ton moyen, et il est donc affecté par l'opérateur « [-tint](https://imagemagick.org/command-line-options/#tint) », devenant plus sombre, contrairement aux taches de couleur rouge et bleue de l'image de test. Vous pouvez aussi teinter individuellement les composantes de couleur, à l'aide d'une liste de pourcentages séparés par des virgules. Par exemple « -tint 30,40,20,10 ». Cela peut cependant être délicat à utiliser et nécessiter quelques essais pour obtenir un bon résultat. Mieux vaut spécifier la couleur voulue pour des gris à 50 % parfaits. | _[IM Output] L'opérateur « [-tint](https://imagemagick.org/command-line-options/#tint) » fonctionne en prenant d'une certaine manière la couleur et les pourcentages donnés, puis en ajustant les couleurs individuelles de l'image selon l'intensité de la couleur « [-fill](https://imagemagick.org/command-line-options/#fill) », d'après la formule suivante. (voir le graphique à droite)

_ f(x)=(1-(4.0*((x-0.5)*(x-0.5)))) _Une fonction quadratique, dont le résultat est utilisé comme vecteur pour la couleur existante dans l'image. Comme on peut le voir, elle donne un remplacement complet de la couleur pour un gris moyen pur, sans aucun ajustement pour le blanc ni pour le noir.

Ou, pour des opérateurs de plus bas niveau permettant de faire ce genre de chose soi-même, voir l'opérateur FX, ainsi que les opérateurs Evaluate et Function.

_
---|---
L'opérateur de teinte est parfait pour ajuster les résultats de la sortie de « [-shade](https://imagemagick.org/command-line-options/#shade) » (voir Images de surbrillance par superposition d'ombrage), comme dans les exemples des Images de puces 3D. Vous pouvez aussi utiliser « [-tint](https://imagemagick.org/command-line-options/#tint) » pour éclaircir ou assombrir les couleurs de tons moyens d'une image. C'est un peu comme un « ajustement gamma » pour les images, mais pas exactement. Par exemple, utiliser une valeur de teinte supérieure à 100 avec une couleur « white » éclaircira les tons moyens.

  magick test.png  -fill white  -tint 130 tint_lighter.png

[IM Output] [IM Output]

Alors qu'une valeur inférieure à 100 assombrira les couleurs.

  magick test.png  -fill white  -tint 70 tint_darker.png

[IM Output] [IM Output]

| _Pour le moment, une couleur grise de ton moyen pur ne sera pas mappée vers la couleur « [-fill](https://imagemagick.org/command-line-options/#fill) ».

L'argument en pourcentage n'est pas un « pourcentage de fusion » mais plutôt un « pourcentage de luminosité ». Il ne fonctionnera par exemple pas du tout pour une couleur de remplissage « black ».

J'ignore pourquoi cela a été conçu ainsi ou l'histoire qui se cache derrière. Cela rend toutefois très délicat le contrôle précis des couleurs finales lors de la teinte d'images en niveaux de gris.

L'utilisation de la teinte par composition Overlay ci-dessous fournira une teinte des gris de tons moyens plus exacte (quoique très linéaire, plutôt que parabolique).

_
---|---

Coloration en ton sépia

Technique photographique spéciale de recoloration, « [-sepia-tone](https://imagemagick.org/command-line-options/#sepia-tone) » consiste essentiellement à convertir l'image en niveaux de gris, puis à colorer tous les tons moyens vers une couleur brune particulière. |

  magick rose:  -sepia-tone 65%     sepia-tone.jpg

[IM Output]
L'argument donné est le « point médian » en niveaux de gris qui doit se rapprocher le plus de la couleur sépia, laquelle ressemble à la couleur « Goldenrod ». L'usage le plus courant consiste à générer un effet duotone afin de produire des photos « d'aspect ancien » (voir Wikipédia sur le ton sépia). Par exemple, ici je teinte une image de rose en niveaux de gris au contraste renforcé, avec diverses couleurs, pour obtenir des effets similaires au ton sépia. La couleur à utiliser dépend de l'effet exact que vous recherchez.

  magick rose: -colorspace gray -sigmoidal-contrast 10,40%  rose_grey.jpg
  for color in      goldenrod  gold  khaki  wheat
  do
    magick rose_grey.jpg  -fill $color   -tint 100    sepia_$color.jpg
  done

[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

Je trouve personnellement que mélanger ou fondre une image en ton sépia avec l'originale, afin d'en réduire l'effet, peut aussi produire un meilleur effet « délavé ». |

  magick rose: \( +clone -sepia-tone 60% \) -evaluate-sequence mean  sepia-tone_blended.jpg

[IM Output]
Voir aussi les tables de correspondance de couleurs Hald pour une méthode permettant d'enregistrer des variations de changement de couleur bien plus complexes, comme le dernier exemple ci-dessus.

Effet duotone

Un « duotone » est une méthode d'impression où l'on mélange les niveaux de gris d'une image (encre noire) avec une autre couleur afin d'obtenir un meilleur résultat, avec un budget ou un équipement d'impression limité. Par exemple, si toutes les vieilles photos que l'on voit aujourd'hui ont un aspect sépia, c'est parce que les encres sépia ont survécu sans se détériorer ni pâlir avec le temps. Les autres formats d'images « en noir et blanc » se sont estompés jusqu'à devenir inutilisables. Voir l'opérateur de ton sépia ci-dessus. Une autre technique duotone appelée « cyanotype » (plus connue sous le nom de « bleus » ou « blue-prints ») fut largement utilisée comme méthode pour réaliser des copies à grande échelle des dessins d'architecte originaux en noir et blanc. Rappelez-vous que cette technique était utilisée bien avant l'invention des lasers et de la photocopie qui en a découlé (et de Xerox). Pour plus d'informations, voir l'entrée Wikipédia Duotone, ainsi que Faux duotones vs vrais duotones. L'opérateur Tint ci-dessus produit toutefois un fac-similé raisonnable de l'effet duotone, tout comme il l'a fait pour l'effet sépia précédent.

  magick rose: -colorspace gray -sigmoidal-contrast 10,40%  rose_grey.jpg
  for color in      blue  darkcyan  goldenrod  firebrick
  do
    magick rose_grey.jpg   -fill $color   -tint 100    duotone_$color.jpg
  done

[IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

Notez que j'ai généralement choisi une version plus sombre de la couleur « duotone », mais vous pouvez aussi l'ajuster à l'aide de l'argument de l'opérateur Tint. La luminosité et le contraste peuvent également être ajustés à l'aide des arguments de l'opérateur de contraste sigmoïdal. Une autre façon plus précise de générer un duotone à partir de trois couleurs (les couleurs du point noir, du point médian et du point blanc) consiste à utiliser une table de correspondance de couleurs (voir ci-dessous). Voici juste un exemple rapide où je crée un duotone très inhabituel en utilisant les couleurs « Black », « Chocolate » et « LemonChiffon ». Et oui, la couleur du point noir est généralement laissée en noir, ce qui explique pourquoi on parle habituellement de duo -tone.

  magick -size 1x1 xc:Black xc:Chocolate xc:LemonChiffon \
                                   +append     duotone_clut.gif
  magick -size 20x256 gradient: -rotate 90   duotone_clut.gif \
          -interpolate Bicubic -clut       duotone_gradient.gif
  magick rose_grey.jpg   duotone_clut.gif \
          -interpolate Bicubic -clut       rose_duotone.jpg

[IM Output] [IM Output]
[IM Output] [IM Output] [IM Output]

L'avantage de ce qui précède est un contrôle exact de la couleur du point médian (contrairement à Tint, qui n'est pas exact). Vous pouvez aussi utiliser directement les trois couleurs de votre choix, comme dans l'exemple ci-dessus, ou utiliser un dégradé étendu des couleurs pour un contrôle plus fin des couleurs entre les trois (ou plus) points de contrôle. La technique vous offre également une manière très compacte de stocker l'effet duotone spécifique, pour un usage répété et futur. Voir aussi les tables de correspondance de couleurs Hald pour une méthode plus complexe d'enregistrement des changements de couleur, qui va au-delà de la coloration d'images en niveaux de gris.

Teinte de couleur, à faire soi-même

L'un des plus gros problèmes de « [-tint](https://imagemagick.org/command-line-options/#tint) » est que c'est un opérateur en niveaux de gris (ou vectoriel). Autrement dit, il traite chacun des canaux rouge, vert et bleu de façon totalement indépendante des autres. Cela signifie à son tour qu'une couleur primaire ou secondaire comme « blue » ou « yellow » n'est pas affectée par « [-tint](https://imagemagick.org/command-line-options/#tint) », même si tous les niveaux de gris le sont. Cependant, grâce à diverses transformations mathématiques de canaux comme l'opérateur FX et les opérateurs Evaluate et Function plus rapides, vous pouvez générer vos propres superpositions de couleur pour modifier l'image. C'est-à-dire teinter l'image de manière similaire à ce que fait l'opérateur Colorize. Par exemple, ici je transforme le niveau de luminosité en niveaux de gris d'une image en une superposition semi-transparente de la couleur voulue. |

  magick test.png  \( +clone -colorspace gray \
               -function polynomial -4,4,0 -background Gold -alpha shape \) \
          -composite   tint_diy_compose.png

[IM Output]
Attention, cela ne préserve pas correctement la transparence de l'image, mais fonctionnera très bien pour les images entièrement opaques. Notez que, contrairement à tint, n'importe quelle couleur peut être utilisée, y compris « black », car la couleur n'est pas traitée comme une addition vectorielle, mais comme une composition alpha. Le résultat n'est pas tout à fait le même que ce que l'on obtiendrait avec une teinte normale.

Teinte de couleur par superposition

Les méthodes spéciales de composition alpha « [Overlay](compose.html#overlay) » et « [Hardlight](compose.html#hardlight) » ont en fait été conçues en pensant à la teinte de couleur (et de motif). Ces méthodes de composition remplacent également les gris de tons moyens tout en laissant intactes les hautes lumières noires et blanches de l'image. Par exemple, ici je génère rapidement une image de superposition colorée, et je la compose pour teinter l'image originale. |

  magick test.png \( +clone -alpha off -fill gold -colorize 100% \) \
          -compose overlay -composite  tint_overlay.png

[IM Output]
Comme on peut le voir, la composition alpha ne préserve aucune transparence de l'image originale, ce qui nécessite une seconde opération de composition alpha pour corriger ce problème. |

  magick test.png \
          \( +clone -alpha off -fill gold -colorize 100% \
             +clone +swap -compose overlay -composite \) \
          -compose SrcIn -composite  tint_overlay_fixed.png

[IM Output]
L'utilisation de « [Overlay](compose.html#overlay) » est une forme de teinte bien plus linéaire que la fonction quadratique employée plus haut, et, comme « [-tint](https://imagemagick.org/command-line-options/#tint) », elle est appliquée séparément à chaque canal de l'image, de sorte que les couleurs primaires et secondaires restent elles aussi inchangées. De plus, cette méthode de composition alpha ne fournit aucun contrôle d'ajustement ; donc si vous voulez contrôler le niveau de teinte, vous devrez ajuster la transparence de l'image de superposition avant d'appliquer la teinte. Bien sûr, contrairement aux autres méthodes de teinte que j'ai montrées jusqu'ici, vous n'êtes pas limité à teinter avec une simple couleur, mais pouvez appliquer une teinte à l'aide d'une image ou d'un motif en tuile. |

  magick test.png \
          \( -size 150x100 tile:tile_disks.jpg \
             +clone +swap -compose overlay -composite \) \
          -compose SrcIn -composite  tint_overlay_pattern.png

[IM Output]
Cela dépasse toutefois le cadre de la gestion basique des couleurs, je m'en tiendrai donc là pour la teinte d'image. | _La méthode de composition alpha « [HardLight](compose.html#hardlight) » produira les mêmes résultats que « [Overlay](compose.html#overlay) », mais avec les images source et destination inversées.

On aurait pu l'utiliser à la place du « +swap » dans les derniers exemples._
---|---


Modificateurs de couleur globaux

Moduler la luminosité, la saturation et la teinte

L'opérateur « [-modulate](https://imagemagick.org/command-line-options/#modulate) » est particulier en ce qu'il modifie une image dans l'espace colorimétrique spécial HSL (teinte-saturation-luminosité) (espace colorimétrique). Il convertit chaque pixel de couleur dans cet espace colorimétrique, le modifie, puis le reconvertit dans son espace colorimétrique d'origine. Il prend trois valeurs (les valeurs suivantes étant optionnelles) sous forme de pourcentage, de sorte que 100 ne change rien à une image. Par exemple… |

  magick rose: -modulate 100,100,100  mod_noop.gif

[IM Output]
La première valeur, luminosité, est un multiplicateur de la luminosité globale de l'image.

  magick rose:  -modulate 0     mod_bright_0.gif
  magick rose:  -modulate 50    mod_bright_50.gif
  magick rose:  -modulate 80    mod_bright_80.gif
  magick rose:  -modulate 100   mod_bright_100.gif
  magick rose:  -modulate 150   mod_bright_150.gif
  magick rose:  -modulate 200   mod_bright_200.gif

[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

Notez que si un argument de luminosité de « 0 » produit une image entièrement noire, vous ne pouvez pas produire une image entièrement blanche avec cet opérateur seul. La deuxième valeur, saturation, est également un multiplicateur ajustant la quantité globale de couleur présente dans l'image.

  magick rose:  -modulate 100,0     mod_sat_0.gif
  magick rose:  -modulate 100,20    mod_sat_20.gif
  magick rose:  -modulate 100,70    mod_sat_70.gif
  magick rose:  -modulate 100,100   mod_sat_100.gif
  magick rose:  -modulate 100,150   mod_sat_150.gif
  magick rose:  -modulate 100,200   mod_sat_200.gif

[IM Output] [IM Output] [IM Output] [IM Output] [IM Output] [IM Output]

Une saturation de « 0 » produira une image en niveaux de gris, comme montré aussi dans Convertir la couleur en niveaux de gris ci-dessus. Le gris mélange toutefois les trois canaux de couleur à parts égales, comme le définit l'espace colorimétrique HSL, et ne produit donc pas de véritable échelle de gris d'« intensité ». En substance, les petites valeurs produisent des couleurs plus « pastel », tandis que les valeurs supérieures à « 100 » produisent des images plus colorées, à l'aspect de dessin animé. Notez que, la luminosité et la saturation étant des multiplicateurs en pourcentage, il faudrait multiplier par un très grand nombre pour porter presque toutes les valeurs de couleur de l'image près du maximum. Autrement dit, il faudrait utiliser un facteur de luminosité proche du million pour rendre blanches toutes les couleurs sauf le noir pur.

Modulation de la teinte

La dernière valeur, teinte, est en réalité bien plus utile. Elle fait tourner les couleurs de l'image de manière cyclique. Pour ce faire, la valeur de teinte donnée produit une « addition modulaire », plutôt qu'une multiplication. Attention toutefois : la teinte est tournée à l'aide d'un pourcentage, et non d'un angle. Cela peut sembler étrange, mais « [-modulate](https://imagemagick.org/command-line-options/#modulate) » a toujours fonctionné ainsi. Les formules de conversion entre l'angle et l'argument de modulation sont…

_hue_angle_ = ( _modulate_arg - 100_ ) * 180/100
_modulate_arg_ = ( _hue_angle * 100/180_ ) + 100

Cela signifie que « 100 » (pour les trois arguments) ne produit aucun changement. Tandis qu'une valeur de « 0 » ou « 200 » inversera effectivement les couleurs de l'image (mais pas l'intensité). Par exemple…

  magick rose:  -modulate 100,100,0      mod_hue_0.gif
  magick rose:  -modulate 100,100,33.3   mod_hue_33.gif
  magick rose:  -modulate 100,100,66.6   mod_hue_66.gif
  magick rose:  -modulate 100,100,100    mod_hue_100.gif
  magick rose:  -modulate 100,100,133.3  mod_hue_133.gif
  magick rose:  -modulate 100,100,166.6  mod_hue_166.gif
  magick rose:  -modulate 100,100,200    mod_hue_200.gif

[IM Output]
0
(rouge <-> cyan) | [IM Output]
33.3
(rouge -> bleu) | [IM Output]
66.6 | [IM Output]
100%
sans effet | [IM Output]
133.3 | [IM Output]
166.6
(rouge -> vert) | [IM Output]
200
(identique à 0)
---|---|---|---|---|---|---

Comme on peut le voir, une valeur de « 33.3 » produit une rotation négative, ou dans le sens antihoraire, de toutes les couleurs d'environ 60 degrés, faisant effectivement correspondre le rouge au bleu, le bleu au vert et le vert au rouge. L'utilisation de valeurs de « 0 » ou « 200 » produit une inversion complète des couleurs de 180 degrés, sans inverser la luminosité de l'image. Notez que les teintes sont cycliques, si bien qu'une valeur de « 300 » produira une rotation des couleurs de 360 degrés et ne changera rien à l'image. Pour des exemples d'utilisation de la « modulation de teinte » afin de modifier les couleurs des images, voir Masquage par chroma key et Épingles sur une carte.
Ces types d'opérations et bien d'autres peuvent aussi être appliqués à l'aide de techniques avancées d'espace colorimétrique, comme dans l'opérateur de matrice de recoloration (ci-dessous), mais pour une « modulation » basique d'une image, cet opérateur simplifie grandement les choses. Pour l'échange des couleurs primaires, l'opérateur de matrice de recoloration ou l'échange de canaux (voir opérateurs Separate/Combine) est probablement une technique plus précise. Bien qu'elle soit beaucoup moins polyvalente. Voir aussi les tables de correspondance de couleurs Hald pour une méthode permettant d'enregistrer des variations de changement de couleur, en particulier des changements de teinte, en vue d'une réutilisation ultérieure.

Moduler soi-même

Vous pouvez, si vous le souhaitez vraiment, « le faire vous-même ». Il s'agit essentiellement de transformer l'image dans l'espace colorimétrique approprié, de modifier les valeurs, puis de la retransformer vers l'original. Rappelez-vous que dans l'espace colorimétrique HSL, le canal vert contient la valeur de saturation, et le canal bleu contient la valeur de luminance. Par exemple, voici l'équivalent d'un « -modulate 80,120 » (assombrir légèrement, augmenter la saturation des couleurs), en utilisant l'espace colorimétrique HSL par défaut…

  magick rose: -colorspace HSL \
          -channel B -evaluate multiply 0.80 \
          -channel G -evaluate multiply 1.20 \
          +channel -colorspace sRGB   modulate_channel.png

[IM Output] [IM Output]

Bien sûr, si vous modifiez la teinte (canal rouge) avec cette méthode, vous devrez veiller à ce que la valeur finale « boucle » (un modulo), plutôt que de simplement l'écrêter à la valeur maximale ou minimale (les deux correspondant à la teinte « rouge »). Il est donc probablement plus simple d'utiliser directement l'opérateur Modulate pour les modifications de teinte.

Moduler dans d'autres espaces colorimétriques

Le plus gros problème de « [-modulate](https://imagemagick.org/command-line-options/#modulate) » survient avec les images contenant beaucoup de couleurs « proches du blanc ». Comme il travaille dans l'espace colorimétrique HSL, les couleurs blanc cassé deviennent plus « saturées » à mesure que la luminosité est réduite. On peut le constater dans la feuille blanche de l'image de rose ci-dessus, qui présente de nombreux artefacts de couleur à un assombrissement de 50 %. C'est particulièrement problématique avec les formats d'image JPEG, car ils tendent à générer des couleurs blanc cassé (en réalité, toutes les couleurs sont généralement légèrement décalées en JPEG) à cause de leur algorithme de compression avec perte. Par exemple…

  magick wedding_party_sm.jpg  -modulate 85  modulate_off-white.png

[IM Output] [IM Output]

Le problème ici est qu'en HSL toutes les couleurs blanc cassé étaient regroupées dans une petite zone de « point blanc » de l'espace colorimétrique utilisé (un double cône). Lorsque la luminosité est ensuite réduite, les couleurs blanc cassé s'étalent à mesure que le cône de couleur s'élargit, ce qui amène la couleur blanc cassé à générer un ensemble de couleurs blanc cassé plus colorées (saturées). Autrement dit, de petites variations de couleur sont exagérées. La solution consiste à utiliser « [-modulate](https://imagemagick.org/command-line-options/#modulate) » dans l'espace colorimétrique HSB, plutôt que dans l'espace colorimétrique HSL. | _Le « B » de HSB signifie Brightness (luminosité), mais cet espace est aussi couramment appelé HSV, où « V » signifie Value (valeur). C'est le même espace colorimétrique, mais « V » est un terme prêtant à confusion, car une valeur désigne normalement « un nombre stocké ».

Il existe aussi un espace colorimétrique HSI (le « I » d'Intensity, intensité), mais il est peu courant et inutile depuis l'ajout de l'espace colorimétrique cyclique HCL (où « L » signifie Luminance) (voir ci-dessous).

_
---|---
Dans l'espace colorimétrique HSB, le « blanc » n'est pas un point unique, mais un grand « disque », et de ce fait les blancs cassés ne sont pas « proches » les uns des autres. Ainsi, lorsque vous réduisez la luminosité, les blancs cassés se contractent de façon égale, réduisant les légères variations de couleur au lieu de les amplifier. Les blancs deviennent donc simplement gris, et non plus colorés. Pour moduler l'image dans l'espace colorimétrique HSB, vous pouvez soit utiliser la technique du « faites-le vous-même » (voir ci-dessus) dans cet espace colorimétrique, soit, avec IM v6.5.3-7 et versions ultérieures, définir un contrôle opérationnel « modulate:colorspace » avec l'un des espaces colorimétriques « Hue ». |

  magick wedding_party_sm.jpg \
          -define modulate:colorspace=HSB -modulate 85 \
          modulate_HSB.png

[IM Output]
Les autres espaces colorimétriques « Hue » sont HWB et HCL (voir la section suivante). Bien sûr, si vous avez redimensionné l'image à cette petite taille, une solution encore meilleure consiste à NE PAS enregistrer l'image en JPEG, qui était la cause des valeurs blanc cassé. Mieux encore, n'enregistrez pas du tout l'image avant d'avoir terminé, afin de conserver toutes les valeurs de couleur au meilleur réglage de qualité en mémoire. Si l'espace colorimétrique HSB n'est pas utilisé par défaut pour modulate, c'est parce que, si vous éclaircissez une image dans cet espace colorimétrique, les couleurs deviennent plus saturées et plus intenses, plutôt que l'image ne devienne plus éclatante et plus blanche. Voici par exemple un éclaircissement de 150 % de l'image « rose » dans l'espace HSL par défaut et dans un espace colorimétrique HSB spécifié, à titre de comparaison.

  magick rose:         -modulate 150        mod_bright_HSL.gif
  magick rose: -define modulate:colorspace=HSB \
                         -modulate 150        mod_bright_HSB.gif

[IM Output]
HSL | [IM Output]
HSB
---|---

| _Avant IM v6.4.0-10, l'opérateur « [-modulate](https://imagemagick.org/command-line-options/#modulate) » utilisait effectivement l'espace colorimétrique HSB plutôt que HSL. Cela a été modifié à la suite d'un rapport de bug d'un utilisateur au sujet de la situation décrite ci-dessus.

Le fait est que, pour certaines images, vous êtes perdant si vous utilisez HSL, et pour d'autres images, vous êtes perdant si vous utilisez l'espace colorimétrique HSB. Tout dépend simplement de ce que vous essayez de faire !

_
---|---

Moduler en LCHab et autres espaces colorimétriques

La modulation de teinte (dans l'espace colorimétrique HSL ou HSB) est en fait considérée comme assez grossière. Ces espaces colorimétriques ne tiennent pas compte d'une intensité plus réaliste des couleurs. Ainsi, une rotation entre les teintes « bleu » et « jaune » génère aussi de très grands décalages de luminosité. Voir Wikipédia : inconvénients de l'espace colorimétrique HSL. Une alternative consiste à effectuer une rotation préservant la luminance, telle que décrite sur Grafica Obscura dans l'article « Matrix Operations ». C'est complexe, car les modifications de couleur sont effectuées dans le cadre de l'opération, sous forme d'une unique opération matricielle calculée qui diffère selon l'ampleur de la rotation requise. Depuis IM v6.8.4-7, l'opérateur Modulate peut aussi gérer les espaces colorimétriques spéciaux « LCHab » et « LCHuv », qui sont les formes cylindriques (teinte-chroma) des espaces colorimétriques respectifs « Luv » et « Lab ». Voir Wikipédia, espace colorimétrique cylindrique LUV, ou LCHuv et L'espace colorimétrique HCL pour plus d'informations. Les canaux équivalents des espaces colorimétriques « LCHab » et « LCHuv » sont inversés par rapport à ceux des espaces colorimétriques « HCL » et « HCB ». C'est-à-dire que l'équivalent d'intensité « en niveaux de gris » se trouve dans le premier canal (« rouge ») et la teinte dans le troisième canal (« bleu ») de l'image.
Par exemple, effectuons quelques rotations de teinte pour la rose rouge en utilisant l'espace colorimétrique « LCHab ». Comparez-les avec l'ensemble précédent pour l'espace colorimétrique « HSL » ci-dessus.
  for i in   0 25 50 75 100 125 150 175;  do
    magick rose: -define modulate:colorspace=LCHab \
                            -modulate 100,100,$i     mod_lch_$i.gif
  done

[IM Output]
0% & 200% | [IM Output]
25%
(rouge->bleu) | [IM Output]
50% | [IM Output]
75% | [IM Output]
100%
sans effet | [IM Output]
125% | [IM Output]
150% | [IM Output]
175%
---|---|---|---|---|---|---|---

Notez que les teintes sont réparties différemment par rapport aux espaces colorimétriques de teinte plus traditionnels. Mais plus important encore, l'intensité de l'image originale est préservée. De ce fait, vous ne passerez jamais d'une couleur primaire/secondaire pure à une autre couleur primaire/secondaire pure, car aucune d'elles n'a la même intensité. La progression des couleurs au fil des teintes s'écoule toutefois plus en douceur, avec des « pics » moins marqués aux couleurs primaires et secondaires. Voici une comparaison d'une simple rotation de teinte du rouge vers le bleu pour « LCHab » face à l'espace colorimétrique « HSL » normal (en utilisant les pourcentages de rotation appropriés).

[IM Output]
Original | | [IM Output]
LCHab
25% | [IM Output]
HSL/HSB
33.3%
---|---|---|---

Remarquez que le bleu est loin d'être aussi sombre, mais qu'il s'agit d'une teinte qui correspond mieux à celle de l'image d'origine. Pour plus d'informations sur les teintes de l'espace colorimétrique HCL, voir les exemples sur La roue chromatique LCH. | _Avant IM v6.8.4-7, vous auriez utilisé l'espace colorimétrique 'HCL ' (introduit dans IM v6.7.9-1). Cet espace colorimétrique est exactement le même que 'LCHuv ' mais avec l'ordre des canaux inversé (la teinte étant stockée dans le canal rouge de l'image, c'est simplement ainsi que cet espace colorimétrique est défini). Cela signifiait que vous deviez également permuter les différents canaux pour que l'Opérateur Modulate fonctionne correctement.

Les espaces colorimétriques 'LCHab ' et 'LCHuv ' ordonnent les canaux de la même manière que 'HSL ', afin de permettre à modulate de fonctionner correctement, et directement sur l'espace colorimétrique sans nécessiter de réordonnancement des canaux.

_
---|---
| _Notez que pour les couleurs très sombres, l'espace 'LCHuv ' peut générer des valeurs de couleur présentant des discontinuités. Cela ne devrait toutefois pas se produire pour de vraies images, mais uniquement pour des images générées directement dans l'espace cylindrique.

_
---|---

Opérateur Color Matrix

L'opérateur "[-color-matrix](https://imagemagick.org/command-line-options/#color-matrix)" recolore les images à l'aide d'une technique matricielle. Autrement dit, vous lui fournissez une matrice de valeurs qui représente la façon de mélanger linéairement les valeurs des différents canaux de couleur d'une image afin de produire de nouvelles valeurs de couleur. L'usage courant consiste à fournir à l'opérateur 9 valeurs, qui forment trois fonctions (lignes) ou trois multiplicateurs (colonnes). Ainsi, les trois premiers nombres constituent la formule de couleur du canal 'red'. Les trois suivants pour 'green', et ainsi de suite. Par exemple... |

  magick rose: -color-matrix ' 1 0 0
                                0 1 0
                                0 0 1 '   matrix_noop.png

[IM Output]
Équivaut à appliquer les équations...

red' = 1 * red + 0 * green + 0 * blue
green' = 0 * red + 1 * green + 0 * blue
blue' = 0 * red + 0 * green + 1 * blue

Dans ce cas précis, aucune modification n'est apportée à l'image. La matrice forme un tableau particulier, appelé 'matrice identité'. En permutant les lignes, vous pouvez échanger les différents canaux. Par exemple, ici j'échange les valeurs des canaux rouge et bleu. |

  magick rose: -color-matrix ' 0 0 1
                                0 1 0
                                1 0 0 '  matrix_red_blue_swap.png

[IM Output]
Ou copier simplement le canal rouge vers les deux autres canaux, afin d'extraire ou d'isoler le 'canal rouge' (voir aussi Séparer les images de canaux)... |

  magick rose: -color-matrix ' 1 0 0
                                1 0 0
                                1 0 0 '  matrix_red_channel.png

[IM Output]
ou convertir l'image en niveaux de gris à l'aide d'un ratio de gris 2/5/3 (voir Conversion de la couleur en niveaux de gris)... |

  magick rose: -color-matrix ' .2 .5 .3
                                .2 .5 .3
                                .2 .5 .3 '  matrix_grayscale.png

[IM Output]

Vous pouvez utiliser une matrice plus grande comptant jusqu'à 6 lignes et colonnes. Celles-ci correspondent aux canaux : 'Red', 'Green', 'Blue', 'Black' (si défini), 'Alpha' (si défini), et une constante. Notez que les canaux 'Black' et 'Alpha' doivent tout de même être fournis si la matrice est de cette taille, même si la valeur elle-même n'est ni présente ni utilisée. La dernière colonne constante est une simple addition (ou soustraction si elle est négative) à la formule. La 6e ligne (si elle est fournie) est simplement ignorée et n'est pas utilisée. Par défaut, la définition de la 'matrice' suit la même structure qu'un Noyau de morphologie/convolution défini par l'utilisateur et est traitée comme un noyau 'carré' si aucune géométrie de taille n'est spécifiée. Le décalage du noyau n'est actuellement pas utilisé. Le 'tableau de valeurs' fourni est ensuite superposé à une plus grande 'matrice identité 6x6' (une diagonale de 1) avant d'être appliqué à l'image. Ce traitement interne signifie que vous pouvez en réalité simplifier la valeur de la matrice en n'indiquant que quelques lignes de nombres, plutôt que toutes. Cela est particulièrement utile lorsque vous devez inclure la 'constante' dans les calculs de couleur, ou que vous ne souhaitez modifier qu'un seul canal. Par exemple, inverser (négatif) l'image. |

  magick rose: -color-matrix '6x3: -1  0  0 0 0 1
                                     0 -1  0 0 0 1
                                     0  0 -1 0 0 1'  matrix_negate.png

[IM Output]
Définir toutes les valeurs du canal rouge au maximum (à l'aide de la 'constante')... |

  magick rose: -color-matrix '6x1: 0,0,0,0,0,1'  matrix_red_max.png

[IM Output]
En raison de la superposition sur la matrice identité, aucune des autres valeurs de canal n'est affectée, bien qu'elles soient tout de même recalculées en interne. | Avant IM v6.6.1-0, "[-color-matrix](https://imagemagick.org/command-line-options/#color-matrix)" s'appelait "-recolor.
---|---

Exemples de Color Matrix

Couleur sépia , ou du moins une forme linéaire de cette opération |

  magick rose: -color-matrix ' 0.393 0.769 0.189
                                0.349 0.686 0.168
                                0.272 0.534 0.131  ' matrix_sepia.png

[IM Output]
Couleurs vives , selon une technique appelée Digital Velvia... |

  magick rose: -color-matrix '  1.2 -0.1 -0.1
                                -0.1  1.2 -0.1
                                -0.1 -0.1  1.2 ' matrix_vivid.png

[IM Output]
Cette matrice éclaircit chaque canal de couleur tout en soustrayant les couleurs des autres canaux, ce qui rend les couleurs plus vives dans l'image RGB. Ce n'est pas tout à fait la même chose que d'utiliser Modulate pour augmenter la saturation des couleurs d'une image de 20 %, mais c'est similaire. Couleur Polaroid... |

  magick rose: -color-matrix \
            '6x3:  1.438 -0.122 -0.016  0 0 -0.03
                  -0.062  1.378 -0.016  0 0  0.05
                  -0.062 -0.122 1.483   0 0 -0.02 ' matrix_polaroid.png

[IM Output]
Futur : rotations de teinte à l'aide d'une matrice de couleur...
Comme décrit sur la page web Grafica Obscura.
Pour plus d'informations sur l'utilisation d'une matrice de couleur, voir...

Sachez toutefois que la plupart de ces implémentations utilisent une forme Transposée diagonalement de la matrice, dans laquelle ce sont les colonnes qui forment l'équation, au lieu des lignes. Ou font intervenir moins de canaux (un plus petit nombre de lignes/colonnes).

Coloration Solarize

"[-solarize](https://imagemagick.org/command-line-options/#solarize)" une image consiste essentiellement à 'brûler' en noir les couleurs les plus claires. Plus la couleur est claire, plus la couleur solarisée est sombre. Cela se produit en photographie lorsqu'un film argentique est surexposé. |

  magick rose:  -solarize 90%     solarize.jpg

[IM Output]
En somme, tout ce qui se situe au-dessus du niveau de gris indiqué est passé en négatif. Ainsi, si vous fournissez un argument de '0%', vous obtenez en gros un Opérateur Negate du pauvre. Par exemple, voici un "[-solarize](https://imagemagick.org/command-line-options/#solarize)" simulé à l'aide d'une formule mathématique "[-fx](https://imagemagick.org/command-line-options/#fx)". |

  magick rose:  -fx  '.9>u ? u : 1-u'     solarize_fx.jpg

[IM Output]
Cet opérateur est particulièrement adapté à l'extraction des gris de tons moyens d'une image. Par exemple, ici j'utilise une opération de Contraste sigmoïdal très forte pour produire une sorte de seuil 'flou' à 70 % de gris. Je Solarise ensuite le résultat afin de générer un pic flou plutôt qu'un seuil flou. Un ajustement de niveaux final amène ensuite le pic à sa luminosité maximale pour générer un effet de 'filament'.

  magick -size 10x300 gradient: -rotate 90 \
                         -sigmoidal-contrast 50x70%   fuzzy_thres.png
  magick fuzzy_thres.png  -solarize 50%   fuzzy_spike.png
  magick fuzzy_spike.png  -level 0,50%    filament.png

[IM Output] [IM Output] [IM Output]

APARTÉ : Les images ci-dessus, montrant des graphiques de 'profil' du dégradé, ont été générées à l'aide de "[im_profile](../static/img/scripts/im_profile)" du répertoire Scripts des IM Examples. Remarquez comme tout ce qui est blanc devient noir, tandis que les gris de tons moyens autour du pic central sont préservés. Le flou et l'emplacement du pic sont déterminés par l'opérateur "[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)". Je l'appelle un 'filament' car, typiquement, le résultat ressemble remarquablement à des filaments électriques incandescents, ou à des décharges de foudre. Voir Random Flux pour un autre exemple de cet effet. Cette extraction des gris de tons moyens est aussi mise à profit dans les techniques permettant de générer des Contours d'arêtes à partir de formes bitmap, et pour la multiplication de deux dégradés biaisés. Un autre usage original de cette opération consiste à déterminer si une image est essentiellement un croquis ou un dessin en noir et blanc pur (comme tiré d'un livre), plutôt qu'une image en niveaux de gris nuancés ou en couleur. Voir Déterminer si une image est : en noir et blanc pur, ou en niveaux de gris


Recolorer des images avec des tables de correspondance

Bien que vous puissiez recolorer des images à l'aide des divers ajustements de couleur par histogramme présentés ci-dessus, il existe une autre technique pour recolorer les images, consistant simplement à 'rechercher' les valeurs modifiées dans un dégradé de couleurs préparé à l'avance, ou "Tables de correspondance de couleurs" (Color LUT, ou CLUT). Il existe deux types de Color LUT : les LUT simples, unidimensionnelles ou 'par canal', et les LUT de couleur 3D. Une LUT de canal comporte trois tables de correspondance indépendantes : une pour chacun des canaux R, G et B. Chaque entrée de la LUT de canal fait correspondre une valeur de canal d'entrée à une valeur de canal de sortie. Le canal rouge de l'image de sortie n'est affecté que par la valeur rouge d'origine de l'image d'entrée. Une LUT de couleur 3D permet en revanche de remplacer la couleur entière en fonction de la couleur d'entrée entière. Autrement dit, la valeur de sortie du canal rouge peut dépendre de tout ou partie des valeurs rouge, verte et bleue en entrée. On appelle parfois cela la diaphonie entre canaux (channel cross-talk).

Tables de correspondance de couleur (par canal)

Une exigence courante d'un outil de traitement d'images est la capacité de remplacer toute la gamme des couleurs à partir d'une table de couleurs préparée à l'avance. Cela vous permet de transformer des images d'un ensemble de couleurs (généralement en niveaux de gris) en un ensemble de couleurs complètement différent, simplement en recherchant leur couleur de remplacement dans une image spéciale. Bien entendu, il vous faut une image 'Table de correspondance' dans laquelle lire les couleurs de remplacement. Pour ces premiers exemples, j'ai choisi d'utiliser un dégradé vertical de couleurs pour la LUT, afin que le générateur "[gradient:](canvas.html#gradient)" d'IM puisse être utilisé pour simplifier la génération de la 'table de correspondance de couleur'. Voilà pour la théorie. Essayons-la en recolorant une simple image Plasma en niveaux de gris, en remplaçant les niveaux de gris par un dégradé de couleurs allant du bleu foncé au blanc cassé.

  magick -size 100x100 plasma:fractal -virtual-pixel edge -blur 0x5 \
          -shade 140x45  -normalize \
          -size 1x100 xc:black -size 9x100 gradient: \
          +append  gray_image.jpg
  magick -size 10x100  gradient:navy-snow       gradient_ice-sea.png
  magick gray_image.jpg  gradient_ice-sea.png -clut  gray_recolored.jpg

[IM Output] [IM Output] [IM Output]

L'opérateur "[-clut](https://imagemagick.org/command-line-options/#clut)" prend deux images. La première est l'image dont les valeurs de couleur doivent être remplacées, la seconde est une image de dégradé constituée soit d'une seule ligne, soit d'une seule colonne. L'opérateur "[-clut](https://imagemagick.org/command-line-options/#clut)" a été ajouté à IM v6.3.5-8.
Si votre version d'IM est trop ancienne pour comprendre l'opérateur "[-clut](https://imagemagick.org/command-line-options/#clut)" ou si vous souhaitez faire quelque chose de particulier, comme une table de correspondance de couleur à 2 dimensions, alors vous pouvez fabriquer la vôtre à l'aide de l'Opérateur DIY général, FX. Par exemple, voici une commande lente, mais équivalente à la précédente.
  magick gray_image.jpg  gradient_ice-sea.png \
          -fx 'v.p{0,u*v.h}'  gray_recolored_fx.jpg

[IM Output]
Le problème est que, même pour un traitement aussi simple que celui ci-dessus, l'opérateur "[-fx](https://imagemagick.org/command-line-options/#fx)" est très lent et doit être conçu spécifiquement pour une LUT en ligne ou en colonne. Mais il fonctionne. La LUT n'a pas besoin d'être très grande. Par exemple, ici nous utilisons une LUT très petite, avec un nombre de couleurs très limité.

  magick -size 1x6 gradient:navy-snow  gradient_levels.png
  magick gray_image.jpg  gradient_levels.png  -clut  gray_levels.jpg

[IM Output] [IM Output] [IM Output]

J'ai agrandi l'image de dégradé pour l'affichage sur la page web ci-dessus, sans quoi elle serait trop petite pour être vue correctement. La LUT ne fait en réalité que 6 pixels. Pourtant, si vous regardez le résultat, vous verrez que l'opérateur de correspondance de couleur lisse ces 6 couleurs en un dégradé continu. Ce qui se passe, c'est qu'IM effectue une Recherche interpolée de l'image LUT. Autrement dit, au lieu de simplement retenir la couleur trouvée, il calcule une moyenne pondérée de toutes les couleurs voisines afin de mieux représenter la LUT. Dans ce cas précis, il a utilisé le réglage par défaut '[Bilinear](misc.html#bilinear)' qui relie simplement chaque pixel coloré par des segments de droite linéaires. Différents réglages "[-interpolate](https://imagemagick.org/command-line-options/#interpolate)" génèrent différents niveaux de lissage des couleurs lorsqu'on utilise une LUT de couleur très petite. Ici, par exemple, je montre différents types de lissage interpolé des couleurs de la LUT.

  magick gray_image.jpg  gradient_levels.png \
          -interpolate Integer         -clut  gray_levels_integer.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate NearestNeighbor -clut  gray_levels_nearest.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Average         -clut  gray_levels_average.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Blend           -clut  gray_levels_blend.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate BiLinear        -clut  gray_levels_bilinear.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Catrom          -clut  gray_levels_catrom.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Spline          -clut  gray_levels_spline.jpg

[IM Output]
Integer | [IM Output]
Nearest | [IM Output]
Average | [IM Output]
Blend | [IM Output]
BiLinear | [IM Output]
Catrom | [IM Output]
Spline
---|---|---|---|---|---|---

Les réglages '[Integer](misc.html#integer)' et '[Nearest](misc.html#nearest)' sont particuliers en ce qu'ils n'effectuent aucun lissage des couleurs. Autrement dit, aucune nouvelle 'couleur mélangée' n'est ajoutée : seules les valeurs de couleur exactes présentes seront utilisées pour colorer une image en niveaux de gris. Notez toutefois combien la recherche des couleurs diffère entre les deux. C'est une différence subtile, mais qui peut être très importante. Le réglage '[Average](misc.html#average)' génère quant à lui également des bandes de couleur, mais en utilisant uniquement un mélange des couleurs, ce qui donne une couleur de moins que la taille de l'image de la table de correspondance. '[Blend](misc.html#blend)' mélange en revanche '[Average](misc.html#average)' et '[Nearest](misc.html#nearest)' ensemble, pour ajouter davantage de pixels. Ce type de 'banding' des couleurs (ou Artefacts de blocs) est en réalité assez courant pour les cartes géographiques et les graphiques de température, car il donne une meilleure représentation de la forme exacte de la carte. Les arêtes de frontière nettes sont appelées iso-lignes. Ajouter un léger Flou d'un pixel à l'image finale peut améliorer l'aspect de ces arêtes, en les rendant un peu plus douces, sans détruire le banding des couleurs. Le réglage '[BiLinear](misc.html#bilinear)' génère lui aussi du banding, mais uniquement sous la forme de changements de dégradé nets, lorsque les couleurs changent brusquement (ce qui n'est pas le cas dans cet exemple). Tandis que '[Catrom](misc.html#catrom)' lisse les changements de couleur. Enfin, '[Spline](misc.html#spline)' floute les couleurs et peut ne générer aucune des couleurs de la CLUT fournie. Pour éviter les problèmes d'interpolation, ou pour mieux définir les dégradés de couleur, la meilleure idée est d'utiliser une LUT beaucoup plus longue. Idéalement, celle-ci devrait couvrir toute la gamme des valeurs d'intensité possibles. Pour ImageMagick Q16 (compilé avec une qualité 16 bits), cela nécessite une LUT d'une hauteur de 65536 pixels. Mais l'Interpolation de pixels vous permet d'utiliser une image de dégradé LUT plus raisonnable de 500 pixels, adaptée à la plupart des tâches de recoloration d'image. Notez que la LUT en dégradé vertical utilisée dans les exemples ci-dessus apparaît à l'envers à nos yeux, car le noir, ou l'index '0', se trouve en haut de l'image. Normalement, nous, les humains, préférons voir les dégradés avec le niveau de noir en bas (à cause de notre passé évolutif). Si vous préférez enregistrer l'image de dégradé 'dans le bon sens', vous pouvez "[-flip](https://imagemagick.org/command-line-options/#flip)" l'image au moment de la lire. Par exemple, essayons une LUT plus complexe, en retournant le dégradé vertical avant de l'utiliser sur l'image.

  magick -size 1x33 gradient:wheat-brown gradient:Brown-LawnGreen \
          gradient:DodgerBlue-Navy   -append  gradient_planet.png
  magick gray_image.jpg \
          \( gradient_planet.png -flip \) -clut   gray_planet.jpg

[IM Output] [IM Output] [IM Output]

Comme vous pouvez le constater, pour un dégradé vertical, il est tout à fait logique de le retourner avant utilisation. Pour d'autres exemples de génération de dégradés, voir Dégradés de couleur. Vous pourriez aussi être intéressé par une manière de paver des images en niveaux de gris en utilisant une image pour chaque niveau de gris, ce qui peut produire des images ressemblant encore davantage à des 'cartes'. Voir Tramage à l'aide de motifs.

Conversion d'une fonction en Color LUT

Ces "Images de table de correspondance" (ou LUT) préparées à l'avance peuvent aussi être utilisées pour accélérer considérablement des opérations "[-fx](https://imagemagick.org/command-line-options/#fx)" très complexes et donc lentes : ainsi, au lieu qu'IM interprète la chaîne fonctionnelle 3 ou 4 fois par pixel, il peut effectuer une recherche bien plus rapide de la couleur de remplacement. La procédure pour ce faire est assez simple : soit vous appliquez la fonction à un dégradé linéaire non modifié, soit vous remplacez le 'u' de la fonction par la valeur '(i/w)' ou '(j/h)' afin de calculer la valeur de remplacement en fonction de sa position. Par exemple, dans l'exemple avancé des Effets 'Aqua', j'ai utilisé une fonction "[-fx](https://imagemagick.org/command-line-options/#fx)" complexe pour ajuster la sortie en niveaux de gris de l'Opérateur Shade". Et comme cet ajustement en niveaux de gris est également superposé à une forme 'DodgerBlue', il n'y a aucune raison pour que les résultats de ces deux opérateurs ne puissent pas être combinés en une seule table de correspondance de dégradé. Autrement dit, nous générons une LUT à partir de la formule "[-fx](https://imagemagick.org/command-line-options/#fx)" et de la superposition de couleur. Par ailleurs, pour ces exemples, j'ai décidé de générer une seule ligne de pixels plutôt qu'une colonne comme précédemment.

  magick -size 1x512 gradient: -rotate 90 -alpha off \
          -fx '3.5u^3 - 5.05u^2 + 2.05u + 0.3' \
          -size 512x1 xc:DodgerBlue -compose Overlay -composite \
          aqua_gradient.png

[IM Output]

| Le polynôme "[-fx](https://imagemagick.org/command-line-options/#fx)" ci-dessus peut désormais être généré de manière plus directe et plus rapide à l'aide d'une Fonction polynomiale. Par exemple

_"[-function](https://imagemagick.org/command-line-options/#function) Polynomial 3.5,-5.05,2.05,0.3"_

---|---
Cette LUT pré-générée peut désormais être appliquée à la forme ombrée bien plus rapidement, au prix minime du stockage d'une très petite image.

  magick -font Candice -pointsize 72 -background None label:A \
          -trim +repage  aqua_mask.png
  magick aqua_mask.png -alpha Extract -blur 0x6 -shade 120x21 \
          -alpha On -normalize  aqua_shade.png
  magick aqua_shade.png  aqua_gradient.png -clut aqua_font.png

[IM Output] [IM Output] [IM Output]
ATTENTION : ce qui précède est incomplet (les bords n'ont pas été assombris)

Comme vous pouvez le constater, le résultat est très efficace, et une fois qu'un dégradé LUT approprié a été généré, vous pouvez réutiliser le même dégradé encore et encore, autant de fois que vous le souhaitez.

CLUT et gestion de la transparence

L'opérateur "[-clut](https://imagemagick.org/command-line-options/#clut)" est contrôlé par le réglage "[-channel](https://imagemagick.org/command-line-options/#channel)", mais en réalité, il ne fait que remplacer les valeurs des canaux individuels au sein de l'image. Cela signifie que, normalement, chaque canal individuel de l'image source est utilisé pour 'rechercher' la valeur de remplacement de ce seul canal dans la table de correspondance de couleur. Cela inclut le canal alpha, ce qui est en général très gênant et difficile à appliquer. Typiquement, l'opérateur "[-clut](https://imagemagick.org/command-line-options/#clut)" est utilisé soit pour coloriser une image source en niveaux de gris (voir les exemples précédents), SOIT pour effectuer un ajustement par histogramme d'une image couleur à l'aide d'une CLUT (table de correspondance de couleur) en niveaux de gris. Autrement dit, en général, l'une des images sera typiquement en niveaux de gris. Depuis IM v6.4.9-8, si un réglage "[-channel](https://imagemagick.org/command-line-options/#channel)" indique que vous souhaitez remplacer/ajuster le canal alpha d'une image (un 'A' est présent), et que l'image 'source' ou l'image 'CLUT' n'a aucun canal alpha défini, alors IM supposera que cette image est en niveaux de gris et agira en conséquence. Par exemple, ici je génère un simple triangle flouté, sous forme d'image en niveaux de gris. Je peux ensuite le colorer à l'aide d'une table de correspondance de couleur qui inclut la transparence. Je n'ai pas retourné l'image CLUT cette fois-ci, si bien que le remplacement noir sera en haut et le remplacement blanc en bas.

  magick -size 100x100 xc:  -draw 'polygon 50,10 10,80 90,80' \
          -blur 0x10  blurred_shape.jpg
  magick -size 1x5 xc:none \
          -draw 'fill red    point 0,2' \
          -draw 'fill yellow rectangle 0,0 0,1'   gradient_border.png
  magick blurred_shape.jpg -alpha off    gradient_border.png \
          -channel RGBA  -interpolate integer -clut  clut_shape.png

[IM Output] [IM Output] [IM Output]

N'oubliez pas que ce qui précède ne fonctionnera comme prévu que si l'image en niveaux de gris n'a aucun canal alpha (désactivé à l'aide de "[-alpha](https://imagemagick.org/command-line-options/#alpha) off" ou "[-alpha off](https://imagemagick.org/command-line-options/#matte)"), et que vous spécifiez que vous souhaitez également rechercher les valeurs du canal alpha (à l'aide de "[-channel](https://imagemagick.org/command-line-options/#channel) RGBA"). Et voici l'autre cas particulier, où l'on a une image comportant de la transparence (et un canal alpha) qui doit être ajustée à l'aide d'un dégradé d'ajustement par histogramme en niveaux de gris (sans canal alpha activé).

  magick -size 100x100 xc:none -draw 'polygon 50,10 10,80 90,80' \
          tile_disks.jpg -compose In -composite shape_triangle.gif
  magick shape_triangle.gif -channel A -blur 0x10 +channel shape_blurred.png
  magick -size 1x50 gradient: xc:black -append -flip \
          -sigmoidal-contrast 6x0%  feather_histogram.jpg
  magick shape_blurred.png \( feather_histogram.jpg -alpha off \) \
          -channel A    -clut    shape_feathered.png

[IM Output] [IM Output] [IM Output] [IM Output]

Ce qui précède est un problème typique d'Adoucissement des bords d'image. Le halo 'noir' dans l'image intermédiaire est causé par l'opération "[-blur](https://imagemagick.org/command-line-options/#blur)" qui rend visibles les zones entièrement transparentes entourant le triangle. Comme une zone entièrement transparente a une couleur indéfinie, IM utilise le noir par défaut. L'image CLUT elle-même a été conçue pour garantir que tout pixel transparent à moins de 50 % devienne entièrement transparent, rendant ainsi de nouveau transparentes les parties de l'image auparavant entièrement transparentes. Pour cet exemple, j'exagère le 'flou' initial, puis je sur-corrige l'ajustement du canal alpha. Le résultat est un arrondi prononcé des pointes du triangle. Pour un adoucissement des bords normal, on utiliserait généralement des valeurs bien plus petites, aussi bien pour le "[-blur](https://imagemagick.org/command-line-options/#blur)" que pour l'ajustement alpha "[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)". Fred Weinhaus a implémenté une technique d'adoucissement flouté dans son script "feather", pour en faciliter l'usage.

Tables de correspondance de couleur 3D Hald

Depuis IM v6.5.3-4, vous pouvez désormais aussi utiliser une véritable table de correspondance de couleur 3D, qui peut être utilisée pour remplacer directement toutes les couleurs de plusieurs images. Autrement dit, au lieu de simplement rechercher la valeur de chaque canal de couleur comme une entité distincte (comme dans la CLUT ci-dessus), la couleur entière est utilisée pour rechercher la nouvelle couleur. Cependant, les tables de couleur 3D nécessitent généralement des formats de fichier spéciaux pour stocker correctement le tableau 3D de valeurs de couleur. Toutefois, en utilisant un agencement particulier des valeurs de couleur, la table 3D peut être stockée dans une image 2D appelée Hald Color LUT. Il s'agit d'une image tout à fait normale, et à ce titre N'IMPORTE quel bon format de fichier image peut être utilisé pour enregistrer une Hald 3D Color LUT. Pour plus de détails et d'exemples d'images HALD, voir le site officiel Images Hald, technologie Clut. Pour générer une table de couleur 3D Hald, utilisez le générateur d'image 'HALD:{_level_}'. Par exemple, en voici une petite que j'ai agrandie pour que vous puissiez voir les pixels individuels...

  magick  hald:3    hald_3.png

[IM Output]

La table contient un cube de couleur d'un côté de '{_level_}2' couleurs, soit 9 couleurs. Le cube de couleur complet contient '9 × 9 × 9' couleurs, soit un total de 729 couleurs, stockées dans une image dont la taille est la racine carrée de ce nombre, soit 27x27 pixels. Les couleurs sont stockées de sorte que les 9 premières couleurs (dans le coin supérieur gauche) forment un dégradé allant du 'noir pur' au 'rouge pur'. Chaque 9e couleur forme ensuite un dégradé de 'vert', et chaque 81e couleur formera un dégradé de 'bleu'. La dernière couleur, dans le coin inférieur droit, est le 'blanc pur'. Vous pouvez vous représenter l'image comme un tableau 1D de pixels, encore plus simple, référencé comme un cube de couleur 3D, si cela vous aide à l'imaginer. Or il ne s'agit là que d'une petite image HALD CLUT. Plus couramment, vous utiliseriez au moins un Hald de niveau 8 (la valeur par défaut), qui contiendra un cube de couleur de 64 couleurs par côté, soit 64^3 = 262144 couleurs, et produira une image de 512x512 pixels, enregistrée dans une image PNG d'environ 10 Ko. Ce n'est pas la totalité des couleurs 8 bits, mais c'est déjà très correct. Pour une image HALD contenant chaque couleur 8 bits, il vous faudrait une version de niveau 16, produisant une image 4096x4096. Ce qui prouve simplement que même des images normales d'appareil photo numérique ne peuvent généralement pas contenir toutes les couleurs 8 bits possibles. Une image Hald plus petite peut néanmoins être utilisée, car IM interpolera les 8 couleurs voisines du Hald pour déterminer la couleur finale du remplacement recherché. La représentation ne sera simplement pas aussi bonne qu'avec une version plus grande. Les images Hald de niveau supérieur à 8 ne sont pas recommandées et nécessiteraient des images très grandes, d'une profondeur d'au moins 16 bits par valeur pour les contenir. Or ces images hald générées sont les images CLUT 'identité' ou 'sans effet'. Autrement dit, ce sont les valeurs de couleur normales formant le cube de couleur 3D, et à ce titre elles ne produisent aucune modification de l'image. Par exemple, appliquons une image Hald 'sans effet', à l'aide de l'opérateur "[-hald-clut](https://imagemagick.org/command-line-options/#hald-clut)"...

  magick rose:  hald_3.png -hald-clut   rose_hald_noop.png

[IM Output] [IM Output] [IM Output]

Cette image est exactement identique à l'originale, et l'image Hald ne contenait aucune modification. Cependant, en modifiant l'image Hald, soit à la main, soit à l'aide d'une modification de couleur, vous pouvez alors substituer aux couleurs d'origine les couleurs modifiées. Par exemple, ici je crée une palette de couleurs en ton sépia mélangé...

  magick hald_3.png \( +clone -sepia-tone 60% \) -evaluate-sequence mean hald_sepia.png
  magick rose.png   hald_sepia.png -hald-clut   rose_hald_sepia.png

[IM Output] [IM Output] [IM Output]

Bien entendu, si vous pouvez appliquer une modification de couleur spécifique à une image Hald, vous pouvez aussi l'appliquer directement à l'image réelle. Mais vous pouvez désormais enregistrer vos modifications de couleur pour les réutiliser, et les appliquer ensuite autant de fois que vous le souhaitez. Cela signifie que vous pouvez concentrer vos efforts sur le Hald, et le conserver pour l'avenir. Vous pouvez aussi envoyer, ou télécharger, des images Hald CLUT pour d'autres personnes et même d'autres applications. Vous pourriez même modifier directement les couleurs d'un Hald à l'aide d'un éditeur d'image comme "Gimp" ou "Photoshop", ou, s'il est enregistré sous forme d'Image texte à pixels énumérés, à l'aide d'un simple éditeur de texte ! Tout ceci vaut particulièrement pour les modifications de couleur très complexes. Merci de m'envoyer par e-mail toutes les images Hald CLUT que vous avez trouvées intéressantes ou utiles, et je les montrerai ici en exemple. Vous serez crédité, ici aussi !

Limites de la CLUT Hald

Contrairement à la recherche par dégradé unidimensionnel plus simple de l'Opérateur CLUT, vous pouvez utiliser une CLUT Hald pour faire pivoter les couleurs. Par exemple, échanger les couleurs rouge et bleue. C'est une méthode de CLUT bien plus polyvalente. Elle est cependant moins adaptée aux opérations plus simples comme colorer une image en niveaux de gris, ou effectuer un ajustement par histogramme des valeurs de couleur. Elle peut aussi remplacer des couleurs par des valeurs transparentes ou semi-transparentes, en enregistrant ces couleurs de remplacement dans l'image Hald CLUT. Toutefois, cette recherche de remplacement se fait uniquement par couleur. Vous ne pouvez pas l'utiliser pour remplacer des couleurs transparentes de manières spécifiques. Ce n'est pas, après tout, un hyper-cube de correspondance de couleur 4D !

Remplacement de couleur à l'aide d'une CLUT Hald

Comme la valeur de couleur entière est utilisée pour rechercher le remplacement de couleur, vous pourriez aussi utiliser ceci comme méthode pour remplacer directement toutes les couleurs d'une image par une autre couleur. Cependant, comme IM effectue actuellement une recherche interpolée linéairement du Hald, vous devrez définir la couleur de remplacement dans les 8 cellules de couleur voisines du cube de couleur 3D.

En construction

Cela nécessite davantage de travail, et pourrait requérir un réglage de recherche Hald 'plus proche voisin' (par exemple à l'aide de -interpolate), plutôt qu'une recherche interpolée linéaire 3D, pour mieux fonctionner dans le cas d'un remplacement de couleur spécifique. De même, un moyen simple de localiser des couleurs précises dans un Hald (le plus proche voisin, ou les 8 voisins) faciliterait grandement la chose. Si vous avez des idées, des suggestions, ou mieux encore de petits exemples, merci de contribuer en me les envoyant par e-mail, ou aux forums de discussion d'IM Une autre idée est que, si vous disposez de deux images, l'originale et la convertie, il devrait être possible de remplir une image Hald CLUT à partir de la comparaison des deux images. Une fois les couleurs immédiates renseignées, le reste du cube de couleur devrait pouvoir être au moins approximativement déduit par ajustement de courbe des couleurs présentes. Autrement dit, créer une surface de couleur 4D à partir des changements de couleur découverts. Une fois terminée, vous pouvez appliquer la CLUT Hald à n'importe quelle autre image afin d'y effectuer la même transformation de couleur (dans un sens ou dans l'autre).

Remplacement complet de la palette de couleurs

FUTUR : remplacer toutes les couleurs d'une palette de couleurs par les couleurs d'une autre palette. Toute suggestion sur la meilleure façon de procéder est la bienvenue, de même que des programmeurs pour implémenter une fonction de palette de couleurs d'image. Une méthode pourrait consister à utiliser les idées présentées dans Tramage à l'aide de symboles. La solution la plus connue (mais loin d'être idéale) est actuellement fournie par Fred Weinhaus dans son script "[mapcolors](http://www.fmwconcepts.com/imagemagick/mapcolors/index.php)". Ce script fait essentiellement correspondre chaque couleur l'une après l'autre, en masquant les pixels concernés d'une image vers une nouvelle image initialement vierge. Une autre idée serait de faire correspondre d'une manière ou d'une autre un remplacement de couleur en 3 dimensions dans une Table de couleur HALD. Cela ne se contenterait pas de faire correspondre les couleurs spécifiées, mais remapperait aussi de manière logique les couleurs situées entre les couleurs spécifiées. Recherche générateur HALD.


En construction

More color options yet to be looked at in detail...

  -contrast
  -brightness-contrast

Color Cycling?
    -cycle     shift colormap (for animations of fractals???)

Chromaticity Color Points???
   –white-point x,y
   –red-primary x,y
   –green-primary x,y
   –blue-primary x,y


Thresholds  (after negation)
  Specifically  -white-threshold and -black-threshold