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

Exemples ImageMagick -- Filtres de rééchantillonnage

Ici, nous abordons les aspects de plus bas niveau du redimensionnement et de la distorsion des images, en examinant les filtres de rééchantillonnage utilisés pour déterminer la couleur finale de chaque pixel individuel dans l'image résultante. Le sujet est vaste, étudié depuis longtemps, et souvent chargé d'opinions et de points de vue personnels plutôt que de faits qualitatifs solides, car il est impossible de déterminer ce qui constitue une image redimensionnée parfaite. C'est un fait démontré, qui fait de ce domaine un très vaste champ d'étude qui ne sera jamais achevé. Il est recommandé de lire et de comprendre les Opérateurs de redimensionnement et de mise à l'échelle.


Artefacts de rééchantillonnage - Quelle est la qualité du redimensionnement d'IM

Le redimensionnement d'image doit combattre un problème très difficile. Comment réduire un tableau de valeurs en un tableau plus petit, ou plus grand, de manière à ce que le résultat soit agréable à l'œil ? Beaucoup de choses peuvent mal tourner en tentant cela, mais elles se répartissent en quatre catégories de base..

Effet de blocs

Essentiellement, si vous agrandissez une image simplement en répliquant les pixels, vous créez de plus grands blocs rectangulaires de pixels. En fait, agrandir des images avec « [-scale](https://imagemagick.org/command-line-options/#scale) » ou « [-sample](https://imagemagick.org/command-line-options/#sample) » fait exactement cela, produisant une image agrandie et pixelisée. Par exemple, ici je mets à l'échelle une petite image, ce qui génère de grands blocs de couleur au lieu d'une belle image lisse. À côté figure une version « redimensionnée », et enfin une autre utilisant un filtre Gaussian pour la flouter plus que la normale et remplacer les pixels isolés par des points ronds, afin d'atténuer l'aspect en blocs.

  magick storm.gif  -scale  300%  storm_scaled.gif
  magick storm.gif  -resize 300%  storm_resized.gif
  magick storm.gif -filter Gaussian -resize 300%  storm_resized_gas.gif

[IM Output]
Original | | [IM Output]
Mis à l'échelle | [IM Output]
Redimensionné | [IM Output]
Redimensionné Gaussian
---|---|---|---|---

La cause principale du « blocking » est soit une image source mal anticrénelée, soit un lissage insuffisant (mélange de couleurs ou flou) entre les pixels pour améliorer l'aspect général de l'image. On l'observe aussi typiquement lorsqu'une image de très basse résolution est redimensionnée à une échelle bien plus grande ou destinée à un périphérique haute résolution. L'endroit le plus courant où on le rencontre est l'utilisation d'une image bitmap dans des bulletins et magazines réalisés par des utilisateurs, ensuite imprimés sur des imprimantes laser à très haute résolution. Le bulletin est superbe à l'écran, mais ressort « en blocs » sur la page imprimée. Cette situation est très difficile à corriger, et il vaut généralement mieux l'éviter en utilisant un clipart de bien plus haute résolution, ou une image vectorielle redimensionnable (comme les formats SVG et WMF). Bien sûr, dans certaines situations, les artefacts de blocs sont réellement souhaitables et sont accentués dans le résultat. Par exemple, lorsque vous essayez de recréer d'anciens jeux vidéo basse résolution sur des écrans modernes haute résolution, conserver le vieil « aspect en blocs » de l'image renforce le côté « rétro ». Ou peut-être lorsque vous essayez de faire pivoter des images sans générer de couleurs nouvelles ou fusionnées. Les techniques qui préservent réellement l'« aspect en blocs », mais remplissent les carrés par des lignes diagonales, sont connues sous le nom d'algorithmes de mise à l'échelle de pixel art, et de nombreux schémas de ce type ont été développés. L'un d'eux a été intégré à ImageMagick, avec l'opérateur Magnify.

Rebond

Le rebond est un effet que l'on observe souvent dans les images JPEG de très basse qualité, à proximité des bords nets. Il est typiquement causé par une surcompensation d'un bord par l'algorithme de redimensionnement ou de compression d'image, ou par l'emploi d'un filtre de haute qualité avec une mauvaise taille de support. Ici par exemple, j'utilise une option spéciale pour sélectionner un filtre Sinc brut, sur un changement de couleur très net. J'ai aussi répété l'opération avec l'opérateur de redimensionnement par défaut d'IM, en utilisant sa sélection de filtre par défaut pour les agrandissements d'image.

  magick -size 8x16 xc:'#444' xc:'#AAA' +append  gray_edge.gif
  magick gray_edge.gif -filter Sinc \
                         -resize 100x100\!  gray_edge_ringing.gif
  magick gray_edge.gif  -resize 100x100\!  gray_edge_resize.gif

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

Ce qui précède montre assez clairement la surcompensation produite par l'usage d'un filtre de redimensionnement brut, sans aucune des optimisations qu'IM fournit. La deuxième image, produite par le filtre d'agrandissement par défaut d'IM, montre également un très léger effet de rebond, mais il est à peine perceptible, et même souhaitable en ce qu'il accentue perceptuellement la bordure. Voici un autre exemple de l'effet de rebond, cette fois en agrandissant un unique pixel sur un fond gris. |

  magick -size 1x1 xc: -bordercolor '#444' -border 4x4 \
          -define filter:lobes=5  -filter Sinc \
          -resize 100x100\!   dot_sinc.gif

[IM Output]
Cette image montre aussi clairement les effets secondaires générés par l'usage d'un filtre unidimensionnel. C'est-à-dire que l'effet de rebond est le plus fort dans les directions horizontale et verticale (orthogonales), avec un rebond secondaire à 45 degrés. Et cette fois avec un filtre cylindrique (via l'opération de redimensionnement par distorsion), montrant en quoi il diffère du filtre plus habituel, aligné orthogonalement en 2 passes (tenseur), qu'utilise l'opérateur de redimensionnement. |

  magick -size 1x1 xc: -bordercolor '#444' -border 4x4 \
          -define filter:lobes=5  -filter Jinc \
          -distort resize 100x100\! +repage dot_jinc.gif

[IM Output]
Ces effets ne sont normalement pas visibles, et ne le sont ici qu'à cause de l'emploi d'un filtre « Sinc » ou « Jinc » brut (voir Filtres fenêtrés ci-dessous) pour certains agrandissements extrêmes. En général, un filtre « brut » comme celui-ci n'est pas utilisé.

Crénelage et effets de moiré

Les effets de crénelage se manifestent généralement par la production d'effets en « escalier » le long des bords des images. Cela est souvent causé soit par un échantillonnage brut de l'image, comme avec « [-sample](https://imagemagick.org/command-line-options/#sample) », soit par un renforcement excessif de la netteté de l'image lors du redimensionnement. Un effet d'escalier est le plus visible lors d'une forte réduction des images, bien qu'il soit rarement observé dans IM. Cependant, le crénelage a aussi d'autres effets, en particulier l'apparition de motifs de moiré à grande échelle dans les images contenant un motif au niveau des pixels. Ces motifs de bas niveau produisent souvent des motifs de moiré à grande échelle, notamment : des motifs de lignes parallèles, des tissages d'étoffe (la soie présente cet effet dans la réalité !), ainsi que des motifs de briques et de carrelage sur les photos de bâtiments en brique, de clôtures et de pavés. [IM Output] Pour quelques exemples d'images redimensionnées produisant de forts effets de moiré, voir la page Wikipedia, Motif de moiré. La façon classique de vérifier si un redimensionnement produira des problèmes de crénelage consiste à réduire une image d'anneaux (voir à droite). Cette image montre souvent des effets de moiré dès qu'une forme quelconque de redimensionnement est appliquée, à n'importe quelle échelle. Les navigateurs web en particulier montrent de tels effets de moiré lorsqu'ils affichent une telle image, du fait de l'emploi d'une technique de redimensionnement ultra rapide (mais souvent médiocre).
Ici, je montre l'image « rings » redimensionnée avec l'opérateur fortement crénelant « [-sample](https://imagemagick.org/command-line-options/#sample) », l'opérateur de moyennage par blocs « [-scale](https://imagemagick.org/command-line-options/#scale) » et le « [-resize](https://imagemagick.org/command-line-options/#resize) » par défaut.

  magick rings_sm_orig.gif  -sample 100x100  rings_sample.png
  magick rings_sm_orig.gif  -scale  100x100  rings_scale.png
  magick rings_sm_orig.gif  -resize 100x100  rings_resize.png

[IM Output]
sample | [IM Output]
scale | [IM Output]
resize
---|---|---

Comme vous pouvez le voir, toutes les méthodes de redimensionnement ont produit des effets de moiré, bien que l'opérateur de redimensionnement par défaut d'IM produise la moindre quantité de ces motifs secondaires indésirables dans l'image finale. Pour montrer les effets d'un redimensionnement seulement léger, j'ai rogné le coin de la grande image d'anneaux, dont le résultat est montré en premier, puis j'ai réduit sa taille de seulement 5 %.

  magick rings_lg_orig.png -crop 105x105+0+0  rings_crop.png
  magick rings_crop.png    -sample 100x100    rings_crop_sample.png
  magick rings_crop.png    -scale  100x100    rings_crop_scale.png
  magick rings_crop.png    -resize 100x100    rings_crop_resize.png

[IM Output]
original rogné | | [IM Output]
sample | [IM Output]
scale | [IM Output]
resize
---|---|---|---|---

Comme vous pouvez le voir, même un léger redimensionnement révèle le crénelage qu'un opérateur de redimensionnement peut présenter. En fait, si vous regardez de près, vous pourrez même apercevoir un très léger effet de moiré dans le rognage original non redimensionné de l'image de départ, qui provient des limites liées à l'utilisation d'une simple image matricielle à une densité adaptée à l'affichage sur un écran d'ordinateur. C'est dire à quel point cette image de test est sensible pour révéler les effets de crénelage causés par la réduction des images.

Flou

La plupart des gens connaissent le flou qui peut être généré par l'usage de « [-resize](https://imagemagick.org/command-line-options/#resize) ». C'est d'ailleurs probablement la plainte numéro un à propos de toute image redimensionnée, et à juste titre. En général, un redimensionnement même très léger a tendance à produire une image floue, et la redimensionner de nouveau ne fera qu'empirer les choses. Le problème est que, lorsque vous redimensionnez une image, vous modifiez l'image stockée sous forme de « grille » ou de tableau de pixels (appelé « matrice ») pour l'adapter à une « grille » de pixels complètement différente. Les deux « grilles » ne coïncideront pas, sauf dans des cas très particuliers, et par conséquent les données de l'image doivent être modifiées pour s'ajuster à ce nouveau motif de points. Fondamentalement, il est impossible de redimensionner directement une image et de s'attendre à ce qu'elle ressorte parfaitement, même si un résultat raisonnable peut être obtenu. Le résultat est habituellement un léger flou des données de pixels. Meilleur est l'algorithme de redimensionnement, moins il y a de flou sur les bords nets. Cependant, certains filtres de redimensionnement, en particulier ceux conçus spécifiquement pour agrandir les images, ajoutent souvent beaucoup plus de flou que nécessaire. C'est pour combattre les artefacts de « Blocs » démontrés plus haut. Pour la réduction d'image, un bord flouté est souvent utilisé pour éviter les artefacts de « Rebond » sur les bords nets et réduire les possibles effets de crénelage. C'est toutefois un compromis de pauvre, un compromis qu'IM s'efforce d'éviter. Malgré tout, un réglage expert spécial Flou de filtre peut être utilisé pour ajuster le flou qu'un filtre applique. Attention cependant : bien qu'une valeur inférieure à 1.0 soit censée réduire le flou, elle peut aussi l'aggraver, selon le filtre exact et les rapports de redimensionnement utilisés. Aucune garantie ne peut être donnée. Avant IM v6.3.6-3, le réglageFlou de filtre s'appelait "[-support](https://imagemagick.org/command-line-options/#support)", ce qui était très trompeur quant à son effet réel. Cette option a été dépréciée et n'est plus disponible.
La meilleure méthode pour corriger les effets de flou causés par le redimensionnement est de re-filtrer l'image à l'aide d'un opérateur d'accentuation. Voir Accentuer les images redimensionnées pour plus de détails.

Le redimensionnement d'IM face à d'autres programmes

Une comparaison pratique de l'opérateur de redimensionnement par défaut d'IM avec un certain nombre d'autres programmes, sur le redimensionnement d'une image réelle, a été fournie par Bart van der Wolf à l'adresse...

Exemple de sous-échantillonnage

Plus précisément, en résumé pour le redimensionnement d'IM...

Bien que la quantité d'accentuation soit affaire de goût, l'absence d'artefacts de crénelage produit l'image la plus propre et la plus naturelle de toutes.

Il poursuit aussi en examinant un test « rings », pour comparer directement diverses méthodes de redimensionnement de Photoshop à ImageMagick...

Méthodes de sous-échantillonnage

Ces articles montrent à quel point il est important, pour le traitement d'image, d'effectuer le redimensionnement correctement (et d'utiliser les bonnes méthodes de filtrage). Nous examinerons cela de plus près dans la section suivante.


Filtres de rééchantillonnage

Le réglage « [-filter](https://imagemagick.org/command-line-options/#filter) » est le contrôle clé de la façon dont le « [Redimensionnement d'image](resize.html#resize) » ainsi que l'« [Opérateur de distorsion générale](distorts.html#distort) » opèrent pour produire un résultat propre avec le minimum d'artefacts de rééchantillonnage. Ce sujet a fait l'objet d'études intenses à la fin des années 1980, à l'issue desquelles Paul Heckbert, un chercheur de premier plan dans ce domaine, a produit et diffusé publiquement son programme de redimensionnement d'image « **[zoom](http://www.xmission.com/~legalize/zoom.html)** ». Ce programme est devenu le père de la plupart des programmes de redimensionnement d'image utilisés aujourd'hui, même si beaucoup de programmes ultérieurs l'implémentent mal, car il est facile de se tromper. Par exemple, jetez un œil aux résultats des tests sur la façon dont les navigateurs web redimensionnent les images. À bien des égards, ces filtres sont étroitement liés à la convolution des images, et même au noyau de flou. Ils souffrent d'ailleurs de problèmes similaires. Cependant, les filtres sont conçus pour améliorer l'aspect du résultat final lors du redimensionnement, ou d'une autre distorsion d'une image. Les noms des filtres constituent un véritable « who's who » des experts en traitement d'image et des mathématiciens du siècle dernier (ou davantage). Ce ne sont généralement pas des descriptions du filtre, mais simplement l'étiquette de la personne qui a soit publié le filtre (ou la famille de filtres) pour la première fois, soit mené le plus de recherches sur ce filtre. Cela rend toutefois bien plus difficile de savoir si un filtre « Lagrange » (nommé d'après Joseph-Louis Lagrange) est meilleur que, disons, un filtre « Catrom » (nommé d'après Edwin Catmull et Raphael Rom). Ici, je vais expliquer les principaux aspects des filtres. Il n'est pas essentiel que vous appreniez ces choses, mais j'ai décidé de documenter un résumé de ce que j'ai appris, après avoir achevé mes recherches dans ce domaine, dans le cadre d'une refonte et d'une extension majeures du système de filtres de redimensionnement d'IM (IM 6.3.7-1). Un remerciement spécial va à Fred Weinhaus pour son aide dans la recherche pendant le redéveloppement des filtres de redimensionnement. Il était particulièrement désireux de voir ajouter la famille de filtres « [Lagrange](#lagrange) », qui n'existait pas dans le redimensionnement d'IM avant cette refonte. Merci aussi à Nicolas Robidoux, dont les mathématiques ont aidé à résoudre un défaut majeur de l'opérateur de distorsion générale, puis à développer les filtres cylindriques, qui produisent de meilleurs résultats que ce que l'on obtient avec l'opérateur de redimensionnement.

Comment fonctionnent les filtres

Lorsque vous redimensionnez une image, vous essayez essentiellement de déterminer la valeur correcte de chaque pixel de la nouvelle image, à partir des pixels de l'image source d'origine. Cependant, ces nouveaux pixels ne correspondent pas exactement aux positions des anciens pixels, et il faut donc déterminer d'une manière ou d'une autre une valeur correcte pour ces pixels. Ce que l'on fait, c'est essayer d'utiliser une sorte de moyenne pondérée des valeurs des pixels sources d'origine pour déterminer une bonne valeur pour le nouveau pixel. Les pixels réels entourant l'emplacement du nouveau pixel forment un « voisinage » de valeurs contributrices. Plus ce voisinage est grand, plus le redimensionnement est lent. C'est une technique appelée convolution. La quantité dont chaque pixel voisin réel (appelé « échantillon ») contribue à produire le pixel final est déterminée par une fonction de pondération. C'est le « filtre » que vous pouvez sélectionner à l'aide du réglage « [-filter](https://imagemagick.org/command-line-options/#filter) ». Ce filtre a à son tour généralement une taille de voisinage idéale, connue sous le nom de « support » du filtre, aussi appelée sa « fenêtre ». Un « filtre » bidimensionnel prédéfini est aussi appelé « noyau de convolution ».

_FUTUR : quelques schémas pourraient être utiles ici_

La conception de ces fonctions de pondération, ou « filtres », est une affaire très complexe qui met en jeu des mathématiques élaborées, l'analyse de fréquence, et même les transformées de Fourier. Un bon point de départ, si le sujet vous intéresse, est Wikipedia : théorème d'échantillonnage de Nyquist–Shannon. Cependant, vous n'avez pas vraiment besoin d'aller aussi loin pour comprendre les filtres existants et leurs effets sur les images.

Les filtres

Filtres interpolés

Le type de fonction de filtre de redimensionnement le plus simple est constitué des méthodes interpolatives. Celles-ci prennent un emplacement de pixel précis dans l'image source et essaient simplement de déterminer une valeur de couleur logique de l'image à cet emplacement, à partir des couleurs des pixels environnants. Comme il n'y a jamais qu'un nombre fixe et minimal de pixels impliqués, ce type de filtre est une méthode très rapide pour redimensionner ou autrement distordre des images. Cependant, c'est aussi le point faible du filtre, car il ne fusionnera pas un plus grand nombre de pixels pour former une image nettement plus petite que l'image d'origine. Cela peut à son tour entraîner de forts effets de crénelage et de moiré. L'interpolation n'est généralement utilisée que pour l'échantillonnage « ponctuel » des images, lorsque la mise à l'échelle de l'image n'est ni connue ni nécessaire. Par exemple, lors de la rotation d'une image ou de distorsions mineures, la mise à l'échelle ou la taille de l'image ne change pas, et une interpolation peut ainsi produire un résultat raisonnable, bien que pas très précis. Pour plus d'informations, voir le réglage d'interpolation d'IM. Elle ne convient toutefois pas au redimensionnement général des images.

Point

Utiliser un réglage « [-filter](https://imagemagick.org/command-line-options/#filter) » de « **Point** » signifie fondamentalement utiliser un filtre d'interpolation non mis à l'échelle. Pour l'opérateur de redimensionnement, il se contentera de sélectionner le pixel le plus proche de la position du nouveau pixel, et rien d'autre. Cela signifie que l'opérateur de redimensionnement utilisera simplement la couleur d'un pixel réel de l'image source. Aucune tentative ne sera faite pour fusionner les couleurs ou générer une meilleure couleur pour l'image résultante. Par conséquent, utiliser « -filter point -resize ... » produira le même résultat que « [-sample](https://imagemagick.org/command-line-options/#sample) » (voir l'opérateur d'échantillonnage), bien que ce dernier soit plus rapide car son code est conçu spécifiquement pour redimensionner les images par échantillonnage ponctuel, avec des contrôles pour régler le point d'échantillonnage exact. | _Pour l'opérateur de distorsion, sélectionner "[-filter](https://imagemagick.org/command-line-options/#filter) Point" forcera l'usage de l'échantillonnage ponctuel interpolé au lieu d'un filtre cylindrique. Voir Filtres d'image dans l'opérateur de distorsion pour plus de détails.

Si vous souhaitez le même échantillonnage ponctuel interpolé pour un redimensionnement d'image normal, vous pouvez utiliser à la place l'opérateur de redimensionnement interpolatif. Ou utiliser un redimensionnement par distorsion filtré en point pour le même résultat.

_
---|---
Ici, je commence avec un motif de hachures de 10x10 pixels et je le réduis en taille, avant de le mettre à l'échelle pour que vous puissiez voir le résultat.

  magick -size 10x10 pattern:gray50  checks_10.gif
  magick checks_10.gif -filter point -resize 9x9  checks_point-1.gif
  magick checks_10.gif -filter point -resize 8x8  checks_point-2.gif
  magick checks_10.gif -filter point -resize 7x7  checks_point-3.gif
  magick checks_10.gif -filter point -resize 6x6  checks_point-4.gif
  magick checks_10.gif -filter point -resize 5x5  checks_point-5.gif

[IM Output]
| | [IM Output]
Point-1 | [IM Output]
Point-2 | [IM Output]
Point-3 | [IM Output]
Point-4 | [IM Output]
Point 50%
---|---|---|---|---|---|---

Tout ce qui se passe réellement, c'est que des rangées et des colonnes isolées de pixels sont supprimées à travers l'image. Même à ce niveau, vous obtiendrez un fort effet de blocs et de crénelage dans l'image résultante, et vous pouvez, dans des cas particuliers comme celui ci-dessus, produire un résultat complètement irréaliste. C'est pourquoi un filtre « Point », ou l'équivalent plus rapide qu'est l'opérateur d'échantillonnage, n'est pas recommandé pour un redimensionnement d'image normal.

Box

Le réglage de filtre « **Box** » est exactement le même que « point » avec une légère variation. Lors de la réduction des images, il moyennera et fusionnera les pixels. Plus l'image résultante est petite, plus il y a de pixels moyennés ensemble. [IM Output] Voici un graphe de la fonction de pondération du filtre, d'où vous pouvez voir pourquoi on l'appelle un filtre « Box » (boîte). Fondamentalement, tout pixel qui tombe à l'intérieur de la « boîte » sera directement utilisé pour calculer la couleur du nouveau pixel. Or, comme le filtre ne fait qu'une demi-largeur de pixel, cela signifie que, pour une image qui n'est pas réellement redimensionnée, un seul pixel, le plus proche, sera utilisé. Autrement dit, quand aucune mise à l'échelle n'est en jeu (ou seulement un agrandissement), le pixel le plus proche du nouvel emplacement formera la couleur du nouveau pixel. Cependant, si une image est réduite, une plus grande partie de l'image source sera comprimée dans les limites de cette « boîte ». Il en résulte que davantage de pixels seront moyennés ensemble pour produire la couleur du pixel dans l'image plus petite. Par exemple, voici une vue agrandie d'un motif de pixels en damier tandis qu'il est lentement comprimé à l'aide d'un filtre « Box ».

  magick checks_10.gif -filter box -resize 9x9  checks_box-1.gif
  magick checks_10.gif -filter box -resize 8x8  checks_box-2.gif
  magick checks_10.gif -filter box -resize 7x7  checks_box-3.gif
  magick checks_10.gif -filter box -resize 6x6  checks_box-4.gif
  magick checks_10.gif -filter box -resize 5x5  checks_box-5.gif

[IM Output]
| | [IM Output]
Box-1 | [IM Output]
Box-2 | [IM Output]
Box-3 | [IM Output]
Box-4 | [IM Output]
Box 50%
---|---|---|---|---|---|---

Comme vous pouvez le voir, de plus en plus de pixels sont fusionnés à mesure que l'image est redimensionnée plus petite à l'aide d'un filtre « Box », mais cette fusion se produit dans des rangées et colonnes spécifiques, également espacées. Cela cause toutes sortes d'artefacts et d'effets de moiré ou de crénelage aussi bien lors de la réduction que de l'agrandissement des images. Il est recommandé d'utiliser le filtrage « Box » pour le « binning » des images. C'est-à-dire réduire les images par des multiples entiers afin de garantir que chaque pixel du résultat soit une moyenne du même nombre de pixels voisins (le « bin »). L'image résultante restera ainsi d'aspect propre, comme dans l'image finale ci-dessus. Il est aussi recommandé d'utiliser plutôt l'opérateur Scale, bien plus rapide, à la place du « filtre Box ». Il produira des résultats presque identiques, sauf dans le cas particulier de la réduction des images de seulement quelques pixels. Lors du « binning », il produira des résultats identiques. L'opérateur Scale n'est pas exactement identique à un « filtre Box », car il est implémenté à l'aide d'un algorithme spécial de « mélange de pixels ». Pour les détails exacts, voir Fonctionnement interne de Scale.
Lors de l'agrandissement, les filtres « Point » et « Box » produisent tous deux la même « réplication de pixels » des rangées et des colonnes, car ils reviennent tous à une simple sélection du « plus proche voisin ».
  magick -size 5x5 pattern:gray50  checks_5.gif
  magick checks_5.gif -filter box   -resize 6x6    checks_box+1.gif
  magick checks_5.gif -filter box   -resize 7x7    checks_box+2.gif
  magick checks_5.gif -filter box   -resize 8x8    checks_box+3.gif
  magick checks_5.gif -filter box   -resize 9x9    checks_box+4.gif
  magick checks_5.gif -filter box   -resize 10x10  checks_box+5.gif

[IM Output]
| | [IM Output]
Box+1 | [IM Output]
Box+2 | [IM Output]
Box+3 | [IM Output]
Box+4 | [IM Output]
Box+5
---|---|---|---|---|---|---

| L'opérateur Scale produit aussi des résultats similaires, mais avec un certain mélange des couleurs de pixels, lors de l'agrandissement, sauf si l'agrandissement se fait par un facteur d'échelle entier.
---|---

Triangle

[IM Output] Le filtre d'interpolation « Triangle » ou « [Bilinéaire](misc.html#bilinear) » pousse simplement l'interpolation du voisinage le plus proche un cran plus loin. Au lieu de simplement moyenner directement les pixels proches, comme le fait « Box », il les pondère selon la proximité de la position du nouveau pixel par rapport aux pixels d'origine dans le voisinage (ou région de « support »). Plus le nouveau pixel est proche d'un pixel de l'image source, plus ce pixel contribue de couleur. Cela produit un moyennage plus global des couleurs lorsque les images sont réduites.

  magick checks_10.gif -filter triangle -resize 9x9 checks_tri-1.gif
  magick checks_10.gif -filter triangle -resize 8x8 checks_tri-2.gif
  magick checks_10.gif -filter triangle -resize 7x7 checks_tri-3.gif
  magick checks_10.gif -filter triangle -resize 6x6 checks_tri-4.gif
  magick checks_10.gif -filter triangle -resize 5x5 checks_tri-5.gif

[IM Output]
| | [IM Output]
Tri-1 | [IM Output]
Tri-2 | [IM Output]
Tri-3 | [IM Output]
Tri-4 | [IM Output]
Tri
---|---|---|---|---|---|---

Comme vous pouvez le voir, comme les pixels de coin correspondaient presque parfaitement aux coins de l'image d'origine, ils sont plus visibles, mais vers le milieu, où aucun des pixels proches ne correspond exactement au nouveau pixel généré, vous obtenez une couleur plus moyenne de l'ensemble du voisinage. Le résultat, pour le motif de pixels en damier, est une tendance à fondre progressivement vers une couleur grise moyenne, dans un sens puis dans l'autre. Cependant, comme le voisinage de « support » est plus grand, davantage de pixels seront impliqués lorsque vous agrandissez l'image. On obtient ainsi un moyennage des couleurs lors de la génération des pixels ajoutés à l'image.

  magick checks_5.gif -filter triangle -resize 6x6  checks_tri+1.gif
  magick checks_5.gif -filter triangle -resize 7x7  checks_tri+2.gif
  magick checks_5.gif -filter triangle -resize 8x8  checks_tri+3.gif
  magick checks_5.gif -filter triangle -resize 9x9  checks_tri+4.gif
  magick checks_5.gif -filter triangle -resize 10x10 checks_tri+5.gif

[IM Output]
| | [IM Output]
Tri+1 | [IM Output]
Tri+2 | [IM Output]
Tri+3 | [IM Output]
Tri+4 | [IM Output]
Tri+5
---|---|---|---|---|---|---

Pour les agrandissements à grande échelle, le résultat se comporte comme si un dégradé de couleurs était ajouté entre chaque paire de pixels. Par exemple, ici je génère une très petite image avec un unique pixel blanc (l'affichage est une vue agrandie). Puis j'agrandis énormément cette image.

  magick xc: -bordercolor black -border 2x0 pixel_5.gif
  magick pixel_5.gif  -filter triangle -resize 300x  pixel_triangle.gif

[IM Output]
Image à un seul pixel
(agrandie) | | [IM Output]
Filtre Triangle agrandi
---|---|---

Si vous deviez tracer les couleurs de l'image ci-dessus (à l'aide du script « [im_profile](../static/img/scripts/im_profile) »), vous verriez une réplique du graphe du filtre triangulaire.

[IM Profile]
Profil de l'image

Comme vous pouvez le voir, le pixel central a été fusionné avec les pixels voisins pour produire un dégradé linéaire de couleurs entre ces points. Tous les filtres d'interpolation produisent des motifs de dégradé similaires entre pixels voisins, ce qui est aussi la raison pour laquelle ils conviennent si bien aux agrandissements d'image.

Autres filtres d'interpolation

[IM Output] À droite, j'ai tracé les différents filtres d'interpolation, sauf « Point », qui est en réalité un cas très particulier d'un filtre « Box » non mis à l'échelle (une interpolation « [NearestNeighbor](misc.html#nearest) » pure). Parmi les autres filtres d'interpolation figure « **Hermite** », très similaire à triangle dans ses résultats, mais produisant un arrondi plus doux pour les agrandissements, qui lisse les transitions de dégradé. Cliquez sur le graphe de droite pour voir un graphe de ces trois fonctions de filtre.
[IM Output] Le filtre « **Lagrange** » a été qualifié de filtre d'interpolation « universel ». En faisant varier la taille du « support » (voir le réglage expert de support ci-dessous), il peut générer tous les filtres d'interpolation examinés précédemment (sauf « Hermite »). Les réglages par défaut (un filtre Lagrange d'ordre 3 (support=2.0), montré par la ligne violette sur le graphe de droite) fournissent un filtre « cubique » raisonnable. Il fonctionne très bien, bien que le changement de dégradé puisse entraîner des effets de blocs notables lors de l'agrandissement, ce qui, pour les images bitmap et les dessins au trait, peut être une bonne chose. Plus de détails sur les autres ordres du filtre Lagrange plus loin. [IM Output] Le filtre « **Catrom** » (Catmull-Rom) est un filtre cubique standard bien connu, souvent utilisé comme fonction d'interpolation, et disponible sous le même nom. Ce filtre produit un bord assez net, mais sans le changement de dégradé prononcé, lors des agrandissements d'image à grande échelle, qu'un filtre « Lagrange » peut produire. Il est fondamentalement équivalent à un « redimensionnement avec accentuation » intégré (voir Images redimensionnées accentuées), bien que certains le considèrent bien trop net, et il n'offre aucun contrôle de l'accentuation. Ce qui rend un filtre « Catrom » plus intéressant, c'est qu'il est presque l'équivalent cubique identique d'un filtre « [Lanczos](#lanczos) » à 2 lobes, qui est probablement le filtre Sinc fenêtré le plus couramment utilisé (voir ci-dessous). Nous examinerons aussi ce filtre de plus près plus loin, dans Filtres cubiques.

Interpolation et le réglage Interpolate d'IM

Le réglage Interpolate d'IM, utilisé pour produire une recherche « ponctuelle » non mise à l'échelle des images dans des opérateurs comme l'opérateur bricolage FX[-fx](https://imagemagick.org/command-line-options/#fx) ») et l'opérateur de remplacement par table de couleurs[-clut](https://imagemagick.org/command-line-options/#clut) »), ainsi que certaines anciennes fonctions de distorsion circulaire, repose sur ces simples filtres de redimensionnement par interpolation. Cependant, ils sont actuellement implémentés à l'aide d'un code distinct et portent aussi des noms de réglage différents. Ces réglages d'interpolation incluent : « [NearestNeighbor](misc.html#nearestneighbor) », qui implémente le filtre « Point » (ou « Box » non mis à l'échelle), et « [BiLinear](misc.html#bilinear) » pour obtenir un filtre « Triangle » non mis à l'échelle. APARTÉ : à ce stade, le filtre triangle lissé « Hermite » n'a pas été implémenté directement comme réglage d'interpolation, ce qui est dommage car c'est un très bon filtre d'interpolation.

Filtres de flou Gaussian

Dans les mathématiques complexes des transformées de Fourier vers les domaines fréquentiels, les filtres de redimensionnement sont censés supprimer tout bruit de haute fréquence pouvant être présent. Ce bruit est causé par l'échantillonnage d'une image du monde réel en pixels, et lorsque vous redimensionnez une image, ce bruit apparaît sous forme d'effets de crénelage et de moiré. À cause de cela, la courbe en cloche de Gauss est devenue naturellement l'une des premières candidates comme filtre de redimensionnement ou de rééchantillonnage, car c'est le modèle idéal des effets du monde réel.

Gaussian

[IM Output] Le filtre Gaussian est un filtre très particulier qui génère cette même forme de « courbe en cloche » dans le domaine fréquentiel. Cela le rend très utile comme filtre d'image, car il garantit une bonne suppression de ce bruit de haute fréquence, de manière hautement contrôlable. Cependant, si vous examinez le graphe du filtre, vous verrez qu'à une distance d'un pixel du point d'échantillonnage, vous avez une valeur non nulle. En fait, c'est même une valeur assez élevée. Cela entraîne un énorme flou des pixels individuels, même lorsqu'aucun redimensionnement n'est réellement effectué. Par exemple, ici j'ai redimensionné le logo IM standard à l'aide d'un filtre Gaussian, puis de nouveau à l'aide du filtre IM normal (« Lanczos » dans ce cas, que nous examinerons plus tard)

  magick logo:  -filter Gaussian  -resize 150x logo_gaussian.png
  magick logo:                    -resize 150x logo_normal.png

| [IM Output]
Gaussian | [IM Output]
Redimensionnement normal
---|---|---

Si vous regardez de près, vous verrez que l'image de gauche filtrée par « Gaussian » est plus floue que le redimensionnement normal. En particulier pour ce qui est du détail des petites étoiles autour de la baguette et sur le chapeau du magicien. Ce flou de l'image est le compromis que vous obtenez pour supprimer tous les effets de crénelage lors de la réduction d'image, ainsi que tous les effets de blocs lors de l'agrandissement. Il ne produira jamais non plus d'effets de rebond (lorsqu'il est appliqué parfaitement). Mais tout cela au prix d'un flou extrême de l'image résultante. Enfin, lors des agrandissements à grande échelle, ce filtre génère des points ronds, plutôt que des points d'aspect carré. Par exemple, ici j'agrandis fortement une image de 3x3 pixels avec un unique point au centre. |

  magick xc:red -bordercolor yellow -border 1 \
          -filter Gaussian   -resize 99x99  -normalize dot_gaussian.jpg

[IM Output]
Comme vous pouvez le voir, un unique pixel s'agrandit en un point parfaitement circulaire. Seuls les filtres Gaussian et de type Gaussian font cela.

Contrôle expert Sigma du Gaussian

Vous pouvez contrôler directement le filtre Gaussian à l'aide d'une option expert spéciale « [-define](https://imagemagick.org/command-line-options/#define) filter:sigma=_{value}_ » pour spécifier la valeur « sigma » réelle de la courbe de Gauss. Par défaut, cette valeur est « 0.5 », qui est aussi la même taille que le filtre Box. À bien des égards, vous pouvez considérer un filtre Gaussian comme essentiellement une « boîte floutée ». Cette option expert a été ajoutée pour permettre la création de très très petits flous gaussiens, sans réduire la plage de support du filtre (voir ci-dessous). Cependant, augmenter le « sigma » pourrait faire en sorte que le filtre soit tronqué. C'est pourquoi, lorsqu'on augmente la valeur « sigma », le « support » par défaut (2.0) est aussi augmenté d'une quantité similaire. Cela ne se produit que lors des augmentations de la valeur « sigma » par défaut. Le réglage expert de support peut être utilisé pour outrepasser cet effet automatique, mais ce n'est généralement pas nécessaire. | _L'option expert « filter:sigma » ne fonctionne que pour le filtre Gaussian. Aucun autre filtre n'est affecté par ce contrôle expert.

Un contrôle plus généralisé, pour d'autres filtres, peut être obtenu à l'aide du contrôle expert de flou de filtre, que nous examinerons plus tard.

_
---|---

Autres filtres de type Gaussian

[IM Output] Si vous étudiez les graphes comparatifs à droite, vous verrez que le filtre « Quadratic » ainsi que le filtre « Spline », légèrement plus complexe, suivent assez bien la courbe de pondération du filtre « Gaussian ». Et, étant des fonctions polynomiales, ils sont aussi beaucoup plus rapides à calculer, ce qui est la raison pour laquelle ils ont été inventés à l'origine. Alors que « Quadratic » est très légèrement plus flou que le filtre Gaussian, le filtre « Spline » l'est encore davantage, avec un réglage Sigma équivalent d'environ « 0.65 ». Cela fait du filtre « Spline » le filtre le plus flou fourni sans modifications. En examinant les graphes, vous verrez que, comme le filtre Gaussian et contrairement aux filtres d'interpolation, ils ont une valeur non nulle à une distance de 1.0 du point d'échantillonnage. Cela amène les pixels proches à mélanger leurs couleurs, et c'est la cause du flou que vous observez. Le filtre « Spline », ayant la valeur la plus élevée à la distance 1.0, produit la plus grande quantité de flou dans toute image redimensionnée (ou distordue). Ce surcroît de flou supprime les derniers effets de « blocs » qui pourraient subsister lors des agrandissements à grande échelle. Et il pourrait être utilisé avec une technique d'accentuation des images redimensionnées pour agrandir des dessins au trait avec très peu d'« effets d'escalier » dans le résultat. Le filtre « [Mitchell](#mitchell) » est aussi montré dans le graphe de comparaison. Ce filtre présente également un certain flou à la distance 1.0 du point d'échantillonnage, ce qui le rend lui aussi légèrement flou, à l'instar des autres filtres que nous avons vus. Cependant, il possède aussi une pondération négative dans sa courbe, qui, tout en produisant des effets de rebond (voir Filtres Sinc fenêtrés plus loin), compense ce flou près des bords nets.

Contrôle expert du support de filtre

Le filtre Gaussian est connu comme un filtre RII (à réponse impulsionnelle infinie), ce qui signifie simplement que la « courbe » de réponse qu'il utilise n'atteint jamais zéro. Autrement dit, quelle que soit la distance au point d'échantillonnage, vous aurez toujours une contribution non nulle au résultat, provenant de pixels très éloignés. En termes mathématiques, c'est en réalité une bonne chose, car cela signifie que le résultat est bien plus parfait mathématiquement. En application pratique, c'est très mauvais, car un filtre infini vous oblige à utiliser une moyenne pondérée de chaque pixel de l'image d'origine pour générer chaque nouveau pixel de l'image de destination. Cela signifie que les grandes images mettraient très très longtemps à être redimensionnées parfaitement avec ce filtre. Cependant, pour le filtre « Gaussian », tout ce qui dépasse une plage d'environ 2 pixels (4 fois son réglage « sigma » par défaut) à partir du point d'échantillonnage ne produira généralement que très peu d'effet sur le résultat final, et peut donc généralement être ignoré. Même 3 fois le sigma est généralement considéré comme raisonnable. Cette plage est connue sous le nom de « fenêtre de support » du filtre, et constitue la limite pratique du programme pour le filtre. Si vous le souhaitez vraiment, vous pouvez modifier le « support » d'un filtre à l'aide du réglage expert spécial « [-define](https://imagemagick.org/command-line-options/#define) filter:support=_{value}_ ». Par exemple, ici je redimensionne une image comportant un unique pixel en utilisant la valeur de support plus petite de 1.25, soit 2 fois et demie la valeur sigma (voir le graphe résultant à droite). C'est bien sûr plus petit que le minimum généralement admis de 3 fois la valeur sigma. |

  magick pattern:gray5 -crop 5x1+0+3 +repage pixel_5.gif
  magick pixel_5.gif  -filter gaussian -define filter:support=1.25 \
          -resize 300x  pixel_gaussian.png

[IM Output]

[IM Output]
Image à un seul pixel | | [IM Output]
Filtré Gaussian
---|---|---
[IM Profile]
Profil de l'image

En utilisant le réglage « support » plus petit, le « saut » (là où la fenêtre de support coupe la fonction) a été déplacé à la position 1.25. Cela entraîne à son tour un « arrêt » plus important dans le profil du filtre, et produit des effets de « crénelage » que vous pouvez voir dans l'agrandissement. C'est-à-dire l'ondulation près du « pic » du graphe, ainsi qu'une « chute » soudaine aux bords des limites de « support » du filtre. Vous pouvez concevoir le « support » comme une « fenêtre » coulissante à travers les pixels moyennés ensemble pour produire le résultat de l'image agrandie. Comme la taille de support est de 1.25, la zone de support totale du filtre fait 2.5 pixels de large (non mise à l'échelle lors des agrandissements d'image) ; vous pouvez donc avoir 2 ou 3 pixels impliqués dans la phase de redimensionnement horizontal. À mesure que cette « fenêtre » de support glisse à travers l'image, chaque pixel qui entre ou sort génère le « changement » soudain dans la « courbe » du filtre. C'est la cause des légères secousses dans les résultats. Autrement dit, à ces points, un pixel est ajouté ou retiré du nombre total de pixels moyennés ensemble selon la courbe de pondération du filtre. Cela produit à son tour quatre de ces « secousses » ou « zigzags » dans l'image redimensionnée : une première paire sur les bords extérieurs quand l'unique pixel blanc entre/sort de la plage de support, et une seconde paire de secousses quand un second pixel noir (formant une moyenne pondérée de trois pixels) entre/sort de la plage de support. S'il n'y avait pas un « arrêt » aussi soudain dans le filtre, c'est-à-dire si le filtre allait à zéro à la limite de support, alors vous ne verriez pas les « secousses » et vous n'auriez pas l'effet visible. Utiliser une taille de support fixée à un entier ou un demi-entier (comme le réglage « support » par défaut d'un filtre « Gaussian », de « 2.0 ») garantirait toujours que, chaque fois qu'un nouveau pixel entre dans la plage de support, un autre pixel en sort, de sorte que le même nombre de pixels fasse toujours partie de cette moyenne. Cela supprimerait les deux secousses « centrales », mais ne supprimerait pas les secousses initiales à l'extérieur, marquant les limites de support. Même de brusques changements de pente (discontinuités) dans le filtre, comme ceux que vous obtenez d'un filtre Triangle ou Lagrange, peuvent générer des artefacts visibles dans l'image résultante. | _Avant IM v6.3.6-3, le 'support' du filtre Gaussian était fixé à cette valeur de « 1.25 », produisant des effets de rebond dans les agrandissements (comme montré ci-dessus). Pour cette raison, le 'support' du Gaussian a été changé en « 1.5 » afin de garantir que le même nombre de pixels soit toujours moyenné, et de réduire le plus petit palier.

Depuis IM v6.6.5-0, le réglage 'support' par défaut du Gaussian a été porté à une valeur de « 2.0 ». Cela a peu d'effet sur la vitesse globale du filtre, mais rend l'« arrêt » pratiquement inexistant. Cela a aussi simplifié le codage du filtre pour d'autres usages particuliers de ce filtre, en particulier pour les distorsions EWA et le mappage de flou variable.

_
---|---
Notez cependant que si vous utilisez un réglage de support très grand, alors bien sûr davantage de pixels devront être moyennés ensemble, ce qui rend l'opération de redimensionnement plus lente, sans réelle amélioration des résultats. Seuls les filtres Sinc/Jinc fenêtrés et Lagrange peuvent généralement produire un meilleur résultat en utilisant une fenêtre de support supérieure à 2.0. Rappelez-vous que ce sont des options « expert », et qu'à ce titre vous êtes plus susceptible d'aggraver les choses que de les améliorer en les utilisant. C'est pourquoi elles ne sont pas une simple option de ligne de commande, mais fournies via l'option spéciale « [-define](https://imagemagick.org/command-line-options/#define) ». Bien sûr, vous êtes libre de jouer avec, comme je l'ai fait ci-dessus, afin d'essayer de mieux comprendre les choses, et IM fournit ces options précisément pour que vous puissiez le faire.

Contrôle expert du flou de filtre

Une option expert spéciale, « [-define](https://imagemagick.org/command-line-options/#define) filter:blur=_{value}_ », peut être utilisée pour ajuster la quantité de flou qu'un filtre applique. Une valeur de « 1.0 » produit l'action par défaut, tandis que des valeurs plus petites et plus grandes ajustent le « flou » global. Fondamentalement, cela agrandit ou rétrécit linéairement la courbe du filtre le long de l'axe X (distance du pixel au point d'échantillonnage), et rend typiquement un filtre plus ou moins flou dans l'ensemble. Utiliser un réglage plus petit fait que la fonction du filtre (et sa fenêtre de support) devient plus petite. Pour les filtres Gaussian et de type Gaussian, l'effet revient à multiplier la valeur 'sigma' des filtres (par défaut=0.5) par ce facteur de 'flou'. Ce réglage agrandit ou rétrécit aussi la fenêtre de support des filtres de la même quantité, afin d'éviter la troncature, mais cela peut être outrepassé à l'aide du réglage expert de support de filtre. Par exemple, ici je redimensionne une image avec trois réglages de 'flou' différents, à l'aide d'un filtre Spline de type Gaussian..

  for blur in 0.5 1.0 1.5; do \
    magick logo: -define filter:blur=$blur -filter Spline \
            -resize 150x logo_blur_$blur.png; \
  done

[IM Output]
blur 0.5 | | [IM Output]
blur 1.0 | | [IM Output]
blur 1.5
---|---|---|---|---

Comme vous pouvez le voir, ce réglage spécial vous permet de contrôler le flou global du résultat pour le filtre « Spline ». Comme la taille de la 'fenêtre de support' est aussi mise à l'échelle par le réglage Flou de filtre, utiliser des valeurs de mise à l'échelle très petites peut amener le rééchantillonnage à « rater » tous les pixels, ou à ne générer que des pixels de pondération nulle. Il en résulte que des lignes ou des blocs 'noirs' réguliers seront générés. Par exemple... |

  magick rose: -define filter:blur=0.1 -filter Gaussian \
          -resize 100x100  rose_black_bars.png

[IM Output]
Augmenter la taille de la fenêtre de support (avant qu'elle ne soit mise à l'échelle par le flou) peut aider à prévenir ces effets, mais comme la plupart des filtres ne produisent des pondérations nulles que pour les pixels situés hors de leur plage de support 'naturelle', cela ne fonctionnera pas pour tous les filtres. Les seuls filtres qui génèrent typiquement des valeurs non nulles utiles sur toute la plage de support sont le filtre Box et les filtres Sinc/Jinc fenêtrés. Des effets similaires peuvent s'observer avec les filtres cylindriques, lorsque le support du filtre devient trop petit pour toujours trouver au moins un pixel à échantillonner. Les filtres Lagrange utilisent le réglage expert de support de filtre pour déterminer l'« ordre » approprié à faire tenir dans la « fenêtre de support », et se transforment ainsi en diverses autres formes (voir ci-dessous). | _Utiliser de mauvais réglages de support avec des filtres contenant des pondérations négatives (en gros, tous les filtres que nous examinerons ensuite) peut produire des effets d'accentuation inverse et de négation, ainsi que des effets de crénelage disproportionnellement plus forts. Dans de rares cas, cela peut même générer des couleurs de pondération infinie (qui sont écrêtées en noir et blanc purs dans les versions normales, non HDRI, d'IM).

Prudence et expertise sont recommandées lors de l'usage de cette option spéciale avec n'importe quel filtre.
---|---
| _Avant IM v6.3.6-3, le define « filter:blur » était fixé par erreur par l'option "-support", ce qui était très trompeur quant à son effet réel. Cette option a été dépréciée et n'est plus disponible.

---|---

Variante de filtre Interpolateur Gaussian

[IM Output] Une valeur de contrôle de flou de « 0.75 » sur les filtres de type Gaussian, ou l'usage d'une valeur de contrôle Sigma de « 0.375 » pour le filtre Gaussian, génère une variation que j'appelle Interpolateur Gaussian. Ce filtre Gaussian accentué a des propriétés similaires aux filtres d'interpolation que nous avons examinés plus haut. Mais il ne contient aucun arrêt brusque, ni autre changement de dégradé perceptible dans les images agrandies. À cet égard, il ressemble beaucoup au filtre « [Hermite](#hermite) » (voir le graphe), mais avec une asymétrie qui semble effectivement mieux fonctionner comme interpolateur.

  magick logo: -filter Gaussian -resize 150x logo_gaussian.png
  magick logo: -define filter:blur=0.75 -filter Gaussian \
          -resize 150x logo_gaussian_interpolate.png

[IM Output]
Gaussian | | [IM Output]
Interpolateur Gaussian
(blur=0.75 ou sigma=0.375)
---|---|---

En fait, je trouve que cela fait produire au filtre Gaussian des résultats bien plus acceptables, ni trop nets, ni trop flous. Cependant, réduire le flou du filtre accentuera les effets de crénelage, ce qui le rend plus susceptible de générer des effets de moiré à grande échelle à partir de motifs de bas niveau au niveau des pixels. C'est le compromis lié à l'usage d'une forme moins floue du filtre.

  magick rings_crop.png -filter gaussian -resize 100x100  rings_gaussian.png
  magick rings_crop.png -filter gaussian -define filter:blur=0.75 \
                              -resize 100x100  rings_gaussian_interpolate.png

[IM Output]
Gaussian | | [IM Output]
Interpolateur Gaussian
(blur=0.75 ou sigma=0.375)
---|---|---

Filtres Sinc fenêtrés

Filtres Sinc

Les mathématiques ont déterminé que le filtre idéal pour redimensionner une image (avec une technique de redimensionnement 'tenseur' en 2 passes) est la fonction Sinc(). (Voir le théorème d'échantillonnage de Nyquist–Shannon). [IM Output] La fonction Sinc(), étant mathématiquement parfaite, possède quelques caractéristiques particulières que j'aimerais souligner. D'abord, à chaque distance entière, la fonction de pondération du filtre devient nulle. C'est très important, car cela signifie que le filtre ne floute pas l'image plus que nécessaire (contrairement aux filtres Gaussian). Cela signifie aussi que si une image est rééchantillonnée sans redimensionnement (un redimensionnement « sans effet »), l'image reste totalement inchangée par le filtre. C'est donc un filtre interpolatif, quoique très complexe. La fonction Jinc() est étroitement liée à Sinc(), et possède des propriétés qui la rendent utile comme filtre pour le filtrage bidimensionnel, comme celui utilisé par l'opérateur de distorsion d'image générale. Plus de détails sur cette fonction plus loin, dans Filtres cylindriques. Pour l'instant, notez seulement qu'elle pourrait aussi servir de fonction de base pour les filtres Jinc fenêtrés. L'autre différence majeure entre les filtres basés sur Sinc() et Jinc() et les filtres précédents que nous avons examinés est que beaucoup des pondérations sont négatives. C'est-à-dire qu'elles soustraient une partie des pixels de couleur proches à la couleur finale, pour chaque pixel de l'image. Cela peut sembler un peu étrange, mais il en résulte une forte accentuation des bords des objets. Bien sûr, toute pondération négative doit généralement être compensée par bien plus de pondérations positives plus loin sur la courbe, ce qui produit la fonction en forme d'onde que vous voyez s'étendre sur une longue distance à partir du point d'échantillonnage. Ces « lobes » supplémentaires de pondérations positives (et négatives) causent des artefacts de rebond dans les images qui contiennent des frontières de couleur très marquées, comme dans les dessins au trait à fort contraste, ou une frontière telle qu'un toit rouge sur un ciel bleu. Ces effets de rebond peuvent devenir encore plus prononcés si des filtres basés sur ces fonctions sont appliqués de façon inappropriée.

Fonctions de fenêtrage

Malheureusement, cette fonction est aussi une fonction RII (à réponse impulsionnelle infinie). C'est-à-dire qu'elle a des effets allant jusqu'à l'infini, tout comme le filtre Gaussian précédemment. Cela signifie que pour utiliser 'Sinc', vous devriez générer une moyenne pondérée de chaque pixel de l'image (et au-delà) afin de créer la meilleure représentation pour chaque nouveau pixel de l'image de destination. C'est d'un coût prohibitif, rendant impraticable l'usage direct de ces filtres parfaits. Non que vous le voudriez, à cause des effets de rebond. Mais, contrairement au filtre Gaussian, la fonction 'Sinc' ne décroît pas simplement vers presque zéro à une courte distance du point d'échantillonnage. En fait, même à 10 pixels du point d'échantillonnage (voir le graphe ci-dessus), vous pouvez obtenir un effet appréciable sur le résultat final. Or, redimensionner une image avec un filtre ayant une distance de support de 10 exigerait un moyennage d'au moins 20x20, soit 400 pixels par pixel dans le résultat final. Et cela produirait un redimensionnement très lent. Par conséquent, l'usage d'un filtre « Sinc » sous sa forme brute n'est pas recommandé, et n'est presque jamais utilisé, bien qu'à l'aide des contrôles experts de filtre, IM ne vous empêche pas de le faire, si c'est vraiment ce que vous voulez. Ce qui est recommandé et fourni, ce sont des formes « fenêtrées » de la fonction Sinc, développées par des experts du traitement d'image, qui permettent de « limiter » les fonctions infinies Sinc (et Jinc) à une taille plus pratique. Ces filtres de fenêtrage incluent des filtres tels que : « Blackman », « Bohman », « Hann », « Hamming », « Lanczos », « Kaiser », « Welch », « Bartlett » et « Parzen ».

Comment fonctionnent les filtres fenêtrés

[IM Output] Par exemple, le graphe à droite montre trois fonctions (cliquez pour obtenir une vue agrandie). La fonction rouge est la fonction Sinc() mathématiquement idéale, qui s'étend jusqu'à l'infini. La fonction verte est une fonction de fenêtrage « Hann » (basée sur une simple courbe Cosine()). Elle est multipliée par Sinc() pour moduler les composantes plus lointaines du filtre, atteignant zéro (ou près de zéro) au bord de la fenêtre de support (4.0 unités de pixel de distance par défaut pour ce filtre). Fondamentalement, en sélectionnant « Hann » pour la sélection « [-filter](https://imagemagick.org/command-line-options/#filter) », vous sélectionnez en réalité la « fonction de fenêtrage » « Hann() » pour moduler la « fonction de pondération » telle que « Sinc() » (ou « Jinc() »). Ainsi, les « filtres fenêtrés » sont en réalité deux fonctions. Soit la fonction Sinc, soit la fonction Jinc (selon l'opérateur de traitement d'image), et la « fonction de fenêtrage » que vous avez spécifiquement sélectionnée comme filtre à utiliser. (Voir Contrôles experts de filtre ci-dessous). Avant la v6.3.6-3, IM a commis la grave erreur d'utiliser réellement les fonctions de fenêtrage directement comme fonction de pondération du filtre. Cela a fait que tous ces filtres (sauf Lanczos) produisaient des images fortement crénelées lorsqu'on les utilisait pour le redimensionnement. Par conséquent, ces filtres étaient souvent mal compris ou rarement utilisés par les utilisateurs d'IM. Cela a maintenant été corrigé.

Les divers filtres de fenêtrage

[IM Output] À droite se trouve un graphe de toutes les diverses fonctions de fenêtrage dont IM dispose à l'heure où ces lignes sont écrites (d'autres ont été ajoutées par la suite). Oui, il y en a beaucoup, car les fonctions de fenêtrage ont fait l'objet d'études intenses de la part de nombreux experts du traitement du signal. Toutes les fonctions de filtre fenêtré seront généralement utilisées pour moduler une fonction de pondération Sinc (ou Jinc) avec un support de 3 ou 4 pour Sinc (3 ou 4 lobes), selon la classe de fonction de fenêtrage utilisée (voir ci-dessous). Par exemple, un filtre de fenêtrage « Blackman » utilisera 4 lobes, mais « Lanzcos » en utilisera 3. Cela dépend de votre version d'IM, alors vérifiez l'option expert de filtre verbeuse si vous voulez en être sûr. Comme vous pouvez le voir, toutes les fonctions de filtre fenêtré produisent une forme atténuée de la fonction Sinc() d'origine, également montrée. Et hormis la quantité de rebond qu'un filtre donné génère, il y a souvent très peu de choses pour distinguer un filtre fenêtré d'un autre. Sans doute l'un des meilleurs filtres fenêtrés est « Lanczos ». Tandis que d'autres personnes ne jurent que par « Blackman », « Bohman », « Hann » (une cloche cosinusoïdale atténuée), « Hamming » (variante de cloche cosinusoïdale), « Cosine » (un seul lobe cosinusoïdal) comme fonctions de fenêtrage. Toutes ces fonctions reposent sur l'usage d'une fonction Sinc, ou Sinus/Cosinus, dans leur formulation, ce qui est censé garantir une bonne réponse en fréquence. Les autres filtres de fenêtrage incluent « Welch » (parabolique), « Parzen » (spline cubique), « Kaiser » (Bessel), et sans doute le plus simple « Bartlett » (triangulaire ou linéaire). Typiquement, ces fonctions ont été créées pour leur simplicité et leur rapidité de calcul, bien qu'on les considère généralement comme ayant une mauvaise « réponse en fréquence ». Beaucoup de ces fonctions de fenêtrage sont aussi utilisées comme filtres de rééchantillonnage à part entière. Par exemple, le « Bartlett » (qui est sans doute le véritable ovni de toutes les fonctions de fenêtrage) est en réalité la même fonction mathématique utilisée pour un filtre « Triangle », ainsi que pour le filtre d'interpolation « Bilinear ». Toutes les fonctions (sauf « Bartlett ») forment deux catégories de base de fonctions de fenêtrage.

  • Une courbe atténuée en forme de 'cloche', comme « Hamming », « Hann », « Kaiser », « Blackman », « Bohman » et « Parzen ».
  • Et une fonction de fenêtrage de type 'lobe' non atténué qui retombe rapidement à zéro, avant d'être 'coupée' par le support de la fenêtre, comme « Lanczos », « Welch » et « Cosine ».

Si vous étudiez le graphe des fonctions de fenêtrage ci-dessus, vous pouvez voir en quoi les formes des deux styles de filtre diffèrent. Cependant, les deux catégories de fonctions de fenêtrage ne semblent pas aussi importantes que la « réponse en fréquence » globale que vous obtenez en utilisant une courbe définie trigonométriquement. Les fonctions de fenêtrage atténuées en forme de 'cloche' utiliseront un support en lobes sur 4 lobes de la fonction de pondération Sinc (ou de la fonction Jinc dans le rééchantillonnage cylindrique (distorsion)). Le type de filtre de fenêtrage de type 'lobe' non atténué utilisera par défaut un support de 3 lobes. Il en résulte une équivalence approximative entre les deux types de filtre de fenêtrage, en raison de la différence de décroissance de la fonction de fenêtrage. Cela signifie aussi que les filtres fenêtrés non atténués seront, par défaut, légèrement plus rapides que les atténués. Le nombre de lobes par défaut que les filtres devraient avoir a été discuté dans la discussion des forums IM, Add Cosine windowing?. Bien sûr, si vous le souhaitez, vous pouvez modifier le support en lobes ou même simplement le support général de n'importe quel filtre de redimensionnement. Ils se valent tous, avec seulement de très légères variations dans la quantité d'effets de rebond et de blocs produits. [IM Output] À droite se trouvent les mêmes fonctions de fenêtrage, mais utilisant le support en lobes par défaut défini par IM selon la nature atténuée/non atténuée de la fonction. Comme vous pouvez le voir, sur les deux premiers lobes (les principaux, ayant le plus d'influence), il y a très peu de différence entre les filtres, et tous montrent une « décroissance » très similaire sur cette plage. Cependant, l'ordre des fonctions n'a pas beaucoup changé, les extrêmes restant entre « Welch » et « Parzen », et « Lanczos » tombant exactement au milieu des décroissances de courbe résultantes. [IM Output] Et à droite se trouvent les filtres Sinc fenêtrés résultants qui seraient fournis à un utilisateur sélectionnant ces fonctions de fenêtrage avec les valeurs par défaut ci-dessus. Comme vous pouvez le voir, les courbes de pondération finales sont toutes très similaires, et, comme prévu, toutes prises en sandwich entre les extrêmes « Welch » et « Parzen ». Vous pouvez consulter des définitions et des graphes plus détaillés de la plupart de ces diverses fonctions de fenêtrage, et de leurs résultats dans le spectre de fréquence de Fourier, sur Wikipedia, Window function.
En résumé : je n'ai pas trouvé de grande différence de résultats entre ces diverses fonctions de fenêtrage. De plus, à ma lecture des articles de recherche, les résultats semblaient tous relever davantage d'une opinion qualitative sur leur adéquation que de quelque chose de concret. Mon sentiment est que presque n'importe quelle fonction de fenêtrage peut être utilisée, mais si je devais en choisir une, vous feriez mieux de vous en tenir au filtre de fenêtrage « Lanczos », le plus populaire. Il se situe au milieu de tous les filtres ci-dessus, a une bonne réponse en spectre de fréquence, et constitue généralement un bon choix comme filtre de rééchantillonnage. En revanche, un expert du traitement d'image, qui a joué un rôle déterminant dans les filtres de rééchantillonnage d'ImageMagick, n'est pas de cet avis. Cependant, il choisit les filtres davantage en fonction des exigences exactes propres à des images spécifiques. Vous pouvez voir ses suggestions et commentaires dans Techniques recommandées par Nicolas Robidoux.

Filtre Lanczos

Nous avons déjà mentionné le filtre « Lanczos » à plusieurs reprises. C'est sans doute le plus connu des filtres fenêtrés, qui se situe au milieu de la gamme des filtres fenêtrés que nous avons vus. Essentiellement, il ne « décroît » ni trop vite, ni trop lentement, et présente une bonne réponse en fréquence dans la transformée de Fourier résultante. Fondamentalement, « Lanczos » constitue un excellent point de départ pour tout type de travail sur les filtres, et a été largement utilisé dans le développement récent des filtres cylindriques Jinc fenêtrés (voir ci-dessous). Le filtre « Lanczos » utilise en gros le premier 'lobe' de la fonction Sinc() pour fenêtrer la fonction Sinc(). C'est-à-dire que la fonction de pondération du filtre est utilisée pour définir sa propre fonction de fenêtrage. Beaucoup y voient une bonne raison de le préférer aux nombreux autres filtres Sinc fenêtrés. Bien qu'il n'y ait que peu, voire aucune, preuve réelle qu'il soit le meilleur, c'est un solide filtre de milieu de gamme. Par défaut, IM définit le filtre « Lanczos » comme ayant 3 'lobes'. La raison en est que la fonction de fenêtrage elle-même est 'non atténuée', en ce qu'il s'agit juste d'un lobe unique qui se coupe, le premier passage à zéro de la fonction coïncidant avec les limites de support de la fenêtre. Voir Comment fonctionnent les filtres fenêtrés ci-dessus. [IM Output] Cependant, un filtre « Lanczos2 » à 2 lobes (Lanczos avec un nombre de lobes par défaut de 2, ajouté pour faciliter la sélection par l'utilisateur) s'est aussi révélé populaire, car il évite les artefacts de rebond positifs que peuvent générer les filtres Sinc fenêtrés. Le « Catrom » (en réalité le 'filtre Catmull-Rom') est presque un duplicata exact du filtre « Lanczos2 », mais comme c'est un filtre cubique, il est bien plus rapide à générer mathématiquement. Cela n'est toutefois généralement pas un problème vu la façon dont IM met en cache les valeurs de filtre avant de traiter les images. Cela dit, une longue discussion dans les forums IM semble indiquer que, pour le redimensionnement orthogonal (tenseur), un « Lanczos » à 4 lobes fonctionne en réalité mieux pour réduire les images, tout en prévenant le moiré dans les images d'objets à motifs très fins, mais au prix de plus de rebond.

Taille de fenêtrage en lobes

Comme je l'ai mentionné, la fonction de filtre Sinc (et Jinc) sous-jacente est en réalité de taille infinie. Cependant, par défaut, IM les limite à l'aide de la fonction de fenêtrage spécifiée à une taille bien plus petite et plus pratique. Il peut néanmoins y avoir des situations où vous voulez vraiment essayer d'obtenir un redimensionnement bien meilleur et plus exact de l'image en utilisant une fenêtre (support) bien plus grande et plus lente. Cela peut même se faire assez simplement à l'aide du contrôle expert de support de filtre, tout comme nous l'avons fait pour les filtres de type Gaussian. La fonction de fenêtrage elle-même réduira (dans la plupart des cas) le Sinc (et le Jinc) à zéro sur la plage du réglage de support. Mais comme la fonction de fenêtrage est mise à l'échelle pour tenir dans la fenêtre de 'support', la fonction de filtre résultante changera aussi. [IM Output] Par exemple, à droite, j'ai tracé les filtres fenêtrés « Lanczos », par rapport à la fonction Sinc() comme référence, en utilisant divers réglages de 'support' de 2 à 8. Notez que la taille réelle du filtre est limitée par la taille de support réellement utilisée. Plus le 'support' est petit, plus le filtre est rapide, mais moins la fonction suit exactement la fonction Sinc() mathématiquement idéale. Regardez de près chacune des courbes tracées. La courbe 'verte' (support=2) n'a que le pic central principal, plus un 'lobe' négatif (équivalent à un filtre « Lanczos2 »). Après cela, la fonction est simplement nulle, et non utilisée. La courbe 'violette' suivante (support=3, et le filtre « Lanczos » par défaut) a un premier 'lobe' négatif bien plus grand, puis un 'lobe' positif plus petit. Cela continue avec l'ajout de davantage de lobes, à mesure que la taille de support augmente par incréments entiers. Les lobes supplémentaires sont de plus en plus petits en hauteur, produisant de moins en moins d'influence sur le résultat final, mais avec les 'lobes' initiaux devenant plus hauts (plus d'influence, et donc plus d'effets de rebond). Pour un effet optimal, vous utiliseriez un réglage de support permettant de générer un filtre comportant autant de 'lobes' montants/descendants. C'est-à-dire que vous feriez en sorte que la fonction de fenêtrage, et donc le 'support' du filtre, se termine à un 'passage à zéro'. Cependant, tandis que la fonction Sinc() a des 'lobes' (passages à zéro) à des réglages de 'support' entiers, la fonction de pondération Jinc() n'en a pas. Cela pose un problème aux utilisateurs souhaitant ajuster la fenêtre de support d'un filtre utilisé avec l'opérateur de distorsion. En fait, Jinc() a des 'passages à zéro' à des positions fortement irrationnelles. Ces passages à zéro sont très difficiles à calculer sans être un expert en mathématiques. Pour faciliter le réglage d'un filtre en nombre de 'lobes', un autre réglage spécial a été créé, « [-define](https://imagemagick.org/command-line-options/#define) filter:lobes=_{integer}_ ». Si le filtre est utilisé par un opérateur de rééchantillonnage d'image bidimensionnel tel que l'opérateur de distorsion générale, qui utilise généralement Jinc() comme fonction de base, il consultera une table des 20 premiers passages à zéro du filtre, et fixera le réglage de 'support' à cette valeur. Cela signifie que vous n'avez pas à essayer de trouver le réglage de support approprié pour la fonction Jinc() ; il suffit de spécifier le nombre de lobes que vous voulez utiliser. C'est pourquoi il vaut mieux spécifier les filtres Sinc ou Jinc fenêtrés en nombre de 'lobes' que vous voulez qu'ils contiennent, plutôt qu'un réglage de 'support' plus direct. Si ni la fonction Sinc() ni la fonction Jinc() ne sont utilisées pour la définition du filtre, alors le réglage « filter:lobes » est utilisé pour calculer le réglage de 'support' approprié à l'usage du filtre. Notez cependant qu'un réglage « filter:support » outrepasse tout réglage « filter:lobes » donné, il vaut donc mieux ne définir que l'option expert « filter:lobes », surtout si vous utilisez l'opérateur de distorsion générale.

Filtre Lagrange

Tout comme le filtre « [Gaussian](#gaussian) » est une fonction lente mathématiquement (non que cela affecte beaucoup la vitesse globale grâce à la mise en cache des résultats par IM), les filtres Sinc/Jinc fenêtrés sont encore plus lents et plus complexes à calculer, du fait de la nécessité de calculer des fonctions trigonométriques pour les fonctions de pondération comme de fenêtrage. Le filtre « Lagrange », en revanche, génère une fonction polynomiale cubique par morceaux pour approximer un filtre fenêtré. (Voir Wikipedia : polynôme de Lagrange). Tout comme les filtres fenêtrés sont ajustables selon le réglage de support, le filtre « Lagrange » s'ajuste lui aussi selon ce réglage. Le réglage de support par défaut de 2.0 génère un filtre « Lagrange » (ordre 3). Ce filtre est plutôt bon à la fois pour l'agrandissement et la réduction des images, avec des effets minimaux de blocs et de rebond et sans effets de flou. | _Lecontrôle expert de support définit en réalité l'« ordre » du filtre Lagrange à utiliser. C'est-à-dire que le filtre Lagrange à support 2.0 par défaut génère un filtre Lagrange d'ordre 3 (ordre = support × 2 - 1, donc support=2.0 => filtre Lagrange-3). C'est pourquoi vous ne pouvez réellement utiliser qu'un réglage par pas d'un demi-entier.

Ainsi, pour obtenir un filtre Lagrange d'ordre 4, vous utiliseriez l'option_ -define filter:support=2.5
---|---
[IM Output] Avec des réglages de support plus grands, le filtre « Lagrange » génère des filtres Sinc fenêtrés sans nécessiter de calcul de fonction trigonométrique complexe, ni même de fonctions de fenêtrage supplémentaires. Plus le réglage de support est grand, plus le filtre émule fidèlement une fonction Sinc(), mais plus le calcul est lent aussi. (voir le graphe de filtres Lagrange à plus grand support à gauche).
[IM Output] Avec des réglages de support plus petits, le filtre « Lagrange » émule la plupart des divers filtres interpolés. C'est-à-dire qu'une taille de support de « 0.5 » génère le filtre « Box », et « 1.0 » un filtre « Triangle ». Le réglage de support est limité aux ajustements par demi-entiers, et utiliser tout autre facteur de support n'est pas très productif.
[IM Output] Les autres filtres Lagrange à support demi-entier (générant des ordres pairs) produisent un ensemble de pondérations de filtre très disjoint et, à l'instar du filtre « Box », ils peuvent produire de forts artefacts de blocs au redimensionnement. En revanche, pour un redimensionnement à petite échelle, cela peut garantir que les images restent nettes pour de très petits ajustements de redimensionnement. Ces filtres « Lagrange » d'ordre 'pair' mettent en évidence le principal inconvénient de ce filtre, à savoir que la fonction de pondération n'est pas un dégradé 'lisse'. Dans les agrandissements à grande échelle, cela signifie que vous pouvez obtenir des changements visibles dans le dégradé généré. C'est toutefois rarement un problème, sauf dans ces cas extrêmes. Fondamentalement, il représente un filtre qui crée universellement une forme appropriée au réglage de 'support' courant, quelle que soit la taille de ce réglage, grand ou petit. C'est un filtre de redimensionnement auto-fenêtrant. | Le filtre « [Lagrange](#lagrange) » n'a été pleinement défini et utilisable qu'à partir de la version IM v6.3.7-1.
---|---

Filtres cubiques

À mesure que de nombreux experts en imagerie cherchaient un filtre meilleur et plus rapide à calculer pour le redimensionnement d'image, une famille de filtres a évolué et est devenue connue sous le nom de filtres cubiques. Ils ressemblent beaucoup aux filtres Lagrange présentés précédemment, et étaient constitués d'un plus petit ensemble fixe de sections par morceaux. Cependant, contrairement aux filtres Lagrange, les morceaux étaient conçus pour s'ajuster ensemble afin de former une courbe lisse, réduisant ainsi les effets de blocs marqués. [IM Output] Le graphe à gauche montre quatre de ces filtres cubiques 'lisses' prédéfinis dans IM, et bien connus pour être utilisés comme filtres de redimensionnement. Le filtre « Spline » (aussi utilisé comme alias et réglages par défaut de la fonction de filtre « Cubic » générale) émule un filtre de flou Gaussian. Cette courbe est aussi connue sous le nom de courbe d'interpolation 'B-Spline', et est également couramment utilisée pour tracer des lignes lisses à travers un ensemble de points. Elle est aussi souvent utilisée pour les mouvements de caméra et d'objets dans les animations, afin de produire un flux régulier à travers les points de contrôle fournis par l'utilisateur. On montre aussi « Catrom », ou plus exactement le 'filtre Catmull-Rom' ou la 'convolution cubique de Keys', qui génère une forme lisse et non floutante de filtre d'interpolation. Il peut cependant légèrement dépasser. C'est essentiellement un filtre auto-accentué idéal, et à ce titre aussi la fonction couramment utilisée pour l'interpolation bicubique de base. Et enfin le filtre cubique « Hermite », qui est un type de filtre d'interpolation triangulaire lissé, qui ralentit (décroît) en douceur aux coordonnées d'entrée. Fondamentalement, il arrondit les bords marqués tout en préservant les 'niveaux de couleur' plats de l'image d'origine.

Familles de filtres cubiques

Ce qui précède sont les filtres 'nommés' les plus courants des courbes cubiques, mais ils appartiennent aussi à des familles spécifiques de filtres cubiques. La famille 'B-Spline' des cubiques équivaut essentiellement à divers degrés de flou des résultats. Cela va typiquement du filtre « Spline » très flou, aux résultats à bords arrondis mais en blocs du filtre « Hermite ». Puis il y avait la famille 'Cardinal', qui produit des filtres faisant un compromis entre les artefacts de blocs et de rebond, et dont le 'filtre Catmull-Rom' (« Catrom ») a évolué comme un compromis équilibré de ces artefacts. Ces deux familles ont ensuite fusionné pour former la famille de filtres cubiques de Keys, qui reliait le 'filtre Catmull-Rom' (Keys α = 0.5) au 'filtre cubique B-Spline' (Keys α = 0.0). La famille de filtres de Keys a aussi la propriété spéciale de préserver tout dégradé linéaire (affine) pouvant exister à travers l'image. Les effets de rebond et de flou d'un filtre de la famille Keys n'entreraient en jeu que lorsqu'une image contient de forts changements de couleur, plutôt que des dégradés de couleur lisses. Perdu dans cette variété ? Bien sûr que oui. Tout le monde l'était ! Le problème est que les résultats des filtres sont souvent très subjectifs, dépendant de l'image, et des restrictions de la 'famille' que vous utilisez. Ce qui fait un bon filtre dépendait vraiment de la personne à qui vous demandiez, du fait que vous agrandissiez ou réduisiez, et de l'image que vous traitiez. À certains égards, c'est toujours le cas, déroutant. Il m'a fallu plus de deux ans à tâtonner, lire et jouer avec les divers filtres pour arriver au début de ce résumé, et même maintenant il évolue encore. Le redimensionnement d'image est un domaine très subjectif, difficile (en fait, il s'est avéré impossible) à quantifier d'une quelconque manière réelle. Il n'existe pas de redimensionnement 'parfait'.

Filtre Mitchell-Netravali

Là-dessus, Don P. Mitchell et Arun N. Netravali ont publié un article, 'Reconstruction Filters in Computer Graphics', qui formulait deux variables connues sous les noms de 'B' (comme utilisé pour les courbes 'B-spline') et 'C' (comme utilisé pour les courbes 'Cardinal' et équivalent à la valeur α du filtre 'Keys'). Avec ces deux valeurs, vous pouvez générer n'importe quel filtre cubique par morceaux s'ajustant en douceur (dérivée première continue). [IM Output] Plus important encore, ils ont ensuite sondé un groupe de 9 experts en traitement d'image, plutôt que de se fier à leur seule opinion, pour classer les artefacts produits par un léger agrandissement d'images à l'aide de diverses valeurs de B et C. Les résultats de ce sondage sont montrés dans le diagramme recréé à droite. La zone 'verte' représentait les valeurs que les experts jugeaient produire un résultat acceptable, tandis que les diverses autres zones produisent les différents types d'artefacts. Cette image est importante, car elle montre vraiment les relations entre les divers artefacts et les différents types de filtres qui peuvent être produits. Vous pouvez aussi voir d'après les résultats pourquoi la famille de filtres 'Keys' est devenue si importante, comme l'une des meilleures méthodes de génération de bons filtres cubiques. Ses filtres tombaient en gros sur une ligne traversant directement la zone jugée 'acceptable' par les experts en traitement d'image. À partir de ce sondage, Mitchell et Netravali ont déterminé que le meilleur filtre était un filtre de la famille 'Keys', qui tombait au milieu de la zone acceptable, avec des valeurs B,C de 1/3,1/3. Ce filtre est maintenant connu sous le nom de 'filtre Mitchell-Netravali' et est disponible dans IM comme réglage de filtre « Mitchell ». Fondamentalement, c'est un compromis de tous les artefacts de redimensionnement. C'est aussi le filtre par défaut utilisé pour les agrandissements d'image d'IM. Tous les filtres cubiques 'nommés' intégrés : « Mitchell », « Robidoux », « Catrom », « Spline » et « Hermite », ont aussi été marqués dans le diagramme ci-dessus, montrant ce que ces experts penseraient de ces filtres spécifiques. On montre aussi les lignes représentant les familles de filtres 'B-Spline', 'Cardinal' et 'Keys'. En interne, tous ces filtres ne diffèrent que par les réglages B,C prédéfinis du filtre ; en fait, IM utilise la même fonction interne pour générer tous les filtres cubiques, seulement avec des réglages B,C différents pour définir ces filtres.

Contrôles experts B,C cubiques

Vous pouvez utiliser les réglages experts spéciaux pour définir les réglages B,C qu'utilise un filtre cubique. Pour cela, vous devez sélectionner la 'fonction' de filtre « Cubic » générale (ou n'importe lequel des autres filtres cubiques nommés), et les réglages experts « b » et « c » désirés. Par exemple...

   -filter Cubic
   -define filter:b=_value_
   -define filter:c=_value_

Les réglages experts outrepasseront les valeurs par défaut internes du filtre donné lorsqu'il est utilisé par un opérateur de redimensionnement ou de distorsion. Ainsi, l'ordre des options ci-dessus n'a pas d'importance, tant que vous avez « [-define](https://imagemagick.org/command-line-options/#define) » ou « [-set](https://imagemagick.org/command-line-options/#set) » tous les réglages experts globaux désirés avant l'usage de l'opérateur de traitement d'image. Si l'un des réglages « b » ou « c » n'a pas été défini ou fixé, sa valeur sera calculée à partir de l'autre en supposant que vous voulez un filtre de la famille 'Keys' (le long de la ligne pointillée dans le diagramme du sondage Mitchell-Netravali). Rappelez-vous que « c » équivaut au réglage α de Keys, tandis que « b » peut être vu comme un réglage de 'flou' de spline cubique. Ces réglages experts offrent aux utilisateurs un bon moyen de 'régler finement' leur redimensionnement d'image pour obtenir exactement ce qu'ils veulent (qu'ils utilisent Resize ou Distort). Le réglage « b » est le plus facile des deux à comprendre. Pensez simplement à 'b' comme à 'blur' (flou). Une valeur de b=0 est le filtre très net (Catmull-Rom), qui tend à produire un halo négatif de rebond et quelques effets de crénelage ou de moiré. Une valeur de b=1 tend à produire un effet excessivement flou (le Spline ou de type Gaussian). Cela permet aux experts (ou même aux utilisateurs normaux) d'ajuster facilement cette valeur pour trouver un filtre qui leur 'convient'. À droite se trouve une table des valeurs B,C pour les filtres cubiques spécifiquement 'nommés'. Rappelez-vous que « Hermite » est le seul filtre cubique intégré qui ne fait pas partie de la famille de filtres 'Keys'. Il a aussi le plus petit support (« 1.0 ») de tous les filtres cubiques BC, et ne contient pas de lobe négatif. Les filtres « [Robidoux](#robidoux) » et « [RobidouxSharp](#robidoux_sharp) » sont très similaires à « Mitchell », mais plutôt que le résultat d'un sondage, ils ont été déterminés mathématiquement pour un usage spécial comme filtre cylindrique. Le filtre « [Robidoux](#robidoux) » est le filtre par défaut utilisé par l'opérateur de distorsion générale (voir ci-dessous). | | | Filtre | B
blur | C
Keys α
---|---|---
Hermite | 0.0 | 0.0
Spline | 1.0 | 0.0
Catrom | 0.0 | 1/2
Mitchell | 1/3 | 1/3
Robidoux | 0.3782 | 0.3109
Robidoux
Sharp | 0.2620 | 0.3690
Robidoux
Soft | 0.6796 | 0.1602
| Le filtre de fenêtrage « Parzen » utilise un filtre « Spline » comme fonction de fenêtrage. Vous pouvez donc redéfinir ce filtre de fenêtrage en termes d'options experts B,C. L'utilité de la chose, et l'effet que cela a sur le Sinc (ou Jinc) fenêtré résultant, sont inconnus et non recommandés.
---|---

Filtres cylindriques - pour Distort

Comme nous l'avons déjà évoqué à plusieurs reprises, l'opérateur de distorsion utilise le réglage de filtre pour rééchantillonner les images d'une manière légèrement différente de l'opérateur de redimensionnement. Plus précisément, Distort applique le filtre en utilisant la distance 'radiale' entre le 'point d'échantillonnage' et les pixels réels situés dans la zone d'échantillonnage de l'image source, pour déterminer les pondérations de chaque pixel et donc la couleur finale au point d'échantillonnage. Resize, en revanche, traite l'image deux fois à l'aide de filtres alignés orthogonalement. Une fois dans la direction X, puis de nouveau dans la direction Y ; il est donc limité au redimensionnement rectangulaire simple des images, et n'implique pas l'usage de pixels virtuels. Autrement dit, Distort applique les filtres pour produire des formes « cylindriques » plutôt que des formes 'Box', afin de permettre des distorsions libres des images, y compris des rotations et une mise à l'échelle variable (étirement et compression) dans n'importe quelle direction, pas seulement le long de l'axe X ou Y.À cause de cela, les filtres eux-mêmes ont souvent besoin d'être ajustés, ou sont conçus spécifiquement pour ce type d'usage.

Filtres cylindriques interpolés

Ici, j'utilise un filtre « [Box](#box) » pour agrandir 30 fois une image d'un seul pixel, à l'aide des opérateurs équivalents Resize et Distort.

  magick xc:  -bordercolor black -border 1 \
          -filter Box   -resize 3000%      dot_resize_box_black.png
  magick xc:  -bordercolor black -border 1 \
          -filter Box   +distort SRT 30,0  dot_distort_box_black.png

[IM Output]
Resize | [IM Output]
Distort
---|---

Comme vous pouvez le voir, lorsque le filtre « [Box](#box) » est utilisé comme filtre cylindrique, vous obtenez un cercle (ou un cylindre en 3 dimensions). Cependant, en raison de la façon dont le filtre est traité, vous obtenez certaines zones où deux pixels sont échantillonnés (à parts égales) pour produire un gris médian parfait. Vous pouvez concevoir un filtre box cylindrique comme convertissant l'image source en tout un ensemble de pixels circulaires qui se chevauchent et sont mélangés (non additionnés) ensemble. Voici un exemple plus coloré des résultats de l'expansion d'une image à l'aide d'un filtre 'Box cylindrique' pour l'agrandissement... |

  magick \( xc:red   xc:white xc:black +append \) \
          \( xc:blue  xc:lime  xc:white +append \) \
          \( xc:black xc:red   xc:blue  +append \) -append \
          -filter Box   +distort SRT 30,0  color_box_distort.gif

[IM Output]
Avec une image distordue, ces pixels circulaires sont eux aussi distordus en un ensemble d'ellipses qui se chevauchent. Par exemple... |

  magick \( xc:red   xc:white xc:black +append \) \
          \( xc:blue  xc:lime  xc:white +append \) \
          \( xc:black xc:red   xc:blue  +append \) -append \
          -alpha set -virtual-pixel transparent -filter Box \
          +distort Perspective '0,0 0,0  0,3 0,90 3,0 90,30 3,3 90,60' \
          color_box_distort.png

[IM Output]
| _Le 'rayon' de support d'un filtre « Box » cylindrique est augmenté de « 0.5 » à « 0.707 » (sqrt(2)/2). Cela garantit que le filtre trouvera toujours au moins un pixel source dans la zone d'échantillonnage circulaire (en diagonale). C'est la taille de support pratique minimale pour tout filtre cylindrique.

Aucun autre filtre n'a ce problème de couverture, nécessitant une augmentation du support._
---|---
| _Si le support n'est pas d'au moins « 0.707 », alors vous pouvez obtenir des zones de votre image dans lesquelles le filtre 'rate' tous les pixels sources, et produit ainsi un échec de rééchantillonnage.

Utiliser un réglage de support plus grand produit aussi des motifs intéressants. À mesure que les 'cercles' s'agrandissent, davantage de pixels seront mélangés ensemble. Par exemple..._ | |

  magick \( xc:red   xc:white xc:black +append \) \
          \( xc:blue  xc:lime  xc:white +append \) \
          \( xc:black xc:red   xc:blue  +append \) -append \
          -filter Box -define filter:support=0.83 \
          +distort SRT 30,0  color_box_distort_overlap.png

[IM Output]
_Le résultat est une sorte de forme circulaire d'uneinterpolation Blend.

À un support de 1.0 ou plus, chaque rééchantillonnage sera un mélange 'box' ou 'moyenne' d'au moins deux pixels.

_

Voici une comparaison d'un certain nombre de filtres d'interpolation. Des gris sont utilisés afin que vous puissiez voir les dépassements et sous-passements. La ligne du haut utilise un redimensionnement orthogonal, tandis que la ligne du bas utilise une distorsion cylindrique.

  for filter in box triangle hermite lagrange catrom
  do
    magick xc:gray80  -bordercolor gray20 -border 2 \
            -filter $filter   -resize 2000%      dot_resize_$filter.png
    magick xc:gray80  -bordercolor gray20 -border 2 \
            -filter $filter   +distort SRT 20,0  dot_distort_$filter.png
  done

[IM Output]
[IM Output]
Box | [IM Output]
[IM Output]
Triangle | [IM Output]
[IM Output]
Hermite | [IM Output]
[IM Output]
Lagrange | [IM Output]
[IM Output]
Catrom
---|---|---|---|---

Vous pouvez voir comment les résultats sont similaires mais avec différents styles d'artefacts générés, à la fois en interne et en externe (rebond), par les deux façons différentes dont le filtre est appliqué. Les artefacts internes sont particulièrement évidents dans le filtre « Triangle ». Rappelez-vous cependant que les filtres d'interpolation ne sont pas particulièrement bons pour la réduction (le rétrécissement) extrême des images distordues, mais qu'ils sont très bons pour l'agrandissement.

Gaussian cylindrique

Le seul filtre qui ne produit aucune différence de résultats entre les formes orthogonale ('resize') et cylindrique ('distort') est le filtre spécial « [Gaussian](#gaussian) »... |

  magick xc:red -bordercolor yellow -border 1 \
          -filter Gaussian   +distort SRT 33,0  -normalize  dot_distort.jpg

[IM Output]
C'est en réalité l'une des propriétés spéciales de ce filtre (connue sous le nom de séparabilité), et l'une des raisons pour lesquelles de nombreuses implémentations de rééchantillonnage cylindrique l'utilisent comme filtre par défaut. C'était le filtre par défaut de l'article EWA original, mais il est aussi très flou dans ses résultats. ImageMagick l'utilisait aussi lorsque les distorsions ont été implémentées pour la première fois, mais plus maintenant. Tout comme pour le redimensionnement orthogonal, un filtre « Gaussian » ne produira absolument aucun artefact de crénelage dans l'image résultante, même lorsque vous l'appliquez à la fameuse image 'rings'. Mais le prix en est un résultat flou, même si peu ou pas de distorsion est réellement en jeu. De même, comme indiqué dans la discussion sur le contrôle expert Sigma, vous pouvez aussi utiliser ce filtre comme un type de filtre interpolé. | _Depuis IM v6.6.5-0, IM n'utilise plus ce filtre par défaut pour lesdistorsions d'image. À la place, un autre filtre, le filtre « [Robidoux](#robidoux) », spécifiquement conçu pour produire un résultat plus net, est utilisé.

Quoi qu'il en soit, avant cette version, les distorsions étaient aussi très floues à cause d'une erreur dans son implémentation. Mettez à jour si vous avez une version plus ancienne et souhaitez utiliser les distorsions d'image.

_
---|---
| _Avant IM v6.6.7-6, IM utilisait une valeur 'sigma' légèrement plus grande pour un Gaussian cylindrique, de 1/sqrt(2) soit environ 0.707, au lieu de 1/2. Cela produisait un résultat légèrement plus flou, dont le but était de réduire les possiblesartefacts de crénelage.

C'était une erreur, créée en suivant la recommandation d'articles de recherche, en passant le support plus grand d'un filtre Box cylindrique au filtre Gaussian. Le raisonnement avancé était qu'un Gaussian est essentiellement une boîte floutée. Ce n'est pas le cas. Un Gaussian est une impulsion floutée, non une boîte floutée. Cette version a supprimé cette erreur, ce qui signifie maintenant que vous devriez obtenir des résultats équivalents avec resize ou distort, lorsque le filtre gaussian est utilisé.

Je trouve personnellement qu'utiliser cette valeur sigma légèrement plus grande lisse effectivement tous les artefacts de 'blocs' le long des bords diagonaux crénelés lors des agrandissements de dessins au trait. Mais c'est un cas particulier.

_
---|---

Filtres cylindriques Jinc fenêtrés

[IM Output] La fonction Jinc() (parfois appelée à tort filtre « Bessel ») est l'équivalent 'Sinc' pour l'usage avec une opération de filtrage cylindrique. Bien que très similaire et étroitement liée à Sinc(), elle est conçue pour filtrer un tableau rectangulaire de valeurs en utilisant une distance radiale ou cylindrique, plutôt que seulement dans des directions orthogonales (alignées sur les axes). Si vous regardez le graphe fourni de la fonction Jinc(), vous constaterez que son premier 'passage à zéro', représentant le premier anneau de proches voisins, tombe entre les valeurs de 1.0 (pour les voisins orthogonaux) et la racine carrée de 2. C'est-à-dire que le passage à zéro a une valeur approximative de « 1.2196699 ». La fonction Jinc() fonctionne ainsi : si le point d'échantillonnage est égal à une valeur de pixel réelle, la fonction Jinc() assignera une valeur positive aux pixels voisins orthogonaux légèrement plus proches, mais ensuite une valeur négative similaire aux voisins diagonaux légèrement plus éloignés, et ainsi de suite à mesure qu'elle avance dans le tableau bidimensionnel de valeurs. Il en résulte que, lorsqu'aucune mise à l'échelle (distorsion) n'est effectuée, les contributions des voisins devraient, en théorie, s'annuler mutuellement. C'est pourquoi le filtre Jinc est mathématiquement la solution préférée pour le rééchantillonnage cylindrique d'un tableau carré, et donc le filtre 'idéal' pour la méthode de rééchantillonnage elliptique (EWA) de Distort. Cela ne veut pas dire que c'est un filtre 'parfait' du point de vue humain. À cause de cela, sélectionner n'importe quel filtre fenêtré tout en utilisant l'opérateur de distorsion substituera à la fonction « Sinc() » normale la fonction « Jinc() » équivalente. Comme la fonction Jinc() a des passages à zéro à des positions non entières, il est très important de spécifier le support des filtres en termes du réglage spécial de support en lobes introduit plus haut pour les filtres Sinc fenêtrés. Le plus gros problème avec l'usage d'un filtre 'Jinc fenêtré' survient lorsque l'image source contient un motif de hachures au niveau des pixels (comme celui fourni par « pattern:gray50 », voir Motifs intégrés). Dans cette situation, tous les voisins orthogonaux sont différents des voisins diagonaux, et par conséquent l'image devient fortement floutée par la fonction « Jinc() ». Cependant, presque tout autre motif, comme des lignes, des bords, des coins, reste net et clair lors de l'usage d'un filtre 'Jinc fenêtré', ce qui en fait tout de même une bonne fonction à utiliser. Ce 'problème' peut être une bonne chose, car il signifie qu'un filtre cylindrique bidimensionnel dérivé de Jinc peut être utilisé comme méthode de suppression des forts motifs de hachures de pixels des images, comme ceux générés par un tramage de réduction de couleurs, sans trop affecter la netteté du reste de l'image. Autrement dit, il pourrait être utilisé comme 'méthode de suppression du tramage' (voir ci-dessous).

Distort et les filtres dans le cas 'sans effet'

Idéalement, une distorsion 'sans effet' devrait renvoyer exactement la même image. Mais, comme vous l'avez vu dans les exemples précédents, cela peut ne pas se produire réellement. Les filtres de redimensionnement (unidimensionnels en 2 passes) : Lanczos (Sinc-Sinc), Lanczos2, Catrom, Hermite, Triangle, et bien d'autres filtres de redimensionnement, ont cette propriété. Le motif de pixels est préservé exactement si l'image n'est pas mise à l'échelle. En revanche, les filtres de lissage ou de flou, comme Gaussian, Cubic et Quadratic, flouteront une image s'ils sont appliqués à un cas presque 'sans effet'. Notez que même le filtre de redimensionnement par défaut, Mitchell-Netravali, contient lui aussi un certain flou, car c'est fondamentalement un mélange du filtre de lissage 'Cubic' B-spline et du filtre Catmull-Rom, équivalent Sinc cubique à deux lobes. | _L'opérateur de redimensionnement se court-circuitera par défaut, de manière à ne rien faire dans le cas 'sans effet'. Ainsi, à moins de spécifier explicitement un filtre, vous ne pouvez pas générer un redimensionnement 'sans effet'.

Distort ne se court-circuitera jamais dans le cas 'sans effet', et c'est pour garantir la cohérence des animations dans lesquelles la mise à l'échelle de la distorsion peut passer par le cas 'sans effet'. C'est quelque chose qui n'est typiquement pas une préoccupation avec resize.

_
---|---
Alors que de nombreux filtres de redimensionnement préservent les images dans le cas 'sans effet', les méthodes cylindriques (distort) ne produiront pour ainsi dire jamais une distorsion 'sans effet' parfaite. Toute distorsion 'sans effet' distordra au moins minimalement les couleurs d'une image, même si l'image elle-même n'est pas distordue. Ce qui se passe, c'est qu'en utilisant un filtre cylindrique, la contribution des pixels du voisinage orthogonal sera différente de celle des pixels du voisinage diagonal. Ils sont essentiellement à des distances différentes du point de recherche (centré sur un pixel réel dans le cas 'sans effet'). La fonction 'Jinc' essaie de réduire cette distorsion de couleur en annulant les contributions des voisins orthogonaux avec celles des voisins diagonaux. Cela fait d'ailleurs partie de sa définition mathématique. Dans le pire des cas, une 'hachure au niveau des pixels', chaque pixel voisin diagonal est différent de chaque pixel voisin orthogonal. Dans ce cas, les pondérations du filtre renforceront plutôt qu'elles n'annuleront les contributions. Il en résulte que ce type d'image tendra à produire de très graves distorsions de couleur pour une distorsion 'sans effet' de toute image contenant une 'hachure au niveau des pixels'. Ici par exemple, j'utilise réellement cette propriété spéciale pour supprimer un motif de hachures d'une image. Aucune mise à l'échelle n'est utilisée, juste une 'convolution' bidimensionnelle appliquée par distorsion à l'image.

  magick -size 100x100 pattern:gray50  hash.png
  magick hash.png -filter Lanczos -distort resize 100% hash_removed.png

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

| _La raison pour laquelle le niveau de gris perçu de la hachure est bien plus sombre que le niveau de gris global de la hachure tient à la façon dont fonctionne laperception humaine des couleurs.

La solution consiste à inclure « -set colorspace RGB » dans ce qui précède pour indiquer à IM que nous redimensionnons dans l'espace colorimétrique RGB linéaire. Voir Redimensionnement avec correction d'espace colorimétrique.

_
---|---
Ce qui précède est en réalité équivalent à une convolution avec une fonction de noyau de type Jinc. Mais comme vous pouvez le voir, la propriété spéciale de la fonction Jinc (dans ce cas EWA Lanczos, ou Jinc fenêtré par Jinc) a complètement supprimé le motif de hachures fortement présent dans l'image d'origine. La seule partie où il subsiste maintenant est le long des bords, où l'« abîme » (aucune contribution de pixel virtuel) qui entoure l'image proprement dite peut affecter les résultats. Le nombre réel de lobes d'un filtre Jinc fenêtré a lui aussi une énorme influence sur les résultats. Avec 2 lobes, une 'hachure au niveau des pixels' a tendance à être préservée, quoique ternie ou floutée. |

  magick hash.png -filter Lanczos2 -distort resize 100% hash_2_lobes.png

La contribution de la méthode de fenêtrage appliquée à la fonction Jinc aura elle aussi une influence majeure sur cet effet. Dans certains cas, elle peut même renforcer davantage le motif de hachures. [IM Output]
La question se pose alors de savoir comment régler les filtres de distorsion afin de minimiser les distorsions de couleur générées par le filtre pour une distorsion 'sans effet'. La façon dont Nicolas Robidoux a décidé de le faire a été de sélectionner un flou (remise à l'échelle du support du noyau du filtre) qui tend à préserver autant que possible les bords orthogonaux.

Filtre Lanczos cylindrique

Or, comme discuté ci-dessus, « Lancoz » est normalement défini comme une fonction « Sinc() » utilisée à la fois pour la pondération et le fenêtrage du filtre. Mais lorsqu'il est utilisé comme filtre cylindrique EWA, les DEUX fonctions de pondération seront remplacées par la fonction « Jinc() ». C'est-à-dire que non seulement la fonction de pondération est remplacée (comme pour les autres filtres fenêtrés linéaires), mais elle remplace aussi la fonction de fenêtrage, produisant une pondération Jinc fenêtrée par Jinc. Ainsi, un 'Lanczos cylindrique' sélectionnera un « Jinc fenêtré par Jinc » avec le même nombre de lobes (par défaut 3). Cette technique a d'abord été préconisée par Andreas Gustafsson, dans sa thèse sur la déformation (locale) interactive d'image (page 24). Il utilisait spécifiquement un Lanczos cylindrique à 2 lobes (Jinc fenêtré par Jinc) qu'il a nommé « Lanczos2D » (voir ci-après). C'était simplement une extension évidente pour la situation planaire (EWA). D'où l'usage du même nom. Pour plus d'informations à ce sujet, voir ce message dans la discussion BC-splines.

Lanczos2 - Lanczos à 2 lobes

Pour plus de commodité, cette version à deux lobes, simplement nommée « **Lanczos2** », a été incluse dans IM v6.6.4-10, spécialement pour l'usage dans les distorsions. C'est en réalité juste un filtre « Lanczos » cylindrique (Jinc-Jinc) avec un réglage expert « filter:lobes=2 ». Voir le graphe ci-dessus, et comme le filtre IM bascule automatiquement entre les fonctions Sinc() et Jinc() selon le cas, ce n'est pas uniquement pour un usage '2D' (cylindrique). Il peut aussi être utilisé pour le redimensionnement (comme fonction Sinc-Sinc), bien que je ne le recommande pas car il est probablement un peu trop petit, et devient pratiquement équivalent aux diverses autres fonctions cubiques.

LanczosSharp - Un Lanczos légèrement accentué

On a observé que fenêtrer une fonction Jinc() conduit à des résultats de distorsion EWA bien plus flous que la fonction Sinc() fenêtrée analogue dans les résultats de redimensionnement orthogonal (en particulier avec les lignes fines). C'était particulièrement le cas pour les distorsions légères. Fondamentalement, la fonction Jinc() a des propriétés particulières, et fenêtrer la fonction Jinc() perturbe ces propriétés spécifiques et désirables. Après quelques calculs, Nicolas Robidoux, professeur de mathématiques à l'Université Laurentienne, a pu élaborer une version légèrement plus nette d'un Lanczos cylindrique à 3 lobes, maintenant disponible sous le nom de « **LanczosSharp** », qui a en partie corrigé le problème pour la distorsion des images. Cependant, le filtre résultant présente toujours le fort flou des motifs de 'hachures' de bas niveau, propre aux filtres cylindriques Jinc fenêtrés.

Lanczos2 accentué

[IM Output] Le même problème était plus grave dans les filtres « Lanzcos2 », c'est pourquoi Nicolas a aussi produit un filtre « **Lanczos2Sharp** » plus net, à l'aide d'un contrôle expert de flou légèrement plus grand. Cela a abouti à un filtre avec seulement un flou minimal pour les lignes verticales ou horizontales dans un cas 'sans distorsion'. Ce filtre accentué entraîne un léger décalage du point zéro, de sorte qu'il se situe maintenant à environ « 1.1684 ». Cela peut ne pas sembler grand-chose, mais cela fait une énorme différence dans la quantité de flou que le filtre génère pour les images présentant peu ou pas de distorsion.

Lanczos Radius

[IM Output] C'est un filtre EWA Lanczos qui est flouté (accentué) de sorte que le nombre de lobes utilisés (3 par défaut) tienne dans un rayon de support entier. C'est-à-dire qu'un EWA Lanczos à 3 lobes (basé sur un Jinc fenêtré) est accentué pour avoir un support de rayon exactement 3. Vous pouvez utiliser le contrôle expert des lobes pour obtenir le même résultat, mais comme cela implique un ajustement basé sur le passage à zéro connu de la fonction Jinc, ce n'est pas un calcul facile à faire. Nicolas a recommandé l'ajout de ce filtre pour que vous n'ayez pas à faire ce calcul, et pour vous permettre de tester ce filtre accentué de manière très spécifique. FUTUR : table des facteurs de flou pour les filtres Jinc fenêtrés par Jinc.
Inclure le nombre de lobes comme référence.

Filtre cylindrique Robidoux

[IM Output] Curieusement, les expériences montraient qu'utiliser un filtre Mitchell-Netravali comme filtre cylindrique produisait des résultats 'nets' quasi équivalents pour le cas 'sans distorsion'. Et pourtant, ce filtre n'a aucune relation avec son usage comme filtre cylindrique, puisqu'il a été sélectionné par une 'étude sociale' pour le filtrage orthogonal (resize). Le filtre « Mitchell » était particulièrement bon pour préserver les motifs de 'hachures de pixels' de bas niveau, que les filtres Jinc fenêtrés normaux détruisaient dans les images filtrées cylindriquement. Nicolas a alors découvert, par une bizarre coïncidence, que « Mitchell » était extrêmement proche de la forme 'accentuée' du filtre « Lanzcos2 » discutée ci-dessus. Cela l'a conduit à développer un filtre cubique de Keys qui préserve parfaitement les lignes verticales (et horizontales). De plus, ce nouveau filtre le fait à un moindre coût de calcul, car une fonction cubique est bien moins coûteuse à calculer qu'une fonction Jinc. Ce filtre cubique a été ajouté à IM sous le nom de filtre « **Robidoux** », à partir d'IM v6.6.5-0, et c'est aussi le filtre par défaut utilisé par Distort et sa méthode de rééchantillonnage pondéré elliptique, spécifiquement en raison de sa propriété de flou minimal pour les images présentant seulement une distorsion minimale. Cela ne veut pas dire que c'est 'le meilleur' filtre à utiliser, et même Nicolas aime utiliser d'autres filtres, mais c'est un très bon compromis, tout comme « Mitchell » est un bon compromis pour le redimensionnement orthogonal (tenseur). J'ai marqué ce filtre sur la « carte des cubiques » générée par le sondage Mitchell-Netravali, afin que vous puissiez voir à quel point il est étroitement lié au filtre « [Mitchell](#mitchell) ». Il ferait en fait un filtre raisonnable, que ce soit pour des images redimensionnées orthogonalement ou distordues cylindriquement.

Filtre cylindrique Robidoux Sharp

Le filtre « **RobidouxSharp** » est une version légèrement plus nette du filtre « [Robidoux](#robidoux) », bien que certains trouvent les résultats trop nets. Il est conçu spécifiquement pour préserver les images contenant des pixels purement noirs et blancs avec le minimum d'erreur, dans le cas 'sans distorsion'. Plus précisément, les pondérations des pixels voisins orthogonaux correspondent exactement aux pondérations négatives des pixels voisins diagonaux dans un cas 'sans distorsion'. Par coïncidence, le filtre « [Mitchell](#mitchell) » tombe presque exactement entre le filtre « [Robidoux](#robidoux) » et le filtre « [RobidouxSharp](#robidoux_sharp) », et tous appartiennent à la famille de filtres Cubic Keys. Ainsi, les utilisateurs peuvent choisir parmi n'importe lequel de ces trois filtres pour contrôler le flou-netteté des résultats dans des situations proches du 'sans distorsion'. Pour les détails de ce filtre, voir la discussion BC-splines sur les forums IM.

Filtre cylindrique Robidoux Soft

Celui-ci a été ajouté bien plus tard, et est très différent des autres filtres cylindriques vus. Oui, il est bien plus flou, afin de le rendre plus utile pour l'agrandissement des images, ce qui lui permet d'éviter certains effets d'escalier sur les photos de bâtiments en brique. Pour plus d'informations à ce sujet, voir ce message dans la discussion BC-splines, ainsi que cette discussion issue d'un forum de traitement photo.

Résumé des filtres cylindriques

Nicolas Robidoux, dans la longue et toujours en cours discussion des forums sur le dimensionnement correct d'un filtre Jinc en EWA, donne ceci comme résumé des filtres cylindriques... Si Robidoux est trop doux et RobidouxSharp trop crénelé, je suggère d'essayer Mitchell (avec distort Resize), qui est à peu près à mi-chemin.

Comme le JPEG met en jeu une transformée en cosinus (discrète), je ne suis pas surpris que les filtres basés sur des considérations de Fourier (les Lanczos et consorts, que ce soit resize avec Sinc ou distort avec Jinc) fassent généralement mieux que ceux basés sur de « bonnes approximations de fonctions lisses » (ceux basés sur les cubiques de Keys : Robidoux, Mitchell, RobidouxSharp, CatRom, que ce soit avec resize ou distort). Cet avantage semble moindre avec les PNG (qui ne détruisent pas l'information via le domaine de Fourier).


Nicolas a bien plus à dire. Tellement qu'il a sa propre section Rééchantillonnage par Nicolas Robidoux, qui est maintenant une page distincte et étendue à part entière.

Magic Kernel Sharp 2013 + 2021

Le Magic Kernel Sharp est un algorithme de redimensionnement d'image développé par John Costella, créé à l'origine en 2013 pour un projet chez Facebook. Il inclut une étape d'accentuation à trois coefficients (taps) qui améliore la netteté de l'image lors du redimensionnement, le rendant à la fois rapide et efficace. Cette version est utilisée par Facebook pour le redimensionnement d'images côté serveur depuis son développement. En 2021, Costella a affiné le Magic Kernel Sharp pour améliorer sa précision, offrant au moins neuf bits de précision et répondant mieux aux exigences d'accentuation. Cette version mise à jour continue d'être employée par Facebook, Instagram et d'autres applications comme le moteur de redimensionnement pica et le compresseur d'images RedKetchup, garantissant un redimensionnement d'image de haute qualité avec une fidélité remarquable.


Contrôles experts de filtre

Dans les diverses sections ci-dessus, j'ai présenté un grand nombre de contrôles 'expert' spéciaux, qui vous permettront de modifier les divers filtres de différentes manières. Vous définissez ces réglages experts à l'aide du réglage Define global (ou de l'option Set équivalente). Un résumé complet de toutes les options experts figure dans la page de référence des options de ligne de commande d'IM pour « [-filter](https://imagemagick.org/command-line-options/#filter) ». Le réglage « [-filter](https://imagemagick.org/command-line-options/#filter) » n'est en fait utilisé que pour rechercher et régler les contrôles experts de manière appropriée afin de définir le filtre de redimensionnement 'nommé' donné. Ces réglages outrepasseront les valeurs par défaut spécifiées ci-dessus, au moment où le filtre est configuré pour une opération de traitement d'image de redimensionnement ou de distorsion spécifique. Le réglage « [-filter](https://imagemagick.org/command-line-options/#filter) » 'Point' contourne complètement toute la configuration de filtre ci-dessus, et se réduit à une recherche directe 'Nearest Neighbor' non mise à l'échelle (resize), ou à une recherche interpolée (distort). Ainsi, ce réglage de filtre nommé désactive en pratique complètement le filtre de recherche d'image mis à l'échelle.
Maintenant, bien qu'ils soient disponibles, j'aimerais faire une dernière remarque.

À moins d'être un expert (ou de simplement vous amuser) -- il vaut mieux NE PAS les utiliser !

Il y a peu de gens experts en traitement d'image, et à moins de savoir exactement ce que font les filtres et comment leur modification affecte la méthode de filtrage, tout ce que vous risquez de faire, c'est de ruiner l'efficacité de votre traitement d'image, et de produire un résultat d'aspect médiocre. Surtout sur des images autres que vos cas de test. Cela ne veut pas dire que les utilisateurs ne devraient pas les utiliser, et beaucoup d'exemples IM en font usage, mais c'est généralement pour produire un effet spécial. Lorsqu'une option spéciale est utilisée, la raison de son usage est aussi expliquée, et vous devriez vous en tenir à la recette donnée pour cet effet. Vous êtes bien sûr libre de les utiliser, et vous pouvez générer des effets très intéressants et fort inhabituels en y ayant recours.

Le contrôle de filtre 'verbose'

Le réglage « filter:verbose » est peut-être votre meilleur ami pour comprendre les autres contrôles de filtre. Par exemple, vous pouvez vérifier que le filtre Lanczos est défini en termes d'un Sinc fenêtré par Sinc de support 3.

  magick null: -filter Lanczos -define filter:verbose=1 \
          -resize 2    null:    | grep '^#'

[IM Text]

Notez qu'en interne, le filtre Lanczos est défini en termes d'un équivalent polynomial rapide 'SincFast' (4 lobes), plutôt qu'une fonction 'Sinc' complète, qui est définie en termes de fonctions trigonométriques de bibliothèque bien plus coûteuses en calcul. Ici, nous voyons que le filtre Lanczos est défini comme un filtre Jinc fenêtré par Jinc lorsqu'il est utilisé comme filtre cylindrique (algorithme EWA) avec « -distort ».

  magick null: -filter Lanczos -define filter:verbose=1 \
          -distort SRT 0   null:   | grep '^#'

[IM Text]

Le réglage « filter:verbose » est le seul moyen pour les utilisateurs de vérifier exactement ce qu'est le filtre résultant final, du fait de l'usage des divers réglages experts. Après l'en-tête des réglages de filtre commenté par '#', un ensemble de points de données générés par le filtre est renvoyé. Ceux-ci sont spécifiquement fournis pour tracer les données du filtre, et vous permettent de vérifier et de contrôler plus avant ce que produit le filtre sans faire de suppositions à partir des résultats sur des images de test. Par exemple, extrayez les données d'un filtre Sinc fenêtré par Welch...

  magick null: -filter Welch -define filter:verbose=1 \
          -resize 2 null:  > filter_welch.dat

Ou la fonction de fenêtrage Welch brute utilisée ci-dessus, avec la fonction de fenêtre mise à l'échelle sur une plage de support de 0 à 1.

  magick null: -define filter:filter=Box \
                -define filter:window=Welch \
                -define filter:support=1.0 \
                -define filter:verbose=1 \
           -resize 2 null:  > window_welch.dat

Vous pouvez ensuite tracer ces données avec la commande « gnuplot » (comme je l'ai fait dans Filtres Sinc fenêtrés ci-dessus)...

  gnuplot
    set grid
    plot "window_welch.dat" with lines

Autres exemples de contrôles experts de filtre

Créer un filtre 'Sinc brut à 8 lobes' peut se faire ainsi...

  -define filter:filter=Sinc
  -define filter:lobes=8

Utiliser la fonction de fenêtrage Blackman directement comme filtre (comme IM le faisait par erreur, avant la v6.3.6-3).

  -define filter:filter=Blackman
  -define filter:support=4.0

La fonction de fenêtrage prend par défaut la valeur 'Box' lorsqu'elle n'est pas définie. Une fonction de fenêtrage 'Box' n'entraîne aucun fenêtrage de la fonction de filtre de base. Par exemple, un filtre 'Gaussian' a par défaut une fonction de fenêtrage 'Box'. Le seul effet d'une fonction de fenêtrage box est un écrêtage de la zone fenêtrée de la fonction. Voir Contrôle expert du support de filtre ci-dessus. Forcer l'usage d'une fonction Jinc brute (en réglant explicitement le fenêtrage 'Box') ainsi...

  -define filter:filter=Jinc
  -define filter:window=Box
  -define filter:lobes=3

Un filtre 'Lanczos' fenêtré à 12 lobes, écrêté aux 8 premiers lobes seulement du filtre fenêtré résultant...

  -filter Lanczos
  -define filter:win-support=12
  -define filter:support=8

Cela le rend environ quatre fois plus rapide, en ignorant (écrêtage du support à 8) la 'queue' modulée par la fenêtre (jusqu'à 12) du filtre Sinc fenêtré résultant. Cela peut toutefois entraîner quelques artefacts supplémentaires, mais mineurs, du fait de l'écrêtage du support. Utiliser Gaussian pour 'flouter' une image ! C'est équivalent à une opération -gaussian 5x2, mais en utilisant une distorsion 'sans effet' !

  -filter Gaussian
  -define filter:sigma=2
  -define filter:support=5
  -distort SRT 0

Note : vous ne pouvez pas utiliser -resize pour cela, car il peut court-circuiter l'opération et faire qu'elle n'est pas du tout effectuée. Créez un filtre différent à partir du sondage 'Mitchell-Netravali'.

  -filter Cubic
  -define filter:b=0.5
  -define filter:c=0.5

Créez votre propre filtre 'Keys Cubic' avec une valeur α de 0.4...

  -filter Cubic
  -define filter:c=0.4

Nicholas Robidoux créant ce filtre étrange en explorant les 'filtres EWA interpolants'

  -define filter:blur=.7071067811865475
  -define filter:c=.49257366
  -define filter:b=2.089813051319261
  -filter Cubic

Lorsqu'il est utilisé pour agrandir des images. Les pixels sont convertis en motifs en forme de losange, selon un schéma similaire à Blend mais en utilisant des losanges au lieu de carrés. Tout usage des options experts est à vos propres risques. Elles ne sont pas destinées à un usage en production, mais comme méthode d'exploration ou de production de fonctions de redimensionnement délicates ou autrement impossibles. À utiliser à vos risques et périls !

Résumé des filtres de redimensionnement

Ce qui suit est mon opinion personnelle, après avoir étudié, recodé et documenté tous les filtres ci-dessus disponibles dans ImageMagick. Si vous pensez que je me trompe, ou souhaitez exprimer votre opinion, je vous invite à faire part de vos vues sur le forum IM, et à m'inviter à y répondre. Les filtres d'interpolation, comme « Hermite », sont idéaux pour agrandir fortement les images, produisant un minimum de flou dans le résultat final, bien que la sortie puisse souvent être accentuée artificiellement davantage en post-traitement. Les filtres de flou de type Gaussian, comme « Mitchell », fonctionnent le mieux pour les images constituées essentiellement de dessins au trait et d'images de type dessin animé. Vous pouvez contrôler les effets de flou par rapport aux effets de crénelage du filtre sur l'image à l'aide du réglage spécial de flou de filtre. Les filtres Sinc/Jinc fenêtrés, et l'équivalent Lagrange, sont les meilleurs filtres à utiliser avec des images du monde réel, et surtout pour réduire les images. Tous donnent des résultats de base très similaires. Un support plus grand, ou mieux encore un réglage du nombre de lobes, produira généralement un résultat encore meilleur, bien que vous puissiez obtenir davantage d'effets de rebond aussi, mais à un coût de calcul plus élevé. Les filtres cubiques sont un ensemble hétéroclite de filtres rapides et simples, à support fixe (généralement 2.0), qui produit de tout, du filtre d'interpolation lisse « Hermite », au « Mitchell » évalué qualitativement pour les agrandissements d'image, au filtre « Spline » de type Gaussian très flou, ou à un filtre net de type Sinc fenêtré utilisant « Catrom ». En général, si les résultats du redimensionnement sont acceptables tels quels, laissez les choses en l'état, car vous êtes plus susceptible d'aggraver les choses que de les améliorer.

Comparaison des filtres

Agrandissement... Pour donner une comparaison finale, je présente ici une sélection de 12 filtres de redimensionnement représentatifs. L'image est l'agrandissement d'une marche crénelée dans une ligne d'un pixel de large, sur un fond gris foncé. L'image d'origine elle-même est 'crénelée', vous devriez donc pouvoir voir dans quelle mesure les divers filtres suppriment les effets de crénelage existants.

  magick -size 10x6 xc:grey20 +antialias -draw 'fill white line 4,0 5,5' \
          -filter {_filter_type_} -resize 100x   {_result_}

[IM Output]

Ce qui précède commence par les filtres interpolés et se poursuit avec les filtres de flou Gaussian, montrant quelle quantité de flou ces filtres produisent, et ce faisant, suppriment le 'crénelage' de l'image d'origine. Aucun rebond n'est produit par ces filtres. La deuxième ligne commence par trois filtres Sinc fenêtrés, montrant les forts effets de rebond qu'ils peuvent produire. Rappelez-vous que ces filtres sont réellement conçus pour réduire les images, pas pour les agrandir. Cela se poursuit avec le « Lagrange » utilisant son réglage 'interpolant' par défaut, et le filtre cubique interpolé « Catrom ». La dernière image est le filtre « Mitchell », montrant ce que les 'experts' ont subjectivement estimé être le meilleur filtre 'idéal' à utiliser pour agrandir les images, avec un minimum des quatre artefacts de rééchantillonnage présents dans le résultat final. Je suis moi-même d'accord avec leurs conclusions, mais seulement pour les agrandissements. C'est pourquoi « Mitchell » est le filtre d''agrandissement' par défaut utilisé par IM. Réduction... Pour avoir une idée des effets de crénelage, je réduis ici le rognage de la grande image d'anneaux que nous avons fait plus tôt (105x105 pixels), pour voir quel type d'effets de moiré chacun des 12 mêmes filtres représentatifs génère.

  magick rings_crop.png -filter {_filter_type_} -resize 100x {_result_}

[IM Output]

Comme vous pouvez le voir, les filtres interpolés présentent un effet de moiré très fortement crénelé, causé comme effet secondaire des artefacts de blocs qu'ils produisent. En revanche, les artefacts de flou des filtres de flou Gaussian ont supprimé tous ces effets de moiré en blocs de l'image résultante, quoique avec un flou général (lignes indistinctes) dans l'image résultante. Le filtre « [Gaussian](#gaussian) » lui-même montre un effet de crénelage à peine perceptible, causé par son filtre infini (RII) écrêté par le réglage de support de filtre, mais c'est très mineur. En revanche, les filtres Sinc fenêtrés produisent une image d'aspect très net avec des effets de moiré circulaires, d'intensité à peu près égale pour les trois filtres représentatifs. Cela est causé par les artefacts de rebond que produisent ces filtres, générant des motifs d'interférence. Enfin, les filtres cubiques montrent eux aussi de très légers effets de moiré, mais uniquement dus au rebond des lobes négatifs. Le filtre « [Mitchell](#mitchell) » produit le moindre effet de rebond. Notez que « Mitchell » génère de très légers effets de presque tous les artefacts de redimensionnement. À savoir : moiré en forme de grille - crénelage/blocs, moiré circulaire - rebond, et flou des lignes. Tous les artefacts sont cependant à des niveaux très minimes, ce qui explique pourquoi c'est un bon filtre polyvalent. Voici une autre comparaison, mais cette fois en réduisant fortement une image d'anneaux plus petite.

  magick rings_sm_orig.gif -filter {_filter_type_} -resize 100x {_result_}

[IM Output]

Comme vous pouvez le voir, les filtres interpolés produisent beaucoup d'artefacts de crénelage, tandis que les filtres de flou Gaussian tendent à flouter plus de lignes que les autres. Mais tous les autres filtres tendent à faire un travail raisonnable.

Le meilleur filtre ?

Cela, c'est quelque chose que vous devrez déterminer vous-même. Souvent cependant, cela dépend du type d'image et de redimensionnement que vous effectuez. Pour agrandir des images, « Mitchell » est probablement à peu près le meilleur filtre que vous puissiez utiliser, tandis que pratiquement n'importe lequel des filtres fenêtrés (par défaut « Lanczos ») est bon pour réduire les images, surtout lorsqu'un type de motif de bas niveau est en jeu. Cependant, si vous n'avez pas de motifs, mais beaucoup de bords droits (comme la transparence GIF), vous feriez peut-être mieux d'utiliser un filtre Gaussian accentué ou, de nouveau, un « Mitchell », afin d'éviter les forts effets de rebond. Le filtre « Lagrange » est aussi plutôt bon, surtout avec un réglage de support de filtre plus grand, pour réduire les images. Pour les personnes intéressées, je vous recommande de consulter le sujet de discussion des utilisateurs IM a way to compare image quality after a resize?, qui montre en gros qu'il n'existe aucun moyen de déterminer quantitativement « le meilleur filtre », seulement un « meilleur filtre » qualitatif ou subjectif. Le choix vous appartient, et le choix est une caractéristique clé d'ImageMagick.

Le filtre par défaut d'IM...

C'est pour ces raisons que « Mitchell » est le filtre par défaut pour l'agrandissement, ainsi que pour la réduction des images impliquant la transparence, ou des images contenant une palette (ou table de couleurs). Cependant, « Lanczos » sera utilisé dans tous les autres cas, c'est-à-dire pour réduire des images normales (typiquement des photographies). Pour Distort, le réglage de filtre prend par défaut la valeur du filtre « Robidoux », qui a été spécifiquement conçu pour minimiser le flou d'image lorsqu'aucune distorsion réelle n'a lieu. Vous pouvez bien sûr outrepasser ces choix.

Nicolas Robidoux

Nicolas Robidoux est un expert en traitement d'image qui a bien plus à dire et à recommander sur la façon d'obtenir les tout meilleurs résultats de votre redimensionnement d'image. À tel point qu'il a sa propre section...
Rééchantillonnage par Nicolas Robidoux.