⚠️ 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/masking/index.html).

Exemples ImageMagick -- Masques

Préface et index des exemples ImageMagick
Canal alpha (matte)

(En construction) Dans ces exemples, nous examinons le traitement particulier de la transparence, le canal de transparence, l'utilisation des masques et, au bout du compte, la suppression des arrière-plans indésirables, ou d'autres éléments comme les panneaux, le texte ou le spam.


Canal alpha

Le canal de transparence (alpha) d'une image est totalement facultatif et nécessite souvent un traitement particulier, distinct des canaux de « couleur » habituels. Voir L'espace colorimétrique de l'image ci-dessus. La présence d'un canal de transparence peut aussi modifier la façon dont les différents opérateurs traitent les autres canaux de couleur, généralement parce qu'une couleur totalement transparente devrait le plus souvent être entièrement ignorée par une opération. Sans cela, on obtiendrait des « halos noirs » autour des images, comme on a pu le voir dans des bogues majeurs des débuts d'IM v6. Par exemple le bogue de halo au redimensionnement et le bogue du flou avec transparence. Pour compliquer les choses, ce canal est aussi parfois appelé canal de « transparence » ou d'« opacité » de l'image, voire « masque » de l'image. Tous désignent pourtant le même quatrième canal, particulier, de l'image. [IM Output] Pour expliquer la différence, il nous faut une image d'exemple concrète ; j'utiliserai pour cela une image PNG d'un « croissant de lune » (issue d'un exemple de composition CopyOpacity). Comme vous pouvez le voir, cette image comporte beaucoup de zones totalement transparentes. De plus, j'ai dû l'enregistrer au format d'image « PNG », l'un des rares formats qui comprend et gère correctement les couleurs transparentes et semi-transparentes. Je peux illustrer cette transparence en superposant l'image sur le motif en damier intégré à IM, à l'aide de la composition alpha. |

    magick composite -compose Dst_Over -tile pattern:checkerboard \
              moon.png  moon_background.jpg

[IM Output]

Canal alpha interne

En interne, IM v7 stocke les informations de transparence dans un canal « alpha » qui, comme le canal de couleur, n'est qu'une simple image en niveaux de gris dont les valeurs vont du blanc (totalement transparent, ou clair) au noir (totalement opaque). C'est un peu ce que l'on obtiendrait en observant une silhouette de l'image d'origine. Les opérateurs de bas niveau tels que "[-level](https://imagemagick.org/command-line-options/#level)" et "[-threshold](https://imagemagick.org/command-line-options/#threshold)" traitent ces données comme de l'alpha. En cas de doute, consultez la référence officielle des options.


Créé le : 10 décembre 2003 (à l'origine « channels »)
Mis à jour le : 2 octobre 2018
Auteur : Anthony Thyssen, Anthony.Thyssen@gmail.com
Exemples générés avec : [version image]
URL : https://usage.imagemagick.org/masking/

Voici une très ancienne manière d'extraire les valeurs de transparence « alpha » d'une image. Elle enregistre le canal de transparence dans un format de fichier image « alpha », exigeait deux étapes distinctes et des commandes pour préciser le bon format de fichier image. |

  magick moon.png alpha:moon.matte

  magick MIFF:moon.alpha moon_matte2.png

  # You can join those two steps in a pipeline as well...
  magick moon.png alpha:- | magick - moon_matte3.png

[IM Output]
Cette technique d'extraction de l'« alpha » d'une image était courante à l'époque d'IM v5. C'était en gros la seule méthode fournie pour accéder à la transparence d'une image. Elle n'est aujourd'hui que très rarement utilisée.

Contrôler la transparence de l'image

Deux opérateurs vous offrent un contrôle de bas niveau du canal de transparence d'une image en mémoire. Les méthodes du nouvel opérateur "[-alpha](https://imagemagick.org/command-line-options/#alpha)" constituent désormais la méthode de contrôle recommandée, même si de nombreux exemples d'IM montrent et utilisent encore l'ancien opérateur "-matte". Une image ne possède pas seulement des données de canal alpha : elle possède aussi un « commutateur » qui définit si ces données sont visibles ou valides. Cela signifie qu'une image peut se trouver dans trois états vis-à-vis du canal alpha. Commutateur Données du canal
alpha off aucune donnée alpha (aucune mémoire allouée)
alpha deactivate anciennes données alpha présentes (mais pas utilisées)
alpha on données alpha actuellement utilisées
Il faut s'en souvenir, car le comportement des différentes méthodes dépend de celui des trois états ci-dessus dans lequel se trouvait l'image. Si le « commutateur » est désactivé, les opérateurs ne toucheront pas aux données alpha, car elles pourraient en réalité ne pas exister du tout. Dans ce cas, d'anciennes données alpha pourraient tout de même être présentes, non modifiées, et donc périmées. Comme vous le verrez, cela s'avère en fait parfois utile dans certaines situations. Notez toutefois que certains opérateurs peuvent activer ou désactiver automatiquement le commutateur alpha pour une raison ou une autre. Par exemple, "-compose CopyOpacity -composite" activera toujours le canal alpha dans l'image résultante, car le rôle de l'opérateur est justement de copier des données dans un canal alpha. Il doit donc exister dans le résultat final. Sa présence dans les données d'entrée peut cependant avoir d'autres conséquences. Voir la méthode de composition Copy_Opacity pour plus de détails. De même, créer un canevas avec la couleur 'None' créera et activera aussi automatiquement le canal de transparence, afin de garantir que l'image vierge est réellement transparente. En revanche, créer un canevas avec un autre nom de couleur ne crée généralement aucun canal de transparence, car les images sont opaques par défaut.
Voici les différentes méthodes de "[-alpha](https://imagemagick.org/command-line-options/#alpha)" et des exemples de la façon dont elles agissent sur les images et leur transparence.

Alpha Off ou "-alpha off"

Il s'agit simplement d'un commutateur sur l'image, qui désactive tout effet de la transparence sur celle-ci. Cela ne supprime ni ne détruit réellement le canal alpha attaché à l'image, cela désactive seulement tout effet de ce canal sur l'image. De même, aucun opérateur n'agira sur le canal alpha attaché tant qu'il est désactivé. Par exemple, reprenons l'image du « croissant de lune » (issue d'un exemple de composition CopyOpacity) et désactivons simplement le canal alpha de l'image.

  magick moon.png  -alpha off     alpha_off.png

[IM Output] [IM Output]

Notez que la forme de la lune a complètement disparu lorsque la transparence a été désactivée, bien que ce soit en réalité rarement le cas. Fondamentalement, même les zones « transparentes » ont une couleur, qui n'est simplement pas visible normalement ; ici, la couleur cachée était l'image de canevas fractal ayant servi à créer l'image de la lune. Cette couleur cachée pourrait être n'importe quoi, d'une simple couleur de transparence GIF, que le format GIF utilise pour représenter la transparence dans sa table de couleurs, jusqu'à des couleurs parasites laissées lors de la création de l'image, comme ci-dessus. Le plus souvent, la couleur de transparence est simplement du noir pur pour tout pixel totalement transparent. Notez que les pixels proches du bord peuvent être semi-transparents, et donc conserver une couleur valide qui n'est que partiellement visible. L'opération "[-alpha](https://imagemagick.org/command-line-options/#alpha) Off" ci-dessus se contente de « désactiver » le canal. Les données de transparence elles-mêmes n'ont pas été effacées ni retirées des données de l'image stockées en mémoire. Elles sont toujours présentes, seulement momentanément indisponibles. Mais... Si l'image est enregistrée alors que les données de transparence sont désactivées, aucune de ces données ne sera enregistrée dans le format de fichier image. Les données alpha désactivées ne sont donc pas présentes dans la copie enregistrée de l'image, même si elles le sont (simplement désactivées) dans la version en mémoire. De plus, comme de nombreux formats de fichier n'autorisent pas la transparence (tel que JPEG), ces formats effectuent automatiquement l'équivalent d'un "[-alpha](https://imagemagick.org/command-line-options/#alpha) Off" lors de l'enregistrement (sans le faire réellement). En général, toutes les zones transparentes deviennent alors noires lorsqu'on enregistre en JPEG. Voir Alpha Remove - Supprimer la transparence ci-dessous pour la bonne façon de supprimer la transparence avant d'enregistrer dans un format JPEG. L'opérateur "[+alpha](https://imagemagick.org/command-line-options/#alpha)" est une ancienne commande exactement identique à "-alpha Off". Autrement dit, elle désactive simplement le canal de transparence. Notez que la désactivation de l'alpha est souvent nécessaire avant d'utiliser une image de masque en niveaux de gris avec la méthode de composition alpha CopyOpacity. Si vous ne le faites pas, l'opérateur de composition copiera la transparence activée (le canal d'opacité) au lieu d'utiliser les niveaux de gris voulus.

Alpha Set ou "-alpha set"

La méthode alpha 'Set' est identique à l'ancienne option "[-alpha on](https://imagemagick.org/command-line-options/#alpha)". Elle garantit que l'image possède un canal de « transparence » ou alpha mais, s'il était absent ou désactivé, qu'il est initialisé comme totalement opaque (voir la méthode Alpha Opaque ci-dessous). En revanche, si l'image possède déjà un canal alpha présent et activé, elle ne fait rien. Autrement dit, cet opérateur garantit la présence d'un canal alpha sans modifier l'apparence de l'image telle qu'elle est actuellement en mémoire. En soi, cet opérateur ne montre donc aucun changement sur l'image, mais il a des effets réels lorsqu'il est combiné à d'autres opérateurs. Ainsi, si vous désactivez le canal alpha avec Alpha Off, puis le réactivez avec Alpha Set, l'image aura un canal alpha, mais il sera totalement opaque, exactement comme l'image apparaissait au moment où l'opération 'Set' a été demandée. |

  magick moon.png  -alpha off    -alpha set    alpha_set.png

[IM Output]
Appliqué à une image dont le canal alpha est activé, aucun changement n'est effectué. |

  magick moon.png  -alpha set    alpha_noset.png

[IM Output]
En résumé, cet opérateur ne devrait jamais changer l'apparence de l'image au moment où il est appliqué. Il garantit seulement que le canal alpha est configuré de manière à laisser l'image telle quelle. On l'utilise généralement après la lecture d'images provenant d'un format de fichier image inconnu, ou d'une source d'entrée, qui peut ou non comporter un canal alpha. Cet opérateur garantit alors que l'image possède bien un canal alpha (pour des formats comme JPEG), tout en laissant intact un éventuel canal alpha déjà activé et existant (comme pour les formats GIF ou PNG). C'est la façon recommandée de s'assurer qu'une image possède un canal alpha après l'avoir lue en mémoire, ou plus important encore, après le traitement d'une image lorsque vous souhaitez rétablir un canal alpha propre.

Alpha On

L'opérateur "[-alpha](https://imagemagick.org/command-line-options/#alpha) On" est l'exact opposé de la méthode Alpha Off vue précédemment. Il est généralement trop simpliste pour l'usage recherché et ne devrait donc être utilisé que très RAREMENT. Vous devriez utiliser "[-alpha Set](#alpha_set)" dans presque tous les cas. Fondamentalement, la méthode 'On' se contente de basculer le commutateur pour rendre à nouveau visibles les données de transparence de l'image. Les données de transparence existantes ne sont pas modifiées ; ainsi, si l'image en mémoire possède encore d'anciennes données de canal alpha, celles-ci redeviendront soudainement visibles. Par exemple, ici nous désactivons 'Off' les données de transparence, puis les réactivons aussitôt 'On', reproduisant l'image d'origine. |

  magick moon.png  -alpha off  -alpha on    alpha_on.png

[IM Output]
Cependant, si l'image ne possède encore aucune donnée alpha, elle sera initialisée comme totalement opaque. Ce qui est la chose logique à faire. Ainsi, pour de nouvelles images tout juste lues en mémoire, cela équivaut à Alpha Set, mais il ne faut pas l'utiliser à cette fin. Le seul moment où Alpha On devrait être utilisé, c'est lorsque vous avez précédemment et volontairement désactivé l'alpha pour une raison quelconque, et que vous souhaitez maintenant restaurer ces données. Par exemple, désactiver puis réactiver le canal alpha permet de préserver les données du canal alpha avant d'appliquer certains opérateurs très spécifiques, tels que "[-shade](https://imagemagick.org/command-line-options/#shade)". Pour un exemple de cet usage particulier, voir Images de forme ombrées.

Alpha Activate/Deactivate

active et désactive respectivement le canal alpha, de façon persistante. Cela ressemble au on/off d'ImageMagick 6. Dans ImageMagick 7, -alpha off supprime définitivement le canal alpha, de sorte que -alpha on ne le réactivera pas.

Alpha Discrete

traite le canal alpha de manière indépendante (sans fusion).

Alpha Opaque

Cette méthode garantit non seulement que le canal alpha est « actif », mais aussi qu'il est totalement opaque, que la transparence de l'image ait été « activée/on » ou « désactivée/off ». Par exemple...

|

  magick moon.png  -alpha opaque    alpha_opaque.png

[IM Output]
Sur les anciennes versions d'IM, cela équivalait à utiliser à la fois "[-alpha off](https://imagemagick.org/command-line-options/#alph)" pour désactiver le canal alpha, puis "[-alpha on](https://imagemagick.org/command-line-options/#alpha)" pour l'activer, tout en le réinitialisant comme opaque. |

  magick moon.png  -alpha off -alpha on  alpha_opaque_matte.png

[IM Output]
La « forme » d'origine de l'image ne peut plus être récupérée après cette opération, car les données originales du canal alpha ont été écrasées. Bien sûr, cela équivaut aussi à utiliser "-alpha off -alpha set", même si, dans ce cas, autant utiliser "-alpha opaque".

Alpha Transparent

De la même façon, cette méthode garantit que le canal alpha est « actif », mais aussi totalement transparent. |

  magick moon.png  -alpha transparent    alpha_transparent.png

[IM Output]
Les données de couleur de l'image sont toujours présentes, si bien que désactiver ensuite la transparence fera de nouveau apparaître les couleurs existantes de l'image. |

  magick moon.png  -alpha transparent  -alpha off  alpha_transparent_off.png

[IM Output]
Bien sûr, la « forme » d'origine de l'image a en réalité été détruite, elle ne peut donc plus être récupérée après cette opération. D'autres façons de rendre une image totalement transparente sont présentées dans Canevas transparent.

Alpha Extract

La méthode 'Extract' se contente de copier le masque « alpha » de l'image sous forme de masque de canal en niveaux de gris.

  magick moon.png  -alpha extract    alpha_extract.png

[IM Output] [IM Output]

Notez que le totalement opaque est blanc, tandis que le totalement transparent est noir pur. Comme l'image contenait quelques pixels semi-transparents le long des bords (pour l'anticrénelage qui donne à la forme de l'image un aspect plus lisse), cette image n'est pas en noir et blanc pur, mais contient aussi quelques pixels gris autour des bords. Si votre ImageMagick est une ancienne version IMv7, voici une technique (presque) équivalente, utilisant l'extraction de canal.

  magick moon.png  -channel a -separate +channel -negate alpha_extract.png

La méthode '[Extract](#alpha_extract)' désactive aussi '[Off](#alpha_extract)' l'alpha, mais celui-ci n'est pas effacé ; réactiver '[On](#alpha_extract)' le canal alpha recréera donc un masque de forme de l'image d'origine. |

  magick moon.png  -alpha extract -alpha on   alpha_extract_on.png

[IM Output]
Notez que toutes les couleurs d'origine auront été remplacées par du blanc, avec diverses nuances de gris autour des bords. On peut le constater en supprimant la transparence sur un arrière-plan blanc (voir la méthode Alpha Remove ci-dessous). |

  magick alpha_extract_on.png -background white -alpha remove alpha_edge.png

[IM Output]
Ces pixels « gris » sont en fait mis à profit dans Contours à partir de formes anticrénelées pour générer un bord ou un contour lisse à partir de la forme d'une image. Cet effet secondaire de l'enregistrement du canal alpha présente un intérêt particulier lors de l'utilisation de l'opérateur Shade, qui ne comprend ni n'utilise le canal alpha d'une image. Voir la sous-section Masquer les formes ombrées.

Alpha Copy

La méthode 'Copy' est l'inverse de '[Extract](#alpha_extract)' et effectue essentiellement un CopyOpacity sur elle-même. Autrement dit, elle transforme une image en niveaux de gris (que son canal alpha soit activé ou non) en une image de masque de forme.

  magick alpha_extract.png  -alpha copy   alpha_copy.png

[IM Output] [IM Output]

Peu importe que l'image possédât ou non un canal alpha existant : tout ce qu'elle fait, c'est créer la transparence de l'image à partir de ses valeurs en niveaux de gris. Une fois que vous disposez d'un masque de forme, vous pouvez utiliser diverses méthodes de teinte de couleur ou de composition alpha Duff-Porter pour le colorer. Pour des exemples d'utilisation d'un masque de forme, voir Les masques comme formes colorées.

Alpha Shape

Pour faciliter l'utilisation d'une image en niveaux de gris, la méthode 'Shape' crée non seulement un masque de forme (comme Alpha Extract), mais le colore aussi avec la couleur d'arrière-plan actuelle.

  magick alpha_extract.png -background Yellow -alpha shape   alpha_shape.png

[IM Output] [IM Output]

Cela signifie que vous pouvez colorer très rapidement un masque en niveaux de gris en donnant simplement une forme à l'image, puis en l'aplatissant sur une autre couleur d'arrière-plan. |

  magick alpha_extract.png -background Yellow -alpha shape \
                            -background Blue   -alpha remove alpha_colormask.png

[IM Output]
| Background n'est en réalité pas la bonne couleur à utiliser pour cette opération de coloration de « forme ». Elle devrait utiliser la couleur 'fill' pour définir la couleur de premier plan de la forme. La couleur à utiliser est donc susceptible de changer. Background n'est employée qu'en raison de difficultés internes d'accès à la couleur de remplissage actuelle. Ce changement interviendra probablement dans le cadre d'IMv7.
---|---
Bien sûr, une manière plus rapide et plus efficace de mapper une image en noir et blanc directement vers des couleurs précises consiste à utiliser l'ajustement de niveaux par couleur, plus spécialisé. Cela évite d'avoir à activer, voire à modifier, le canal de transparence existant de l'image. |

  magick alpha_extract.png  +level-colors Blue,Yellow   level_color.png

[IM Output]
| Ce qui précède mappe les couleurs dans un espace colorimétrique linéaire ; il peut être nécessaire de convertir en sRGB à un moment donné pour obtenir un dégradé de couleurs visuellement plus correct.
---|---

Alpha Remove

La méthode "[-alpha](https://imagemagick.org/command-line-options/#alpha) **Remove**" (ajoutée à IMv6.7.5) est conçue pour supprimer la transparence d'une image en utilisant l'"[-background](https://imagemagick.org/command-line-options/#background)" actuel. |

  magick moon.png  -background tan  -alpha remove  alpha_remove.png

[IM Output]
Notez que, même si la transparence est « supprimée », le canal alpha reste activé, mais est désormais totalement opaque. Si vous n'avez plus besoin du canal alpha, vous pouvez utiliser Alpha Off pour le désactiver. Cette opération est simple et rapide, et fait le travail sans nécessiter de mémoire supplémentaire, ni d'autres effets secondaires susceptibles d'accompagner d'autres techniques de suppression de la transparence. C'est donc la façon recommandée de supprimer la transparence d'une image. Pour d'autres techniques, ou si votre ImageMagick est antérieur à v6.7.5, consultez la discussion plus complète Supprimer la transparence des images ci-dessous.

Alpha Background

Depuis IM v6.5.2-10, une méthode 'Background' est disponible : elle définit la couleur cachée des pixels totalement transparents à la couleur d'arrière-plan actuelle. Normalement, cette couleur n'a aucune importance, car on ne peut la voir que si le canal alpha est désactivé. Toutefois, la couleur des pixels totalement transparents est enregistrée dans le format de fichier image PNG et, pour les grandes images, la présence de couleurs totalement transparentes aléatoires et inconnues peut affecter sensiblement la gestion de la compression. Voir PNG avec une meilleure compression et la discussion du forum IM Eliminating alpha channel garbage pour plus de détails. Notez qu'aucun mélange de couleurs n'est appliqué, seulement une affectation directe de couleur à toute couleur totalement transparente. Les pixels resteront cependant totalement transparents ; vous ne verrez donc aucun changement sur l'image. Par exemple, je l'utilise ici pour définir tous les pixels totalement transparents à 'HotPink'. |

  magick moon.png -background HotPink -alpha Background moon_hotpink.png

[IM Output]
Comme vous pouvez le voir, cela n'a rien changé à l'apparence réelle de l'image. Pour constater le changement, nous allons maintenant désactiver le canal alpha. |

  magick moon_hotpink.png -alpha off moon_hotpink_off.png

[IM Output]

Ce n'est pas la même chose queSupprimer la transparence

Les bords de la forme auront rendu opaques tous les pixels semi-transparents et, par conséquent, produit de forts effets de crénelage (en escalier) sur les bords. Notez que même le format PNG24, normalement uniquement opaque, peut tout de même enregistrer une transparence booléenne si toutes les couleurs totalement transparentes sont identiques. Pour plus de détails, voir l'exemple dans Sous-formats PNG. Ce procédé de remplacement des couleurs revient en fait presque à faire un "-channel RGB -fill _couleur_ -opaque None +channel". Voir Remplacement direct de couleur. Notez que de nombreux autres opérateurs de traitement d'image transformeront eux aussi tout pixel totalement transparent en noir totalement transparent (la couleur 'None'), car c'est l'équivalent chromatique d'un zéro mathématique. Voici un récapitulatif de quelques opérations d'image connues pour faire cela, même si aucune n'est aussi directe ni aussi rapide que cet opérateur.

  magick moon.png \( +clone -alpha off \) \
                        -compose SrcIn   -composite   moon_black.png
  magick moon.png -channel RGBA  -blur 1x.000000001  moon_black.png
  magick moon.png -channel RGBA   -gaussian 1x0      moon_black.png
  magick moon.png -fuzz 0% -transparent none         moon_black.png

Cette dernière méthode (voir Facteur de flou et couleurs transparentes) est particulièrement utile, car vous pouvez non seulement définir toutes les couleurs transparentes en noir totalement transparent ('None'), mais aussi toutes les couleurs presque totalement transparentes (qui possèdent par ailleurs une couleur valide mais pratiquement invisible), simplement en indiquant un facteur de flou (fuzz). Cela entraînera une certaine perte de données, mais peut améliorer la compression des images comportant beaucoup de couleurs presque totalement transparentes. Souvent, ces pixels quasi totalement transparents peuvent avoir des couleurs très étranges ou erronées, et cette méthode vous permet de supprimer ces pixels aberrants avant qu'ils ne causent d'autres problèmes.

Supprimer la transparence des images

Alors qu'Alpha Off se contente de basculer un commutateur et de désactiver le canal de transparence, vous pouvez aussi obtenir le même effet en tentant d'enregistrer l'image dans un format de fichier qui n'autorise pas la transparence. Par exemple, en enregistrant en JPEG...

  magick -size 70x60 xc:none -font Candice -pointsize 50 \
          -fill Black -annotate +10+45 'A' -channel RGBA  -blur 0x5 \
          -fill white -stroke black -draw "text 5,40 'A'"   a.png

  magick a.png  a.jpg

[IM Output] [IM Output]

Rappelez-vous que le format de fichier JPEG n'enregistre pas le canal alpha (de transparence) et se contente donc de le désactiver. Ici, les parties transparentes sont simplement devenues noires (un résultat courant). Mais, selon la source de l'image, les zones transparentes auraient tout aussi bien pu prendre une autre couleur aléatoire ou inappropriée. De plus, dans bien des cas, les pixels semi-transparents peuvent avoir des couleurs très étranges, habituellement invisibles parce qu'ils sont presque totalement transparents. Désactiver simplement la transparence fera ressortir ces pixels de manière criante, rendant le résultat encore pire que ce à quoi vous vous attendiez. Voyez par exemple les bords supérieur-gauche du 'A' ci-dessus. Dans les deux cas, désactiver simplement la transparence n'est généralement PAS ce que l'on souhaite. La meilleure solution consiste à utiliser la méthode Alpha Remove pour remplacer rapidement et simplement la transparence par une couche de couleur d'arrière-plan... |

  magick a.png   -background skyblue  -alpha remove -alpha off a_remove.jpg

[IM Output]
À proprement parler, Alpha Off n'est pas nécessaire dans ce cas, puisque l'enregistrement en JPEG le fait automatiquement.
Une autre technique de suppression de la transparence consiste à générer d'une manière ou d'une autre une nouvelle image d'« arrière-plan » ou de « canevas » et à composer par-dessus (Over) votre image sur cet arrière-plan afin de remplacer la transparence. De préférence en préservant les métadonnées de l'image d'origine, telles que les profils, étiquettes, légendes et commentaires éventuellement présents. Des méthodes pour générer un tel canevas sont illustrées dans Créer des canevas d'image de même taille. Voici l'une de ces méthodes... |

  magick a.png \( +clone -alpha opaque -fill SkyBlue -colorize 100% \) \
          +swap -geometry +0+0 -compose Over -composite  \
          -alpha off  a_compose.jpg

[IM Output]
D'autres façons plus simples de procéder consistent à utiliser une opération qui crée en interne un 'canevas d'arrière-plan cloné' pour vous, en le générant dans le cadre de l'opération de traitement d'image plus large qu'effectue l'opérateur. La méthode la plus courante est d'aplatir (Flatten) l'image. Cet opérateur est tellement utilisé à cette fin que le procédé de suppression de la transparence a souvent été appelé à tort « aplatissement ». Par exemple... |

  magick a.png   -background skyblue -flatten  -alpha off  a_flatten.jpg

[IM Output]
Cependant, cela ne fonctionnera pas avec "[mogrify](basics.html#mogrify)" ni avec une séquence de plusieurs images, essentiellement parce que l'opérateur "[-flatten](https://imagemagick.org/command-line-options/#flatten)" est en réalité conçu pour fusionner plusieurs images en une seule. L'autre méthode courante, qui fonctionne bien avec plusieurs images, consiste à donner à l'image une bordure de taille nulle avec la "[-bordercolor](https://imagemagick.org/command-line-options/#bordercolor)" appropriée. Par exemple... |

  magick a.png   -bordercolor skyblue -border 0  -alpha off  a_border.jpg

[IM Output]
D'autres opérateurs de traitement d'image, étroitement liés aux méthodes ci-dessus, peuvent également supprimer la transparence d'une image. Il s'agit de : Mosaic, Merge et Frame. L'opérateur Extent peut aussi être utilisé : il permet d'agrandir ou de rogner les images en même temps que vous supprimez la transparence, mais seulement si vous connaissez la taille de l'image finale souhaitée. Vous n'êtes pas obligé de remplacer la transparence par une couleur unie. Si vous employez une composition « maison » (comme montré ci-dessus), vous pouvez utiliser n'importe quelle image comme arrière-plan de remplacement. Un exemple simple consiste à utiliser la commande "[composite](basics.html#composite)" pour carreler (Tile) une image « sous » l'originale (à l'aide de Dst_Over). Cette méthode de composition garantit la préservation des métadonnées et de la taille de l'image d'origine. |

  magick composite -compose Dst_Over -tile pattern:checkerboard \
                                               a.png  a_undertile.jpg

[IM Output]
| _Beaucoup des méthodes ci-dessus sont affectées par les informations de canevas virtuel d'une image, ou peuvent les détruire, dans le cadre de leur traitement. Lorsque le canevas virtuel est en jeu, vous pourriez devoir examiner de plus près les détails de chaque opérateur. Dans bien des cas, les effets du canevas virtuel peuvent être utiles à l'ensemble de votre traitement d'image.

_
---|---

Transparence alpha booléenne

Pour certains formats de fichier image, vous n'avez pas besoin de supprimer complètement le canal alpha, mais seulement d'autoriser une transparence purement on/off, ou booléenne. Les formats de fichier image indexés (à palette) tels que GIF et PNG8 en sont typiques. Ces exemples sont pour l'instant traités dans Transparence booléenne GIF, mais devraient à terme être déplacés ici.

Transparence de contour ou de halo

Il vous arrivera de vouloir ajouter un contour autour d'une image comportant de la transparence. Une façon de faire consiste à utiliser la morphologie EdgeOut pour récupérer rapidement tous les pixels voisins de l'image d'origine, les colorer, puis à les composer dessous (DstOver) avec l'image d'origine.

  magick knight.png \( +clone \
             -channel A -morphology EdgeOut Diamond +channel \
             +level-colors red \
           \) -compose DstOver -composite    knight_outlined.png

[IM Output] [IM Output]

Cela peut être particulièrement utile lors de la création d'images au format GIF à partir d'images PNG comportant des pixels de bord semi-transparents. Cela fournit une quantité minimale de couleur d'arrière-plan, tout en laissant le reste de l'image totalement transparent. Voir Des GIF sur un motif d'arrière-plan pour en savoir plus sur ce problème. Une autre méthode consiste à générer un doux halo semi-transparent autour de la forme. Pour ce faire, nous floutons (Blur) et recolorons l'image, puis la composons de nouveau dessous (DstOver) avec l'originale. |

    magick knight.png \(  +clone \
              -channel A  -blur 0x2.5 -level 0,50% +channel \
              +level-colors red \
            \) -compose DstOver  -composite    knight_halo.png

[IM Output]
Ce dernier procédé ressemble en fait à l'utilisation d'un effet de police composite à contour doux, mais avec une image mise en forme plutôt que du texte annoté.


Utilisation des masques avec les images

Masquer une image

Comme montré précédemment, il existe deux ou trois façons de masquer une image afin de rendre transparente une partie de celle-ci. Et la méthode que vous choisissez dépend de si votre masque d'image est un masque en niveaux de gris ou un masque de forme.

Modifier le masque d'une image

Disposer du masque d'une image est vraiment utile. Nous pouvons par exemple effacer très facilement des parties d'une image en modifiant un masque de l'image d'origine. Rappelez-vous que l'opérateur "[-draw](https://imagemagick.org/command-line-options/#draw)" ne peut rien dessiner de « rien » et ne dispose actuellement d'aucune option d'effacement. Ici, nous créons une image, puis en extrayons et modifions le masque, avant de le restaurer sur l'image d'origine.

  magick -size 100x100 xc:none   -stroke black  -fill steelblue \
          -strokewidth 1   -draw "circle 60,60 35,35" \
          -strokewidth 2   -draw "line 10,55 85,10"      drawn.png

  magick drawn.png -alpha extract  mask.png

  magick mask.png -fill black -draw "circle 40,80 60,60" mask_bite.png

  magick drawn.png mask_bite.png \
          -alpha Off -compose CopyOpacity -composite \
          drawn_bite.png

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

Rappelez-vous que le « noir » dans un masque est transparent, tandis que le blanc est opaque ; il nous suffit donc de dessiner du noir par-dessus tout ce que nous ne voulons pas voir. N'oubliez pas l'opération "-alpha Off" ci-dessus, essentielle pour garantir que l'image en niveaux de gris ne contient pas de canal transparent superflu. Et hop, nous avons croqué un morceau de l'image d'origine. Nous pouvons aussi rajouter une partie de l'image que nous avions retirée. Par exemple, ici je rajoute une partie de la « bouchée » que j'avais retirée de l'image d'origine, en dessinant une zone blanche sur le masque. Le masque est ensuite de nouveau restitué à l'image d'origine à l'aide de la composition de canal CopyOpacity.

  magick mask_bite.png -fill white \
          -draw "circle 50,70 60,60" \
          -draw "roundRectangle  78,5 98,25 5,5" \
          -alpha off  mask_bite2.png
  magick composite -compose CopyOpacity mask_bite2.png drawn.png drawn_bite2.png

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

Juste un mot d'avertissement à propos du rajout de parties. En général, ImageMagick remplace toute couleur totalement transparente par du noir, habituellement parce que c'est ainsi que fonctionnent les mathématiques sous-jacentes aux opérateurs. Après tout, elle est totalement transparente et sa couleur ne devrait donc normalement pas avoir d'importance. Cela signifie que si nous rendons opaque une partie de l'image que nous n'avions pas dessinée auparavant, elle sera généralement noire, puisque c'est la couleur sous la transparence de l'image. Toutefois, dans l'exemple ci-dessus, vous aurez remarqué que le format de fichier image PNG a correctement préservé la couleur d'origine (rendue transparente) de l'image. Ainsi, la couleur de la partie rajoutée est restée le 'SteelBlue' d'origine de l'image. Vous ne devriez pas compter là-dessus si l'image a été enregistrée dans un autre format de fichier ou modifiée davantage.
Voici une autre méthode pour effacer des parties d'une image : plutôt que d'extraire et de modifier un masque en niveaux de gris, nous utilisons un masque de forme comme une sorte d'outil « gomme », à l'aide de la méthode de composition DstOut.

  magick -size 100x100 xc:none -draw "circle 40,80 60,60" mask_shape.png

  magick drawn.png mask_shape.png -compose DstOut -composite drawn_bite3.png

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

Comme vous pouvez le voir, les masques de forme sont parfois plus faciles à manier, car vous évitez d'avoir à extraire et restaurer le canal alpha. Cependant, les méthodes de composition alpha Duff-Porter, que j'utilise ici, ne vous permettront jamais de restaurer des couleurs rendues transparentes. Avec ces méthodes, tout ce qui a été rendu transparent (et donc de couleur indéfinie) reste transparent. En réalité, effacer des parties d'une image à l'aide des méthodes de composition alpha détruit la couleur sous-jacente des pixels totalement transparents. Elle ne la préserve pas. Après tout, une couleur transparente n'est pas vraiment une couleur !

Les masques comme formes colorées

Plutôt que d'utiliser simplement le masque pour ajouter ou rajouter de la transparence à une image, on peut aussi combiner directement le masque avec des images de diverses manières. Par exemple, supposons que nous voulions simplement utiliser un masque comme symbole ou forme à superposer sur une image dans différentes couleurs. Pour cela, il nous faut un masque, que j'extrairai d'une police de « symboles » spéciale. |

  magick -font WebDings -pointsize 24 label:Y \
          +trim +repage  -negate   heart_mask.gif

[IM Output]
Notez que j'ai inversé l'image d'étiquette pour en faire un véritable masque, constitué d'un premier plan blanc (opaque) sur un arrière-plan noir (transparent). Depuis IM v6.4.3-7, la façon la plus simple de transformer un masque en niveaux de gris en une forme colorée est d'utiliser l'opérateur Alpha Shape. Cela ressemble exactement à Alpha Copy, mais avec une étape supplémentaire pour colorer la forme finale. |

  magick heart_mask.gif  -background Red -alpha Shape  heart_red.png

[IM Output]
| Notez l'utilisation du format d'image 'PNG' pour l'image de forme générée, plutôt que GIF, afin d'éviter les problèmes detransparence booléenne GIF.
---|---
Auparavant, la solution la plus simple consistait à inverser le masque alpha en une image de canal matte, puis à utiliser Combine pour générer l'image mise en forme. |

  magick heart_mask.gif -negate  \
          -background Gold  -channel A  -combine   heart_gold.png

[IM Output]
La couleur du masque mis en forme est ici définie par la couleur "[-background](https://imagemagick.org/command-line-options/#background)" que Combine a utilisée pour remplir les canaux indéfinis de la nouvelle image. Une méthode plus ancienne mais plus compliquée consiste à utiliser la méthode de composition '[CopyOpacity](compose.html#copyopacity)' pour définir la transparence d'une image sur le masque donné, puis à utiliser la teinte de couleur uniforme pour colorer la forme résultante. Cela fonctionne et fut longtemps la meilleure technique à employer, mais elle n'est plus recommandée. |

  magick heart_mask.gif \( +clone \) -alpha off \
          -compose CopyOpacity  -composite \
          -fill HotPink  -colorize 100%    heart_hotpink.png

[IM Output]
Maintenant que vous disposez d'une image « mise en forme », vous pouvez simplement la superposer sur l'arrière-plan de votre choix, comme l'image de rose intégrée, à l'aide de l'une des nombreuses techniques de superposition d'images et méthodes de composition alpha. |

  magick rose: -page +2+2  heart_gold.png \
                 \( +clone -repage +7+29 \)  \
                 \( +clone -repage +52+14 \)  \
          -flatten       rose_with_love.gif

[IM Output]
C'est très bien si nous voulons tous nos symboles de la même couleur, mais cela exigerait plusieurs images intermédiaires si nous voulions utiliser plusieurs couleurs, ce qui rend la méthode peu pratique pour superposer de nombreux symboles de couleurs différentes. Une façon de créer des superpositions multicolores consiste à recolorer l'image mise en forme immédiatement après l'avoir lue. |

  magick rose: \(  heart_gold.png           -repage +2+2   \) \
          \( +clone -fill Red     -colorize 100% -repage +7+29 \) \
          \( +clone -fill HotPink -colorize 100% -repage +52+14 \) \
          -flatten      rose_colored_love.gif

[IM Output]
Notez que nous ne lisons qu'une seule image mise en forme, puis recolorons un clone de cette image pour chaque nouvelle « couche » à superposer. Pour plus d'exemples de recoloration d'une image de base, voir toute la section sur les modifications de couleur. Voir aussi Dessiner des symboles pour une autre méthode de marquage d'emplacements précis dans une image. Ainsi qu'un exemple d'épinglage de cartes pour des techniques de superposition plus automatisées.

Composition mathématique

Plutôt que de superposer le masque sur un arrière-plan, vous pourriez ne vous intéresser qu'à colorer l'image avec les seules parties blanches ou noires du masque lui-même. C'est relativement simple : il suffit d'utiliser certaines méthodes de composition alpha mathématiques pour changer la couleur du masque afin qu'elle corresponde à une couleur, un carrelage ou une autre image. Par exemple, la méthode de composition '[Multiply](compose.html#multiply)' remplace les zones blanches (valeur de multiplication de 1) par l'image superposée, tout en laissant noires les zones noires (valeur de multiplication de 0). L'opérateur '[Screen](compose.html#screen)' est exactement identique à '[Multiply](compose.html#multiply)', mais avec les images inversées, de sorte qu'il remplace en pratique les zones noires de l'image. Par exemple, utilisons la plus grande image de masque vue plus haut pour superposer une image plus grande générée avec un motif de carrelage.

  magick mask_bite.png -size 100x100   tile:tile_disks.jpg \
                        -compose Multiply  -composite   compose_multiply.png
  magick mask_bite.png -size 100x100   tile:tile_water.jpg  \
                        -compose Screen    -composite   compose_screen.png

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

La méthode de composition alpha '[Multiply](compose.html#multiply)' est particulièrement utile pour remplacer l'arrière-plan des images de texte (c.-à-d. du texte noir sur fond blanc), telles que les images générées à partir de documents PostScript.

Composition alpha masquée

La forme particulière à trois images de la composition alpha masquée permet d'utiliser un même masque pour fusionner directement deux images. |

  magick -size 100x100   tile:tile_water.jpg  tile:tile_disks.jpg \
           mask_bite.png    -composite   compose_masked.png

[IM Output]
La première image remplacera les parties d'arrière-plan noires du masque, tandis que la deuxième image remplacera les parties de premier plan blanches du masque. Le masque lui-même est donné comme troisième image. Le masque sert à sélectionner et à mélanger deux images différentes pour générer le résultat final. C'est en fait assez semblable à un Blend mappé des deux images. Rappelez-vous que la taille finale et les métadonnées de l'image résultante proviendront de la première image d'« arrière-plan » de l'opération ci-dessus (parties noires) ; échangez donc les images et inversez (Negate) le masque si vous le voulez dans l'autre sens. Et enfin, rappelez-vous que si vous utilisez la commande "[composite](basics.html#composite)" au lieu de "[convert](basics.html#convert)", l'image « superposée » (parties blanches) est donnée en premier et l'image d'« arrière-plan » (parties noires) en second. Autrement dit, les deux premières images doivent être échangées pour cette commande.

Aligner deux images masquées

En construction

À propos de l'alignement de deux images masquées...

Si vos masques sont purement booléens, vous ne devriez rencontrer aucun problème, quelle que soit la
façon dont vous les appliquez. En revanche, les masques comportant des bords « anticrénelés »,
« gris » ou « semi-transparents » censés les rendre « d'aspect lisse » peuvent devenir un vrai
casse-tête si vous ne les manipulez pas correctement et avec soin.

Le reste de cette discussion porte sur les masques « anticrénelés ».

Les masques anticrénelés qui s'assemblent existent en deux styles...

 * Ceux qui s'emboîtent comme des pièces de puzzle OU
   comme une cheville de forme donnée dans un trou de même forme (frontière partagée)

 * Les masques censés recouvrir une zone pleine (en couches)

Le second est facile à gérer et correspond à l'effet normal que vous obtenez lorsque vous superposez
une forme colorée sur une image totalement opaque. Vous utiliseriez essentiellement la composition
« over » pour composer la forme.

Les premiers, les masques « en puzzle », sont en revanche plus difficiles. De tels masques ne sont censés
ni se chevaucher ni se sous-chevaucher. Et pourtant, si vous tentez de les assembler
avec la composition « over » évidente et habituelle, vous obtiendrez une
jonction semi-transparente là où les « bords anticrénelés » sont fusionnés.

_Exemple d'une mauvaise jonction de « masque en puzzle » (over)_

La bonne façon d'assembler des masques et des images « en puzzle » mises en forme est d'utiliser
la composition **Plus** pour « additionner » les images, avec un arrière-plan
soit noir, soit totalement transparent.

_Exemple d'une jonction correcte de « masque en puzzle » (plus)_


Pour un autre exemple d'assemblage d'images « maison », utilisant les compositions 'Dst-In', 'Dst-Out' et
'Plus', voir les exemples dans...
  https://usage.imagemagick.org/compose/#dstin

Je détaille aussi ce point d'assemblage dans le rapport de bogue de la composition alpha à 3 images
[Composite Mask Bug
- Fixed](https://usage.imagemagick.org/bugs/composite_mask/#correct).

Pour en savoir plus sur la différence entre 'over' et 'plus', voir [« Blend » (plus) vs « Dissolve » (over)](compose.html#blend_dissolve)

Des exemples d'assemblage correct de pièces alignées sur les bords sont montrés dans
[Cubes 3D - Affine](distorts.html#cube3d) et de nouveau dans [Boîtes 3D - Perspective](distorts.html#box3d)
ainsi que dans Cube isométrique par cisaillements
  https://usage.imagemagick.org/warping/#sheared_cube

Le principal problème de ces exemples est que les pièces individuelles n'ont PAS été
générées avec le même masque, mais déformées jusqu'à leur position finale.
De ce fait, elles ne s'emboîtent pas tout à fait correctement une fois assemblées.

Ces exemples devraient être mis à jour pour utiliser une méthode de composition 'Plus'. Afin d'
obtenir de meilleurs résultats, mais même alors ils ne seront probablement pas tout à fait
« corrects », car les masques ne s'« emboîtent » pas exactement.

Générer des masques correctement alignés sur les bords

La meilleure idée est d'utiliser le même masque (inversé) pour les DEUX pièces, plutôt que
de tenter de dessiner les deux masques séparément. Sinon, vous obtenez soit un chevauchement
des deux masques, soit un espace, exactement comme vous l'avez vu.

Méthodes correctes d'assemblage de masques..

    * utiliser le masque pour définir la transparence d'une pièce
      utiliser le masque inversé pour définir la transparence de l'autre pièce
      « additionner » (Plus) les deux pièces ensemble.

    * utiliser le masque pour ajouter de la transparence à une seule pièce, puis
      composer cette pièce « par-dessus » (Over) une image complète.

    * utiliser une composition masquée à trois images
      voir https://usage.imagemagick.org/compose/#mask
      et https://usage.imagemagick.org/masking/#masked_compose
      Qui utilise le masque pour sélectionner les résultats de deux images différentes.

Rappelez-vous que « Over » n'a besoin que de l'image « source » ou « superposée » masquée, l'
image d'arrière-plan ne devant pas avoir de bords semi-transparents alignés.
En revanche, une composition « plus » exige que les deux images soient masquées avec un masque exactement
inverse l'un de l'autre le long du bord assemblé.

AVERTISSEMENT : Draw ne vous permet actuellement PAS de générer deux formes qui
s'emboîteront correctement sans chevauchement !!!!

Voir [Draw Fill Bounds](draw.html#bounds) pour plus de détails.

Je n'ai pas vérifié si SVG présente le même problème.

Masques d'image spéciaux

Masques d'écriture - Protéger les pixels contre les modifications

Un masque « d'écriture » ou « de découpe » (clip-mask) est une image spéciale en niveaux de gris, ajoutée à une image existante de même taille. Il définit des zones de l'image qui doivent être considérées comme « immuables » ou « non inscriptibles » par la plupart des opérateurs de traitement d'image. L'opérateur "[-mask](https://imagemagick.org/command-line-options/#mask)" prend une image externe à lier aux images en mémoire. La forme « plus » de l'opérateur "[+mask](https://imagemagick.org/command-line-options/#mask)" retire le masque de l'image. Par exemple, j'utilise ici un « masque d'écriture » pour protéger les pixels d'arrière-plan contre toute écriture, tout en faisant pivoter les teintes pour recolorer la rose rouge de premier plan en une rose bleue.

  magick rose: -mask rose_bg_mask.png \
          -modulate 110,100,33.3  +mask rose_blue.png

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

Le masque est un peu grossier, mais il a bien fonctionné. Rappelez-vous simplement qu'un « masque d'écriture » sert à indiquer la partie à protéger ou à préserver. Rappelez-vous, sous IMv7...

L'opérateur "[-mask](https://imagemagick.org/command-line-options/#mask)" définit un masque de « protection en écriture »

Pour un exemple plus avancé, voir Masquage par incrustation couleur (Chroma Key), qui porte davantage sur la génération du masque que sur son application en tant que masque d'écriture. Les masques d'écriture ou de découpe sont conçus pour fonctionner lorsque les pixels d'une image sont directement modifiés. Par ex. : negate, level, teinte de couleur, modulate, dessin, composite, morphologie, convolutions. Pour les opérateurs qui génèrent de NOUVELLES images (resize, distorts, extent, etc.), il échouera à préserver les pixels d'origine, car le masque ne pourra pas correspondre à la nouvelle taille de l'image. De telles opérations auront aussi pour effet secondaire de retirer ou d'annuler le « masque d'écriture » de l'image. Voici un autre exemple...

  magick -size 70x70 xc:red  red_image.png
  magick -size 70x70 xc: -draw 'circle 35,35 30,5'  write_mask.png

  magick red_image.png  -mask write_mask.png \
          -fill blue -opaque red   +mask    masked_color_replace.png

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

Notez que les bords du masque comme de l'image résultante sont lisses (anticrénelés) ; c'est parce que le masque n'est pas un simple masque booléen, mais un masque de fusion. Le « masque d'écriture » est un masque de fusion en ce sens que les pixels « gris » du masque produisent une fusion des nouveaux pixels avec les anciennes valeurs de l'image, proportionnellement à la quantité de gris présente. Cela produit des bords très lisses et permet aussi de générer un dégradé sur l'image entre les zones modifiées et non modifiées. Toutefois, un masque de fusion, s'il convient à une seule opération, peut ne pas convenir lorsqu'il est utilisé pour plusieurs opérations, car son effet de fusion sera alors appliqué plusieurs fois. Ce problème est particulièrement présent dans une opération en boucle comme la morphologie. Mais seulement si vous utilisez un masque de fusion non booléen. Si cela pose problème, il vaudra probablement mieux effectuer toutes les opérations sur une copie de l'image, puis utiliser la composition alpha masquée sur l'image d'origine. La prudence est de mise.
Cette utilisation du masquage correspond en fait exactement à la façon dont fonctionne le masquage de composition ! Mais uniquement le temps de l'application de l'opérateur de composition.

  magick -size 70x70 xc:green  green_image.png

  magick red_image.png  green_image.png  write_mask.png \
          -composite    masked_composite.png

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

Équivaut (avec un masque inversé) à... |

  magick write_mask.png  -negate -write MPR:mask +delete \
          red_image.png -mask MPR:mask \
          green_image.png  -composite  +mask  masked_composite_equiv.png

[IM Output]
Autrement dit, le masque est inversé, puis appliqué à la première image « de destination ». La seconde est ensuite composée par-dessus la première, ne modifiant que les zones « blanches » de l'image de masque d'origine.

Une opération "[-composite](https://imagemagick.org/command-line-options/#composite)" à trois images utilise un masque d'« écriture »

En morphologie, les masques d'écriture servent généralement à générer une forme de morphologie conditionnelle ou contrainte d'une opération. Un tel exemple a été abordé sur le forum de discussion IM, Cleaning up noise around text, pour limiter les effets d'une dilatation. NOTE : -crop devrait pouvoir préserver le masque d'image des images individuelles, en rognant aussi le masque et en l'affectant aux nouvelles images. Cela n'est cependant pas fait actuellement.

Masque et chemins de découpe

La forme "[-clip-mask](https://imagemagick.org/command-line-options/#clip-mask)" de cet opérateur est presque exactement identique à ce qui précède, mais ne fournit qu'un style de masquage booléen (tout ou rien). Vous ne pouvez donc pas obtenir un résultat « fusionné » ou lissé. Par exemple... |

  magick red_image.png  -clip-mask write_mask.png \
          -fill blue -opaque red   +clip-mask    clipped_modulate.png

[IM Output]
Comme vous pouvez le voir, le résultat est fortement crénelé (avec des bords en escalier), car un "[-clip-mask](https://imagemagick.org/command-line-options/#clip-mask)" ne produit pas de résultat fusionné comme le fait "[-mask](https://imagemagick.org/command-line-options/#mask)". Le seul avantage est qu'il est légèrement plus rapide (mais pas de beaucoup). Il a été fourni à l'origine pour permettre la gestion des chemins de découpe dans les fichiers image TIFF, et c'est un opérateur très ancien (IMv5). Le nouvel opérateur "[-mask](https://imagemagick.org/command-line-options/#mask)" devrait être utilisé à la place. | _Sous IMv7, un « masque d'écriture » et un « masque de découpe » sont implémentés côte à côte, même s'ils remplissent techniquement exactement la même fonction. Vous pourriez donc appliquer les deux masques simultanément.

Utiliser les deux en même temps n'est cependant pas recommandé, et les résultats ne sont pas définis. De plus, cette forme de « masque booléen » a été retirée d'IMv7.

_
---|---

Chemins de découpe pour les images TIFF

Un « chemin de découpe » (clip path) fait partie du format de fichier image TIFF et définit un tracé vectoriel utilisé pour définir une « zone mise en forme » à l'intérieur de l'image TIFF. Dans IM, les opérateurs "[-clip](https://imagemagick.org/command-line-options/#clip)" et "[-clip-path](https://imagemagick.org/command-line-options/#clip-path)" lisent ce « chemin de découpe » et le convertissent en un masque de découpe (ci-dessus). Il définit ainsi un « masque d'écriture » qui protégera la forme de toute modification. Un chemin de découpe stocké dans l'image TIFF est défini comme un tracé SVG, que vous pouvez extraire d'un format de fichier image TIFF à l'aide de...

  magick identify -format '%[8BIM:1999,2998:#1]' image_clip.tiff

Le plus gros problème que rencontrent souvent les utilisateurs est de rendre transparent tout ce qui n'est pas découpé. Ce qui exige d'écrire dans les zones que le masque protège en écriture ! Voici une solution, qui convertit l'image entière en transparence, puis active le « chemin de découpe » et rend de nouveau opaques (visibles) les parties désormais inscriptibles.

  magick input.tiff -alpha transparent -clip -alpha opaque -strip out.tiff

L'opérateur "[+clip](https://imagemagick.org/command-line-options/#clip)" désactive et retire lui aussi le masque de découpe (tout comme le fait "[+clip_mask](https://imagemagick.org/command-line-options/#clip_mask)"). Cependant, aucun format de fichier n'enregistre le masque de découpe actuel avec l'image, quel que soit le format de fichier image. (Du moins sous IMv7)

Masques de lecture - Ignorer les pixels en entrée

Il est important de noter qu'un masque d'écriture limite les pixels qui seront écrits dans une image. Il ne limite toutefois pas les pixels qui sont « lus » dans le cadre de l'opération effectuée pour créer les nouvelles données de pixels à écrire. Cela signifie essentiellement que si vous utilisez un opérateur à « effet de zone » ou de type « voisinage », tel que les flous, la morphologie ou la convolution, alors les « pixels inscriptibles » proches du bord peuvent inclure des valeurs de couleur provenant de la zone masquée, ou non inscriptible. Par exemple, ici nous protégeons en écriture la rose de premier plan, avant de flouter l'image. Autrement dit, nous voulons ne flouter que la partie d'arrière-plan de l'image, assez fortement dans ce cas.

  magick rose: -mask rose_fg_mask.png \
            -blur 0x8   +mask  rose_bg_blur_fail.png

[IM Output] [IM Output] [IM Output]
Le résultat utilise un masque de protection en écriture et n'est pas ce qui était souhaité.

Comme vous pouvez le voir, même si les couleurs de premier plan étaient protégées par le masque, elles ont tout de même servi lors du floutage de l'arrière-plan autour de la rose. De ce fait, l'arrière-plan flouté proche du premier plan présente une nette teinte ou un halo rougeâtre. Autrement dit, les couleurs de premier plan ont « fui » dans l'arrière-plan environnant. Ce n'est généralement pas ce que l'on cherche à faire lorsqu'on veut flouter l'arrière-plan d'une image, par exemple dans le cadre d'un effet de mise au point. Ce que l'on souhaite vraiment, c'est que le flou « ignore » complètement les pixels de premier plan et ne laisse que les couleurs de l'arrière-plan participer au processus de floutage. Autrement dit, on voulait empêcher le flou de « lire » les pixels de premier plan.

Solution de masque de lecture pour IMv7

Sous IMv7, la seule façon de rendre la couleur d'un pixel illisible est de rendre ce pixel transparent. Les pixels transparents n'ont, par définition, aucune couleur ; la « couleur cachée » ne fait donc pas partie des calculs effectués par l'opération de flou. Cela nous donne une « astuce ». Rendez les pixels de premier plan transparents, appliquez le flou (ou une autre opération), puis désactivez la transparence (dont on ne veut pas vraiment ici). Nous pouvons ensuite restaurer la partie de premier plan de l'image. Si cela paraît compliqué, ça l'est. Voici les étapes en jeu, avec des images intermédiaires pour tenter de rendre la technique claire...

  magick rose: rose_bg_mask.png -alpha off \
          -compose CopyOpacity -composite   +compose  rose_bg_only.png
  magick rose_bg_only.png  -channel RGBA -blur 0x8   rose_bg_blurred.png
  magick rose_bg_blurred.png      -alpha off         rose_bg_blur_opaque.png
  magick rose_bg_blur_opaque.png \
                rose: rose_fg_mask.png -composite    rose_bg_blur_good.png

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

Le résultat est la suppression de l'effet de halo rouge qui « fuyait » auparavant dans l'arrière-plan flouté. Voici une comparaison côte à côte des versions à masque d'écriture et à masque de lecture du flou d'arrière-plan, afin que vous voyiez clairement comment nous avons éliminé la « fuite » de la couleur de premier plan dans l'arrière-plan. [IM Output]
Écriture | [IM Output]
Lecture
---|---
Différences entre les méthodes de masquage
L'exemple ci-dessus suppose que l'image d'origine n'a pas d'alpha. Si une image contient aussi un canal alpha, vous devez alors séparer et traiter l'alpha à part, doublant ainsi le travail. Un exemple en est montré dans une discussion sur le « redimensionnement par distorsion », où l'on voulait ignorer les pixels virtuels entourant l'image redimensionnée à l'aide de distort. Voir Redimensionnement correct (avec les distorsions) pour le détail. Notez que ce qui précède est aussi très étroitement lié à une technique de remplissage de trous par flou. La seule différence est que c'est l'arrière-plan qui est préservé de toute modification, et non le premier plan. Ce qui rend la chose un peu plus simple. De véritables « masques de lecture » devraient être disponibles dans IMv7 pour que ce qui précède se résume à ajouter à la fois un « masque de lecture » et, éventuellement, un « masque d'écriture ».


Régions et sous-images de région

Les régions sont une autre façon de limiter les effets des opérations à une plus petite zone d'une image. Par exemple, ici je teinte en rouge toute la région rectangulaire... |

  magick koala.gif  -region 40x33+15+5 -fill red -colorize 50% \
          koala_region_red.gif

[IM Output]
Vous pouvez aussi rendre une région transparente... |

  magick koala.gif -alpha set \
          -region 40x33+15+5 -alpha transparent   koala_region_trans.gif

[IM Output]
Notez que j'ai dû m'assurer que l'image d'origine avait un canal alpha activé avant de rendre l'« image de région » transparente. Sans cela, IM rendrait toute transparence de l'« image de région » « transparente vers l'original », et vous ne verriez aucun changement. Voir Fonctionnement des régions ci-dessous pour plus de détails. | Avant IM v6.6.9-5, la préservation de la transparence était défaillante, et le résultat de la transparence dans une région était toujours « transparent vers l'original ». Le résultat de l'exemple ci-dessus n'aurait donc inclus aucun pixel transparent, même si l'image autorisait l'utilisation de la transparence.
---|---
La principale raison d'utiliser les régions, c'est qu'elles ne se contentent pas de limiter leur effet à une petite zone : elles extraient en réalité cette zone rectangulaire de l'image et appliquent toutes les opérations simples qui suivent à cette zone plus petite. Cela signifie que si vous ne modifiez qu'une toute petite zone d'une très grande image, par exemple pour une correction des yeux rouges, vous limitez non seulement la portée des opérations à cette zone, mais vous les effectuez aussi beaucoup plus vite, et l'image de région extraite est elle-même plus petite. En résumé... Un masque d'écriture effectuera les opérations sur toute l'image, mais limitera les pixels réellement modifiés, tandis que les régions utilisent une sous-image extraite plus petite. Notez que rien n'empêche d'utiliser ces deux méthodes conjointement. Toutefois, si vous appliquez un masque de découpe à une région, ce masque devrait correspondre à la taille de l'image de région extraite.

Déformer une région locale

Comme une « région d'image » extrait en réalité une « petite sous-image » de l'original pour la traiter, vous pouvez tirer parti des distorsions circulaires « localisées » spéciales pour déformer de petites régions de l'image d'origine. Par exemple, nous avons ici une ligne de rayures.

  magick -size 600x70 xc:darkred \
          -fill white -draw 'roundrectangle 5,5  595,65 5,5' \
          -fill black -draw 'rectangle 5,25 595,31' \
          -fill red -draw 'rectangle 5,39 595,45' \
          lines.gif

[IM Output]

Maintenant, en définissant des régions, nous pouvons déformer la ligne de différentes manières dans différentes zones.

  magick lines.gif \
          -region 90x70+10+0    -swirl  400  \
          -region 90x70+100+0   -swirl  400 \
          -region 90x70+190+0   -swirl -400 \
          -region 120x70+280+0  -implode 1.5 \
          -region 100x70+380+0  -implode -7  \
          -region 101x70+480+0  -wave 10x50 -crop 0x70+0+10\! \
          +region lines_regions.gif

[IM Output]

Notez que "-implode" et "-swirl" s'intègrent très bien à l'utilisation des régions, car ils ont la propriété que le bord extérieur de l'image déformée s'aligne avec le reste de l'image en dehors de la région définie. Autrement dit, ils sont réellement conçus pour effectuer une 'déformation localisée d'image'. Notez que lorsque j'ai utilisé la distorsion Wave, j'ai dû rogner la taille de l'image « wave » résultante pour qu'elle rentre de nouveau dans la zone d'origine dont elle avait été extraite. Rappelez-vous que les régions ne fonctionnent qu'avec les opérateurs de traitement d'image simples. Tout autre opérateur, y compris un autre opérateur "-region", annulera le traitement de région avant que cette opération ne soit appliquée.

Fonctionnement des régions et ses problèmes

En réalité, les régions fonctionnent ainsi...

  • Extraire de l'image une image plus petite selon l'opérateur "-region", à l'aide d'un simple rognage avec l'argument de région.
  • Appliquer à cette image plus petite les éventuels opérateurs de traitement d'image simples qui suivent.
  • Lorsqu'un opérateur d'image non simple est rencontré, OU qu'un autre opérateur "-region" est trouvé, OU que la région est désactivée avec "+region", la région extraite est superposée sur l'image d'origine à son emplacement d'extraction.

Les régions fonctionnent d'une manière semblable à l'utilisation des opérateurs de pile d'images, même si elles existaient dans ImageMagick bien avant ces opérateurs. Elles faisaient par exemple partie intégrante de la version 5 d'IM. Par exemple, si vous avez cette opération de région...

  ... -region WxH+X+Y  ...simple-operators... +region ...

le résultat équivaut à ceci (pour une seule image)...

  ... \( +clone -crop WxH+X+Y ...simple-operators... \
         \) -geometry +X+Y -composite   ...

Ou à ceci (pour plusieurs images)...

  ... \( -clone 0--1 -crop WxH+X+Y ...simple-operators... \
         null: +insert \) -geometry +X+Y -layer composite ...

La façon dont l'« image de région » est réellement superposée sur l'« image d'origine » est un peu délicate... Si l'image d'origine n'a aucun canal de transparence activé, l'« image de région » est composée à l'aide de la composition Over. Cela signifie que les zones transparentes de l'image de région deviendront transparentes, laissant voir l'image d'origine derrière elle. Par exemple, ici j'ai volontairement désactivé la transparence dans l'image d'origine, puis j'ai pivoté (Rotate) la région afin de produire des zones de transparence dans les coins. |

  magick koala.gif -alpha off -region 30x30+10+10 \
          -alpha on -background None  -rotate 30  koala_region_rotate_1.gif

[IM Output]
Comme vous pouvez le voir, les coins de la zone pivotée (qui étaient transparents dans l'« image de région ») laissent voir l'« image d'origine ». Fondamentalement, comme l'image d'origine ne peut pas gérer la transparence, l'image de région est simplement superposée, avec des coins transparents. Si l'image d'origine contient bien une transparence active, alors la transparence de l'image de région modifiée peut elle aussi être modifiée : la transparence est simplement « copiée » telle quelle. |

  magick koala.gif -alpha set  -region 30x30+10+10 \
          -background None  -rotate 30    koala_region_rotate_2.gif

[IM Output]
Comme vous pouvez le voir, IM utilise une composition Copy, de sorte que toute transparence présente dans l'image de région est aussi copiée sur l'image d'origine. Si, pour une raison quelconque, vous souhaitez que l'image d'origine préserve sa transparence d'origine, désactivez l'alpha d'abord, puis, une fois l'image de région restaurée, réactivez-le pour la rétablir.
Les images de région agrandies ou réduites peuvent ne pas « rentrer » de nouveau dans l'original. Par exemple, ici je redimensionne (et colore) l'image de région pour la rendre plus petite... |

  magick koala.gif  -region 30x30+10+10 \
          -resize 75% -fill red -colorize 30%  koala_region_shrink.gif

[IM Output]
Comme vous pouvez le voir, la région d'origine n'a pas été entièrement couverte par l'image de région restaurée. Les parties non couvertes n'ont donc pas été remplacées. De la même façon, si la région devient plus grande, une plus grande partie de l'image d'origine peut se retrouver couverte par l'image de région superposée. |

  magick koala.gif  -region 30x30+10+10 \
          -resize 150% -fill red -colorize 30%  koala_region_enlarge.gif

[IM Output]
Dans les deux cas, le décalage supérieur-gauche de la région ne bouge pas. Vous ne pouvez pas simplement réduire une image de région et la centrer dans la zone de la région, ni positionner l'image de région à un autre endroit. La prudence s'impose pour empêcher les images de région de changer de taille. Dans certaines circonstances particulières, vous pouvez néanmoins gérer une région redimensionnée. Pour un exemple, voir l'exemple de « distorsion wave » ci-dessus. | _Comme avec "[mogrify](basics.html#mogrify)", vous ne pouvez pas fusionner plusieurs sous-images, car cela nécessite une opération d'image non simple. Vous pouvez toutefois utiliser "[-draw](https://imagemagick.org/command-line-options/#draw)" comme méthode de composition alternative. Voir Composition alpha dans Mogrify pour un exemple.

_
---|---
| _Au moment de la rédaction, l'« image de région » contient encore ledécalage de canevas virtuel de rognage issu de son extraction de l'image d'origine. Cela peut ou non être considéré comme un bogue, selon que cette information vous soit utile ou non. Le décalage n'est actuellement pas utilisé lorsqu'une image de région est restaurée.

Si le décalage n'est pas souhaité (car il interfère avec un opérateur tel que Distort), faites suivre l'option "[-region](https://imagemagick.org/command-line-options/#region)" d'un opérateur "[+repage](https://imagemagick.org/command-line-options/#repage)" pour retirer le décalage des images de région. Sa suppression ou sa modification n'affectera pas sa restauration sur l'image d'origine.

_
---|---


Suppression de l'arrière-plan

L'un des problèmes les plus courants du traitement d'image est la génération d'un masque à partir d'une image existante totalement opaque. De telles images sont souvent téléchargées depuis le Web, générées par des programmes, ou dans des formats d'image qui ne fournissent aucune forme de transparence. Il se peut aussi que vous ayez la photo d'un objet et que vous vouliez en supprimer l'arrière-plan. Rappelez-vous que les photos n'ont aucune notion de transparence ; vous devez donc supprimer vous-même les parties indésirables. Malheureusement, il n'existe pas de solution générale à ce problème, surtout lorsque vous voulez aussi conserver les éventuels bords semi-transparents de l'image. Par conséquent, il existe des centaines de façons et de variantes pour accomplir cette tâche, toutes dépendantes de la situation exacte. Étroitement liés au masquage d'image, il y a les ajustements de transparence pour s'accorder à l'arrière-plan sur lequel une image sera superposée. Ce point est traité en détail dans la partie sur l'enregistrement au format de fichier image GIF, qui n'autorise qu'une transparence booléenne.

Masquer les arrière-plans simples (floodfill)

Lorsque l'arrière-plan d'une image est une simple couleur unie unique, vous pouvez souvent générer des masques simples (et supprimer l'arrière-plan) en effectuant simplement un remplacement des couleurs dans les images. Par exemple, voici un masquage direct par remplissage (floodfill) d'une image dont l'arrière-plan est une couleur unie. |

  magick cyclops.png -alpha set -channel RGBA \
          -fuzz 1% -fill none -floodfill +0+0 white \
          cyclops_flood_1.png

[IM Output]
Eh bien, cela n'a pas fonctionné, car le point de « départ » (seed) du remplissage, dans le coin supérieur-droit, n'atteint en réalité pas toutes les parties de l'image !!! La solution consiste à agrandir légèrement l'image afin d'offrir au remplissage un chemin vers tous les bords extérieurs de l'image. Pour cela, vous devez toutefois connaître la couleur de l'arrière-plan. |

  magick cyclops.png -bordercolor white -border 1x1 \
          -alpha set -channel RGBA -fuzz 1% \
          -fill none -floodfill +0+0 white \
          -shave 1x1    cyclops_flood_2.png

[IM Output]
Bien sûr, nous n'avons pas indiqué un très bon facteur de flou. Le problème, c'est que vous obtenez un halo autour de l'objet à l'intérieur de l'image. Cela vient du fait que la plupart des images contiennent des pixels spéciaux le long des bords qui lissent l'aspect de l'image. Toutefois, comme cette image possède une bonne bordure noire par rapport à l'arrière-plan, un réglage de flou bien élevé permet de séparer proprement l'image de l'arrière-plan. |

  magick cyclops.png -bordercolor white -border 1x1 \
          -alpha set -channel RGBA -fuzz 20% \
          -fill none -floodfill +0+0 white \
          -shave 1x1    cyclops_flood_3.png

[IM Output]
Cette technique présente quelques problèmes. Premièrement, c'est un masquage tout ou rien de l'image, produisant des bords crénelés, en escalier et souvent d'aspect affreux. C'est acceptable pour le format de fichier image GIF, limité, mais peu satisfaisant si vous comptez superposer cette image sur un autre arrière-plan. Il est aussi extrêmement difficile de capturer chaque pixel de bord anticrénelé. Ainsi, si je superpose l'image ci-dessus sur un arrière-plan noir, vous pourriez voir certains pixels bien plus blancs que la normale. |

  magick cyclops_flood_3.png -background black -flatten \
          cyclops_flood_3_over.png

[IM Output]
De plus, si vous parvenez à utiliser un facteur de flou suffisamment élevé, vous risquez le problème de n'avoir presque plus de pixels de bord, ou de « fuir » vers le centre de l'image. Enfin, un remplissage direct comme celui-ci ne fonctionne pas pour un arrière-plan qui n'est pas une simple couleur unie unique.

Découper les objets bordés

Les images comportant déjà une bordure de couleur unique présentent un net avantage pour ces méthodes de suppression d'arrière-plan, car la bordure fournit une limite précise entre ce qui est « à l'intérieur » et ce qui est « à l'extérieur » de l'image, ce qui permet à son tour une meilleure méthode pour définir la frontière de l'image d'arrière-plan. Autrement dit, plutôt que d'indiquer quelles couleurs doivent être considérées comme de l'arrière-plan, nous pouvons plutôt indiquer quelles couleurs marquent la bordure de l'objet à masquer. De plus, comme la couleur de la bordure est connue, seules deux couleurs précises auront été mélangées autour des bords de l'image. Autrement dit, les deux couleurs sont connues, et donc le degré exact de transparence des bords est lui aussi très bien connu.

En construction

Supprimer un arrière-plan connu

Si la suppression d'un arrière-plan simple vers un masque « booléen » est relativement simple, les choses se compliquent lorsque l'arrière-plan n'est pas si simple. Toutefois, si l'arrière-plan lui-même est connu, vous pouvez vous en servir pour aider à le supprimer d'autres images. Depuis IM v6.3.4, une méthode de composition alpha spéciale, appelée '[ChangeMask](compose.html#changemask)', a été ajoutée : elle permet la suppression directe d'un arrière-plan connu d'une image. Par exemple, nous avons ici une image d'arrière-plan intacte, et une autre sur laquelle a été superposée une image GIF à transparence booléenne simple (tout ou rien). En utilisant '[ChangeMask](compose.html#changemask)', nous pouvons récupérer cette image superposée d'origine (si elle est très différente de l'arrière-plan).

  magick overlay_figure.gif   overlay_bgnd.gif  \
            -compose ChangeMask  -composite  overlay_removed.png

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

Fondamentalement, cela détermine à quel point les pixels diffèrent d'une image à l'autre et, si la différence est inférieure au facteur de flou actuel, rend ce pixel transparent. Seuls les pixels totalement transparents sont ajoutés à l'image ; sinon, l'image d'origine est laissée telle quelle, avec sa transparence et tout le reste. Nous pouvons simuler l'opérateur en utilisant l'ancienne méthode de composition '[Difference](compose.html#difference)' pour générer une image de différence de comparaison...

  magick composite overlay_figure.gif   overlay_bgnd.gif  \
            -compose Difference     overlay_difference.png

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

Comme vous pouvez le voir, l'image de différence est noire pour toutes les parties inchangées et un mélange de couleurs pour les parties qui ont changé. En séparant et en additionnant les canaux de couleur individuels, puis en seuillant, on obtient un masque de toute différence dans n'importe quel canal entre les deux images. |

  magick overlay_difference.png -channel RGB -separate +channel \
          -evaluate-sequence add  -threshold 0   overlay_mask.png

[IM Output]
À l'aide de ce masque, nous pouvons rendre transparent tout ce qui n'a pas changé. |

  magick overlay_figure.gif overlay_mask.png \
          -alpha off -compose CopyOpacity -composite \
          overlay_removed.png

[IM Output]
Comme vous pouvez le voir, la méthode de composition '[ChangeMask](compose.html#changemask)' facilite grandement ce processus. Toutefois, cela ne fournit qu'un masquage d'arrière-plan de type « tout ou rien ». Elle ne permet pas les bords flous ou anticrénelés, ni un adoucissement transparent du résultat.

Masquage par image de différence et adoucissement

Ce qui précède peut être poussé plus loin, jusqu'aux images qui ont des bords crénelés, ainsi qu'aux arrière-plans non simples. Par exemple, nous avons ici un « Cyclope » sur un arrière-plan blanc, que nous voulons extraire. Nous générons ensuite une image en niveaux de gris des différences entre cette image et la couleur d'arrière-plan (définie par le pixel le plus en haut à gauche). |

  magick cyclops.png \( +clone -fx 'p{0,0}' \) \
          -compose Difference  -composite  \
          -modulate 100,0  -alpha off  difference.png

[IM Output] [IM Output]
Bien sûr, cette image de différence n'est pas utilisable directement comme masque. Si vous l'utilisiez, vous rendriez en pratique la majeure partie de votre image semi-transparente, au lieu du seul arrière-plan environnant. Toutefois, à partir de cette image de différence, un très grand nombre de masques de transparence différents peuvent être créés, selon exactement ce que vous cherchez à obtenir. Nous pouvons ajuster l'image de différence ci-dessus pour produire un masque de tous les pixels qui diffèrent, ne serait-ce que très légèrement, de la couleur d'arrière-plan. |

  magick difference.png  -threshold 0  boolean_mask.png
  magick cyclops.png  boolean_mask.png \
          -alpha off -compose CopyOpacity -composite \
          cyclops_boolean.png

[IM Output] [IM Output]
Comme vous pouvez le voir, un masque booléen « toute différence » a fait inclure une bonne partie de l'arrière-plan d'origine. Cela vient du fait que l'image d'origine est soit « anticrénelée », soit légèrement floutée avec l'arrière-plan (ici, cela était dû au redimensionnement de l'image d'origine à partir d'une image au format JPEG). Ce ne serait pas un problème si l'image d'origine était elle-même une superposition booléenne (par ex. une image au format GIF, superposée sur un arrière-plan). Dans ce cas, votre résultat sera parfait (voir l'exemple 'ChangeMask' ci-dessus). En faisant varier le "[-threshold](https://imagemagick.org/command-line-options/#threshold)", vous pouvez ajouter un « facteur de flou » au masque booléen (on/off uniquement), afin de rapprocher le masque de l'image proprement dite. |

  magick difference.png  -threshold 15%  threshold_mask.png
  magick cyclops.png  threshold_mask.png \
          -alpha Off -compose CopyOpacity -composite \
          cyclops_threshold.png

[IM Output] [IM Output]
Remarquez que l'œil du Cyclope est maintenant lui aussi considéré comme un trou transparent ! Ce « trou » met en évidence le principal inconvénient de toute cette technique. Les parties de l'objet de l'image qui sont proches de la couleur d'arrière-plan, ou pire encore qui correspondent exactement à l'arrière-plan, seront considérées comme identiques à l'arrière-plan. Bien sûr, cela peut être souhaitable pour des images d'objets « troués », comme un beignet, mais pour notre Cyclope, un « œil troué » est assurément une erreur. L'effet de « halo » d'origine peut aussi être souhaitable pour certaines choses, comme du texte, afin de le rendre plus lisible lorsque vous voulez le superposer de nouveau sur un autre arrière-plan « bruité ». Vous pouvez accentuer l'effet de halo en floutant un peu le masque avant de l'appliquer, de sorte que le « halo » résultant s'atténue avec la distance. |

  magick difference.png -bordercolor black -border 5 \
          -threshold 10%  -blur 0x3  halo_mask.png
  magick cyclops.png -bordercolor white -border 5   halo_mask.png \
          -alpha Off -compose CopyOpacity -composite  cyclops_halo.png

[IM Output] [IM Output]
L'effet de « halo » résultant peut être encore modifié en utilisant davantage d'ajustements d'histogramme sur l'image de masque, ce qui vous donne un contrôle très précis des résultats pour des images spécifiques. Avec les bons paramètres, vous pouvez ajuster le halo environnant jusqu'à le rendre pratiquement inexistant, même s'il est difficile de l'éliminer complètement de cette façon. Voir la section suivante pour une technique améliorée. Un petit peu de floutage (disons "-blur 0x0.707", ou la racine carrée de 2) est en fait recommandé lors de la génération d'un masquage par seuil, simplement pour lisser les bords du masque. Bien sûr, le résultat ne sera pas booléen, alors n'essayez pas de l'enregistrer dans un fichier image au format GIF. C'est aussi un exemple d'adoucissement par flou. Mais attention, ce n'est pas tout à fait la même chose que le véritable adoucissement des formes par distance. Cependant, lorsqu'on manipule des « masques bitmap » ou des « masques par seuil » tels que ceux créés ci-dessus, un léger adoucissement par flou, suivi d'un adoucissement par distance plus marqué, donnera probablement le meilleur résultat d'ensemble.

Récupérer les bords semi-transparents

La technique de masquage par différence utilisée plus haut peut être combinée à la technique précédente de masquage par remplissage (FloodFill) pour résoudre la plupart des problèmes rencontrés avec les techniques de masquage plus simples. Nous examinons ici une technique de masquage multicouche, censée produire une suppression quasi idéale de l'arrière-plan de l'image, tout en préservant les pixels d'ombrage anticrénelés le long du bord. Toutefois, cela se limite aux images sur un arrière-plan connu, et présentant un bon « bord » contrasté par rapport aux pixels de premier plan. Pour cet exemple, j'ai décidé d'utiliser quelque chose de très difficile à séparer, mais qui présentait BEAUCOUP plus de pixels ombrés autour des bords que ce que l'on aurait typiquement à des fins d'anticrénelage. Une forme avec un effet d'ombre. |

  magick -size 70x60 xc:none -font Candice -pointsize 50 -stroke black \
          -fill black          -annotate +12+42 'A' -channel RGBA  -blur 0x3 \
          -fill tile_disks.jpg -annotate +10+40 'A' \
          tile_water.jpg  -compose DstOver -composite letter.png

[IM Output]
D'abord, nous devrons générer une image de différence et, par chance, nous savons quelle est l'image d'arrière-plan. Bien sûr, cela fonctionnera tout aussi bien pour un arrière-plan de couleur unie, tant qu'il y a un bon contraste permettant de générer deux masques. Fondamentalement, en utilisant une image de différence, nous pouvons supprimer toute influence de l'image d'arrière-plan et, à partir de là, générer les masques que nous utiliserons. |

  magick letter.png  tile_water.jpg \
          -compose Difference -composite \
          -modulate 100,0 -channel B -evaluate set 0 \
          -alpha Off  diff_mask.png

[IM Output]
Notez que, cette fois, j'ai légèrement traité l'image de différence en niveaux de gris, en la limitant aux canaux rouge et vert tout en vidant le canal bleu, produisant une image de différence noir-jaune. C'est astucieux, car cela libère le canal « bleu » pour permettre la génération d'un masque de remplissage propre, distinct de l'image de différence elle-même. Techniquement, je pourrais aussi vider le canal vert pour l'utiliser pour le second masque. Mais n'anticipons pas. Il nous faut maintenant deux masques : un masque extérieur, définissant toutes les zones qui seront assurément transparentes ; et un masque qui définit l'intérieur de l'objet dans l'image, sans générer de « trous » indésirables. Alors remplissons l'image de l'extérieur vers l'intérieur, en utilisant plusieurs facteurs de flou différents, afin de pouvoir choisir les deux masques intérieur et extérieur que nous utiliserons.

  for fuzz in 01 03 06   28 32 34; do \
    magick diff_mask.png -fill blue -fuzz $fuzz% \
            -bordercolor black -border 1x1 -floodfill +0+0 black \
            -shave 1x1 diff_mask_$fuzz.png; \
  done

[IM Output]
-fuzz 1% | [IM Output]
-fuzz 3% | [IM Output]
-fuzz 6% | | [IM Output]
-fuzz 28% | [IM Output]
-fuzz 32% | [IM Output]
-fuzz 34%
---|---|---|---|---|---|---

Les zones bleues dans les images ci-dessus sont la zone en cours de masquage. Rappelez-vous que nous avons vidé le canal bleu à cette fin. Le premier masque doit masquer les zones de l'image que nous voulons assurément rendre totalement transparentes. Autrement dit, les parties dont nous attendons assurément qu'elles soient totalement transparentes sur l'image finale. La zone à l'intérieur du masque devrait encore contenir l'essentiel du halo d'ombre noir de l'image. Ici, nous avons beaucoup d'interaction entre l'image proprement dite et le reste de l'arrière-plan ; j'ai donc choisi un facteur de flou de '1%', qui contenait encore une grande zone autour de l'image. Dans un cas plus typique, sans ombre, cette zone peut être encore plus petite, jusqu'à une valeur non exprimée en pourcentage telle que 5 ou 10. Le second masque doit avoir un « flou » assez élevé pour absorber tous les pixels semi-transparents présents. Autrement dit, jusqu'au bord de l'image, et de préférence jusque dans celui-ci, sans le supprimer complètement, ni « fuir » dans l'image proprement dite (voir la dernière image ci-dessus). Le négatif de ce masque représentera en réalité tous les pixels qui seront totalement opaques (et représenteront donc l'intérieur) dans l'image finale. Cette sélection peut être difficile et exiger beaucoup d'essais et d'erreurs pour trouver la meilleure valeur à utiliser. Pour cette image, un flou très élevé de '32%' a pu être choisi sans problème majeur. Fondamentalement, vous voulez essayer de le monter assez haut pour que l'image finale ne contienne aucun pixel de l'« arrière-plan » d'origine, mais sans que le masque grignote l'intérieur de l'image (ni n'y fuie). Il peut même exiger une petite retouche manuelle pour obtenir un masque parfait lorsque vous avez un manque dans la couleur du « bord » environnant. Nous pouvons maintenant utiliser ce masque pour extraire le « cœur » ou l'intérieur de notre image. C'est-à-dire les parties dont nous sommes sûrs qu'elles ne contiennent aucune semi-transparence vers le motif d'arrière-plan que nous supprimons. |

  magick diff_mask_32.png -channel blue -separate +channel -negate \
          letter.png +swap -alpha Off -compose CopyOpacity -composite \
          letter_inside.png

[IM Output]
Notez comment j'ai extrait le masque bleu des images masquées par remplissage. De plus, en raison de la nature tout ou rien du remplissage, le masque présentera de forts effets d'escalier ou de crénelage autour des bords. C'est le problème que le second masque va nous permettre de corriger. Rappelez-vous que cette image ne concerne que les pixels dont nous savons qu'ils n'interagissent pas avec l'arrière-plan d'origine et qui seront laissés tels quels dans l'image finale. Elle n'inclut aucun des effets d'ombre, ni les pixels anticrénelés que je cherche spécifiquement à récupérer. Récupérer ces pixels, c'est là que réside le vrai travail. En inversant et en soustrayant (multipliant) les masques, nous pouvons générer un nouveau masque qui définit la zone où nous voulons extraire les pixels de bord ou d'ombrage semi-transparents... |

  magick diff_mask_01.png -negate diff_mask_32.png \
          -channel blue -separate +channel -compose multiply -composite \
          mask_aliasing_area.png

[IM Output]
Cette zone sert ensuite à extraire les pixels anticrénelés de l'image de différence, qui définit à quel point les pixels devraient être transparents. Nous normalisons ces pixels pour obtenir une transition douce de l'opaque à la transparence. |

  magick diff_mask.png -channel red -separate +channel \
          mask_aliasing_area.png -alpha Off -compose CopyOpacity -composite \
          -background gray30 -compose Over -flatten -normalize \
          mask_antialiased_pixels.png

[IM Output]
Plus la couleur est claire dans le masque ci-dessus, plus le pixel sera opaque. De même, plus la couleur est sombre, plus il sera transparent. Notez que j'ai utilisé ici un arrière-plan gris pour garantir que les couleurs transparentes présentes dans l'image n'interfèrent pas avec la normalisation de l'image. Sans cela, cette normalisation échouerait. La couleur grise unie elle-même n'a pas d'importance, car ces zones sont en dehors du masque et seront donc ignorées plus tard. Maintenant que nous avons le bon niveau de transparence, nous devons savoir quelle couleur utiliser pour ces pixels semi-transparents. Cette couleur sera généralement la même que la couleur de bord de l'image, ici simplement le noir. Toutefois, en raison de l'interaction de l'arrière-plan d'origine, j'ai décidé d'opter pour une couleur gris foncé pour l'ombre. | _Vous devrez déterminer d'une manière ou d'une autre quelle couleur devraient avoir les pixels semi-transparents, afin de définir la bonne couleur pour les pixels anticrénelés.

Cela pourrait être_

  1. Une couleur de bord fixe (par ex. : quasi-noir, comme dans cet exemple)
  2. Utiliser la couleur des pixels de bord totalement opaques les plus proches (à l'aide de la morphologie. VoirLa couleur éparse comme opérateur de remplissage
  3. Calculée : une fois que vous connaissez l'alpha et la couleur d'arrière-plan, vous pouvez soustraire la couleur d'arrière-plan pour corriger la couleur du pixel. VoirSuppression de l'arrière-plan à l'aide de deux arrière-plans ci-dessous.

En gros, cela dépend de votre image.
---|---
Tant qu'à faire, remasquons aussi l'image pour ne laisser que ces pixels de bord particuliers. |

  magick mask_antialiased_pixels.png mask_aliasing_area.png \
          -compose multiply -composite -negate \
          -background '#444' -channel A  -combine letter_edging.png

[IM Output]
Il ne reste plus qu'à superposer le « cœur » intérieur de l'image avec les pixels de bord semi-transparents. |

  magick letter_inside.png letter_edging.png \
          -background none  -flatten    letter_recovered.png

[IM Output]
Et hop, nous avons une image dont l'arrière-plan a été supprimé pour produire une image parfaitement anticrénelée, avec des bords et un ombrage semi-transparents correctement récupérés. Vous pouvez même la superposer sur un arrière-plan totalement différent. |

  magick letter_recovered.png tile_aqua.jpg \
          -background none -compose DstOver -flatten    letter_on_aqua.png

[IM Output]
L'image que j'ai utilisée pour cet exemple est très difficile, avec une grande région de « bord ». La plupart des images sont loin d'être aussi problématiques, mais cette méthode est probablement la meilleure et la plus universelle des techniques de suppression d'arrière-plan. Elle a maintenant été réunie dans un script shell nommé "**[bg_removal](../static/img/scripts/bg_removal)**", qui utilise une seule commande, sans fichiers temporaires, et propose plusieurs options supplémentaires sur les méthodes de masquage employées.

Suppression de l'arrière-plan à l'aide de deux arrière-plans

Le principal problème des techniques précédentes est que vous ne disposez pas vraiment d'assez d'informations pour récupérer complètement toutes les informations sur l'objet de premier plan. Vous devez en réalité récupérer deux informations : à quel point chaque pixel de l'objet de premier plan est transparent, et quelle est sa couleur d'origine. Or, vous ne pouvez pas récupérer parfaitement ces deux informations à partir d'une seule image. Même lorsque vous savez exactement à quoi ressemble l'image d'arrière-plan, vous ne pouvez pas simplement la soustraire de l'objet de premier plan, à moins que les deux ne soient de couleurs très différentes et connues. Le problème est que vous ne pouvez tout simplement pas être sûr que la couleur visible est réellement la couleur donnée (opaque), ou qu'il s'agit d'un mélange d'une autre couleur et de l'arrière-plan (semi-transparent). Vous ne pouvez pas séparer la couleur d'origine de la valeur alpha nécessaire, à moins de disposer d'une source d'informations supplémentaires. La seule situation où vous pouvez récupérer complètement tous les détails d'un objet de premier plan, c'est lorsque vous disposez de deux images contenant deux couleurs d'arrière-plan très différentes mais totalement connues. Dans cette situation, vous disposez bien d'assez d'informations pour récupérer à la fois la couleur et la transparence de l'objet de premier plan, pour une suppression d'arrière-plan parfaite. Le facteur important dans le choix des deux images, c'est que les couleurs d'arrière-plan soient aussi différentes que possible sur toute l'image. Autrement dit, que les couleurs ne soient pas seulement complémentaires, mais aussi négatives en intensité dans tous les canaux. Par exemple...

[IM Input] [IM Input]

Bien qu'une couleur d'arrière-plan différente soit utilisée, les deux images contiennent exactement le même objet. L'objet montré n'est pas simple, mais contient beaucoup de couleurs semi-transparentes. Vous pouvez le constater à la façon dont l'arrière-plan bleu foncé est visible dans les flammes de l'image, alors que cette transparence est presque invisible sur l'arrière-plan jaune, plus clair. En utilisant deux couleurs, les pixels semi-transparents de l'objet superposé se mélangeront à deux couleurs très différentes et, de ce fait, prendront des couleurs légèrement différentes dans les deux images. En mesurant à quel point chaque pixel diffère, vous pouvez déterminer exactement quels pixels sont semi-transparents, et dans quelle mesure. Il y a essentiellement assez d'informations pour vous permettre de récupérer parfaitement la transparence de l'objet superposé. Récupérer la transparence, ou « masque », est bien sûr la première étape, et c'est en réalité une étape très simple. Générez une image de différence, puis fusionnez et maximisez les différences trouvées dans chaque canal. |

  magick match_navy.gif match_gold.gif \
          -compose difference -composite -separate \
          -evaluate-sequence max -auto-level -negate \
          match_alpha.png

[IM Output]
L'image résultante est une carte parfaite du degré de transparence de chaque pixel. C'est essentiellement le « masque alpha » de l'objet d'origine dans les images sources. Toutefois, cela ne fonctionnera que si l'image superposée contient à la fois des zones de transparence totale et d'opacité totale. Si ce n'est pas le cas, au lieu de l'étape de normalisation ("-evaluate-sequence max -auto-level") ci-dessus, vous devrez diviser chaque canal par la différence des deux couleurs d'arrière-plan. Autrement dit, diviser par une valeur comprise entre 0.0 et 1.0, plus la différence est grande, mieux c'est. Si les deux couleurs d'arrière-plan sont le noir pur et le blanc pur, alors aucune normalisation n'est nécessaire, juste la différence des deux images. La différence est ensuite inversée (Negate) afin qu'une différence maximale produise un alpha nul ou une transparence totale, et qu'une absence de différence produise un alpha maximal ou une opacité totale. La tâche suivante est plus ardue car, comme la couleur de chaque pixel semi-transparent est modifiée par l'arrière-plan, vous ne pouvez pas simplement utiliser le masque alpha pour extraire l'objet de l'une des images sources. Par exemple... |

  magick match_navy.gif match_alpha.png \
          -alpha Off -compose Copy_Opacity -composite \
          match_bad_colors.png

[IM Output]
Fondamentalement, ce que nous avons obtenu est un affreux halo de la couleur d'arrière-plan dans la « flamme » semi-transparente de l'image. Un résultat pas beau du tout. C'est ce qu'on appelle le « débordement de couleur » (color spill, un terme du masquage par incrustation couleur (Chroma Key), aussi appelé technique du fond bleu ou vert), et cela peut être un problème majeur. Ce que nous devons faire, c'est supprimer la couleur d'arrière-plan des pixels semi-transparents. Toutefois, comme nous avons déjà récupéré le canal alpha de l'image d'origine, nous savons exactement quelle quantité de couleur doit être retirée de chaque pixel, afin de restaurer la couleur d'origine superposée. Pour cela, nous n'avons pas seulement besoin de l'une des images sources et du canal alpha que nous venons d'extraire, mais aussi de connaître la couleur exacte de l'arrière-plan dans cette image source. Un problème relativement facile lorsqu'on utilise un arrière-plan de couleur unie, comme dans ces exemples. Par exemple, ici je restaure les couleurs d'origine... |

  magick match_navy.gif match_alpha.png -alpha Off \
          -fx "v==0 ? 0 : u/v - u.p{0,0}/v + u.p{0,0}" \
          match_alpha.png -compose Copy_Opacity -composite \
          match_recovered.png

[IM Output]
J'ai utilisé le pixel du coin supérieur-gauche (formule FX 'u.p{0,0}') dans l'image source comme couleur d'arrière-plan à retirer des pixels semi-transparents. Ajustez ceci ou substituez-y directement la couleur à retirer si nécessaire. La clé de la restauration des couleurs est la complexe opération de soustraction fusionnée FX ci-dessus. Elle rehausse la couleur d'origine ('u') de l'image source en fonction du masque alpha ('v'), puis soustrait la couleur d'arrière-plan (u.p{0,0}, ou le pixel du coin supérieur-gauche) du résultat final. La formule n'est pas évidente, et de grands remerciements vont à HugoRune, dans la discussion du forum IM Undo a Composite -dissolve, pour avoir déterminé les mathématiques nécessaires. La discussion explique aussi en détail comment fonctionnent toutes les étapes, comment elles ont été dérivées, et même comment extraire la superposition à partir de deux motifs d'arrière-plan quelconques mais connus et différents. Voici toute la séquence en une seule commande. |

  magick match_gold.gif match_navy.gif -alpha off \
          \( -clone 0,1 -compose difference -composite \
             -separate -evaluate-sequence max -auto-level -negate \) \
          \( -clone 0,2 -fx "v==0?0:u/v-u.p{0,0}/v+u.p{0,0}" \) \
          -delete 0,1 +swap -compose Copy_Opacity -composite \
          match_recovered_2.png

[IM Output]
| _Dans IM v6.6.8-3, si FX référence un pixel transparent à l'aide de 'p{}', il obtient des valeurs nulles au lieu des véritables valeurs de couleur totalement transparente ! C'est un bogue, qui a été signalé et corrigé dans IM v6.6.8-5. On ne sait pas quand le bogue a été introduit.

Ce n'était un problème que si vous décidiez de fusionner d'abord l'image alpha dans l'image source, puis de tenter de corriger les couleurs semi-transparentes ou de « débordement », à l'aide de la couleur d'arrière-plan connue._
---|---
Cette fois, l'image d'arrière-plan « gold » a été utilisée pour l'extraction des couleurs, et a été sélectionnée par le '0' dans la seconde opération "[-clone](https://imagemagick.org/command-line-options/#clone)", mais l'une ou l'autre des images sources aurait pu être utilisée. Juste un avertissement. Ce qui précède suppose que le pixel supérieur-gauche est la couleur d'arrière-plan non altérée. Si ce n'est pas le cas, vous devrez peut-être modifier la commande pour indiquer une couleur de pixel précise, ou utiliser une troisième image contenant la bonne information de couleur d'arrière-plan. Cette dernière méthode est essentielle si la couleur d'arrière-plan n'est pas constante sur toute l'image, même si cette complication peut elle aussi être résolue. Voici la séquence plus simple pour des images superposées sur un arrière-plan noir pur et un arrière-plan blanc pur. Dans ce cas, les couleurs sont toujours récupérées à partir de l'image à arrière-plan noir, car il ne s'agit que d'une simple division ; une composition Divide plus rapide peut donc être utilisée à la place du FX DIY Operator, atrocement lent.

  magick match_black.gif match_white.gif -alpha off \
          \( -clone 0,1 -compose difference -composite -negate \) \
          \( -clone 0,2 +swap -compose divide -composite \) \
          -delete 0,1 +swap -compose Copy_Opacity -composite \
          match_recovered_3.png

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

Photos de studio pour la récupération d'arrière-plan Les arrière-plans idéaux sont un noir mat (non réfléchissant) et un blanc pur (non réfléchissant) simple. L'arrière-plan devrait aussi être d'une teinte aussi lisse et uniforme que possible. Pour réaliser des photos spécifiquement destinées à la suppression d'arrière-plan, utiliser deux couleurs complémentaires peut mieux fonctionner. Par exemple, prendre des photos avec un fond vert et un fond magenta. En gros, vous devrez d'une manière ou d'une autre remplacer l'écran de couleur d'arrière-plan avant de prendre la seconde photo. Notez que l'ordre des deux photos n'a pas d'importance pour la suppression d'arrière-plan, mais elles doivent être aussi propres et uniformes que possible, et l'objet principal comme l'appareil photo doivent rester parfaitement immobiles et fixes. Une meilleure méthode peut consister à placer simplement un écran blanc bien éloigné derrière l'objet et à éclairer uniformément cet écran à l'aide de deux lampes de couleurs différentes, de façon à ne produire aucune ombre de l'objet. Avec cette technique, vous pouvez passer à l'autre couleur d'arrière-plan sans avoir besoin de changement physique dans le studio pour prendre deux photos avec deux arrière-plans différents. Ces techniques à deux couleurs d'arrière-plan devraient bien fonctionner pour les objets transparents, mais les reflets, ainsi que les déformations d'arrière-plan ou les effets de « lentille » causés par l'objet photographié ne seront pas enregistrés par la technique, seulement sa transparence. En revanche, les reflets d'une source lumineuse constante sur l'objet seront préservés ! Si vous essayez ceci, faites-le-nous savoir et donnez un exemple de vos photos sources et de vos résultats pour inclusion ici. Vous serez nommé, avec un lien vers votre site que les gens pourront consulter.
Récupération d'arrière-plan vidéo Si vous disposez d'une série d'images suffisamment grande avec de nombreux arrière-plans différents mais complexes (comme une vidéo), vous pouvez essayer de prendre une valeur minimale et maximale de toutes les images pour générer une image d'arrière-plan proche du noir et du blanc purs à utiliser. Plus il y a d'images, mieux cela fonctionne. Avec ces deux images, tout logo constant et sa semi-transparence peuvent être extraits, et la même technique peut ensuite servir à le supprimer de toutes les trames. Toutefois, cela ne fonctionnera que pour une superposition semi-transparente constante, et peut ne pas fonctionner pour des logos qui utilisent des distorsions de couleur ou de teinte, ou même pour un logo de couleur unie. Mais cela vous permettra au moins de déterminer la forme exacte du logo. Pour les logos totalement opaques ou plus difficiles, le remplissage de trous (voir la suite) peut ensuite être utilisé pour combler les détails manquants à partir des couleurs environnantes. Voir la discussion du forum IM pour plus de détails.


Remplissage de trous

Si le masquage, l'ajout de transparence et la suppression d'arrière-plan offrent une façon de traiter les éléments indésirables, souvent un « trou » n'est pas ce que vous voulez réellement comme résultat. Bien sûr, vous pouvez simplement superposer des images trouées sur d'autres images pour les combler, mais cela peut ne pas donner un résultat sans couture. Pour effacer des éléments d'une image, vous ne voulez pas seulement les découper, mais les remplacer par les couleurs, les nuances et les textures des parties qui entourent le trou. Voici diverses techniques pour déterminer avec quoi combler ce trou.

Créer un trou à remplir

Supposons que nous ayons une image comportant un texte disgracieux... |

  magick zelda_tn.gif -gravity Southwest -annotate +8+20 Zelda zelda_text.jpg

Eh bien, ce que nous voulons vraiment faire, c'est supprimer ce texte, et le plus simple est de le masquer, afin de laisser un « trou » à l'emplacement du texte. Cela simplifie le problème, car peu importe désormais ce qui a été supprimé. Nous avons juste un trou à combler. [IM Output]
Pour ce cas, je vais toutefois créer un masque à l'aide d'une ligne tracée qui recouvre le « texte disgracieux », comme si un utilisateur avait rapidement utilisé un éditeur d'image. |

  magick -size 120x90 xc:black  -stroke white  -strokewidth 7 \
          -draw 'stroke-linecap round line 9,62 36,63' \
          -threshold 10%  zelda_text_mask.gif

[IM Output]
La création du « trou » elle-même peut être une affaire délicate, et une solution automatisée peut dépendre exactement de ce que vous cherchez à supprimer, voire impliquer la comparaison de centaines d'images comportant le même « texte » ou « logo » pour le localiser précisément. Notez que plus le trou est petit, meilleur est le résultat final. Plus on peut préserver d'informations de l'image d'origine, meilleur sera le résultat. Un trou grossier de forme irrégulière vaut aussi mieux qu'un trou au contour très lisse. Prendre le temps de faire le plus petit trou qui supprime tous les effets indésirables peut donc faire une grande différence. Utilisons maintenant le masque pour découper un trou dans l'image, ce qui vérifiera aussi qu'il recouvre toutes les parties indésirables. |

  magick zelda_text.jpg \( zelda_text_mask.gif -negate \) \
          -compose CopyOpacity -composite   zelda_text_hole.png

Nous avons donc ici une image avec un « trou » qui doit être comblé. [IM Output]

Remplissage flou

Nous avons donc un trou, qui doit être comblé avec une couleur. Quelque chose qui ne donnera pas l'impression que nous avons réellement retiré quelque chose de l'image. L'une des méthodes les plus simples consiste à simplement flouter l'image, en laissant les couleurs autour du trou « s'étaler » dans celui-ci, puis à supprimer la transparence. |

  magick zelda_text_hole.png -blur 0x1 -alpha off zelda_text_fill.png

La quantité de flou à utiliser dépend de la taille du trou utilisé. [IM Output]
Voyons maintenant comment placer dessous (underlay) cette image floutée pour « combler le trou » que nous avons créé précédemment...

  magick zelda_text_hole.png zelda_text_fill.png \
          -compose Dst_Over  -composite   zelda_text_removed.png

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

Et le texte a été supprimé. Ce n'est pas parfait, car le floutage des couleurs dans cette zone rend évident que quelque chose a été retiré. Par exemple, si vous regardez de près le cadre de la fenêtre près de la tête de Zelda, vous pouvez voir les effets du flou. De plus, la zone paraît plus « lisse » que le reste de l'image, ce qui est particulièrement visible sur les photos. Mais c'est une technique très répandue et rapide, et vous la verrez souvent dans des vidéos où l'on a tenté de retirer les logos que certains diffuseurs TV avaient ajoutés comme méthode de protection des droits d'auteur. Une alternative à la dissimulation de la suppression consiste à rendre cette suppression bien visible. Par exemple si vous voulez protéger l'anonymat de quelqu'un.

En construction

Liens vers d'autres méthodes. Méthode de remplissage de trou par flou et redimensionnement... Couleur éparse, méthode de Shepard (rapide). Voir aussi snibgo, Filling holes Flouter uniquement les pixels de bord...La couleur éparse comme opérateur de remplissage. Voir aussi snibgo, Filling holes in priority order J'aimerais utiliser un opérateur de morphologie qui définit la couleur dans les canaux de couleur tout en calculant la distance dans un canal d'arrière-plan caché. Cela devrait générer un remplissage très rapide, sans fuite, de type Shepard, appelé 'Color Diffusion'. Voir l'article Diffusion Curves qui fait un usage intensif de cette technique. Une longue et ancienne discussion sur le remplissage de trous (suppression de texte) est disponible sur les forums des utilisateurs d'IM, Text Removal Discussion. Une discussion plus récente est Fill area with nearest colour from boundary, qui porte davantage sur le remplissage sans floutage. D'autres méthodes non IM de « remplissage de trous » pour effacer des parties d'images sont montrées sur Stack Overflow, Remove text from jpeg. Par exemple en utilisant Python Skimage. Ou en utilisant Python OpenCV inpainting