Outils pour utilisateurs

Outils du site


issue116:inkscape

There's one last filter primitive to visit in this series, which I've kept until last simply because it's a new addition in 0.91, so isn't available to users who are still using version 0.48. The filter is called Component Transfer, and its purpose is to use a function (called a “transfer function”) to adjust the distribution of values within each color channel (or “component”). It allows you to adjust brightness or contrast, or to set hard thresholds for posterization effects. As usual, I'll begin by considering the filter's operation on a single color channel, then you can extrapolate from there to how it behaves with three channels plus alpha. A single color channel of a single pixel is represented by a number from 0 (no color) to 255 (completely saturated). The distribution of the values is linear – ramping up along a straight line – and the default settings for the Component Transfer primitive leave this line untouched. A value of 0 into the filter results in 0 out. 136 in gives 136 out. And so on. This can be represented as a graph, where the value of the channel coming into the filter is shown on the x-axis, and the value that comes out of the filter is shown on the y-axis. In practice, this primitive maps the input values to a range from 0 to 1 rather than 0 to 255, but the result is the same: with the default settings in the filter (“Identity”), every input channel is mapped to the output without being affected. The purpose of the Component Transfer filter is to play around with that simple 45° graph to let you change the way that input values are mapped to output values.

Il reste une dernière primitive de filtrage à visiter dans cette série, que j'ai gardée jusqu'à maintenant simplement parce que c'est un nouvel ajout dans la 0.91 ; elle est donc indisponible pour les utilisateurs qui se servent encore de la version 0.48. Le filtre s'appelle Transfert de composantes et son but est d'utiliser une fonction (appelée « fonction de transfert ») pour ajuster la distribution des valeurs dans chaque canal de couleur (ou « composante »). Il vous permet d'ajuster la luminosité ou le contraste, ou de régler des seuils forts pour des effets de postérisation. Comme d'habitude, je commencerai par m'intéresser aux opérations de filtrage sur un seul canal, puis vous pourrez extrapoler à partir de là pour voir comment il se comporte avec trois canaux plus l'alpha.

Une couleur unique d'un seul pixel est représentée par un nombre de 0 (pas de couleur) à 255 (complètement saturée). La distribution de ces valeurs est linéaire - augmentant le long d'une ligne droite - et les valeurs par défaut de la primitive Transfert de composantes laissent cette ligne inchangée. Une valeur de 0 dans le filtre entraîne une sortie à 0. 136 donne une sortie à 136. Et ainsi de suite. Ceci peut être représenté dans un graphique, où la valeur du canal entrant dans le filtre est présenté sur l'axe x, et la valeur qui sort du filtre est visible sur l'axe y.

En pratique, cette primitive dispose les valeurs d'entrée entre 0 et 1, plutôt qu'entre 0 et 255, mais le résultat est le même : avec les valeurs par défaut du filtre (« Identité »), chaque canal d'entrée est transféré à la sortie sans être modifié. Le but du filtre Transfert de composantes est de bricoler avec ce graphique simple à 45 ° pour vous permettre de changer la manière de relier les valeurs d'entrée aux valeurs de sortie.

Basic mathematics tells us that a straight line graph like this can be defined by the slope of the line and the point at which it intercepts with the y-axis. One way to modify the mapping, therefore, is to alter the slope and the intercept point – a pair of values provided by the “Linear” option in the filter. The identity line has a slope of 1 – that is, for every increase of 1 along the x axis, the y value also increases by 1. By setting it to a value of 2 we can make the slope steeper, causing the output to appear brighter. Here's how it looks for one channel in the filter dialog: As well as showing the effect on the slope, I've also included a grayscale version of Mona, with the right-hand side showing the result of applying this change to all the color channels: Changing the slope to a smaller value, 0.5 in this case, reduces the brightness of the image: By changing the intercept you can alter the contrast of the image; you may also want to tweak the slope to ensure you don't also change the brightness at the same time (unless that's your intention). For example, setting an intercept of 0.5 with a slope of 1 would give you this result: Bear in mind that color channels can't go below 0 or above 127, so the graph changes shape when you hit these limits. As you can see, it becomes horizontal halfway along the x-axis, washing out any values above 127 by turning them completely white. Compensating for this by changing the slope to 0.5 preserves the detail a lot more, because all 255 input values are mapped, rather than just clamping half of them.

Les mathématiques de base nous disent qu'une ligne droite comme celle-ci peut être définie par sa pente et le point où elle coupe l'axe des y. Une façon de modifier la conversion est donc de modifier la pente et le point d'intersection, un couple de valeurs fourni dans le filtre par l'option « Linéaire ». La ligne d'identité a une pente de 1, c'est-à-dire que, pour chaque augmentation de 1 sur l'axe des x, la valeur de y augmente de 1. En positionnant cette valeur à 2, nous accentuons la pente, entraînant une plus forte luminosité de la sortie. Voici à quoi ressemble le dialogue du filtre pour un canal :

Tout en montrant l'effet sur la pente, j'ai aussi inclus une version de la Joconde en niveaux de gris, avec sur le côté droit le résultat de l'application de ce changement à tous les canaux de couleurs :

Le changement de la pente pour une valeur plus petite, 0,5 dans ce cas, réduit la luminosité de l'image :

En changeant l'interception, vous pouvez modifier le contraste de l'image ; vous pourriez aussi vouloir ajuster la pente pour vous assurer que la luminosité n'est pas modifiée en même temps (sauf si c'est votre intention). Par exemple, en réglant l'interception à 0,5 avec une pente de 1, vous obtiendrez ce résultat :

Gardez en tête que les canaux de couleurs ne peuvent pas passer sous 0 ou au-dessus de 127 ; aussi, le graphique change de forme quand vous atteignez ces limites. Comme vous pouvez le voir, il devient horizontal à mi-chemin sur l'axe des x, délavant toutes les valeurs au-dessus de 127 en les rendant complètement blanches. Compenser ceci par une modification de la pente à 0,5 préserve beaucoup plus de détails, car les 255 valeurs sont toutes converties, au lieu d'en brider la moitié.

The intercept value can also be negative, to give a darker output, again with reduced contrast. It's worth noting that the slope can also be negative, which inverts the mapping so that larger input values are converted to small output values, and vice versa. With a slope of -1 and an intercept of 1, the output from the channel is completely inverted: The linear mode of this filter primitive assumes that you want a simple mapping from input to output, to adjust the brightness or contrast by altering the slope and position of a single line. But there are times when a single straight line (even one that flattens out at the limits of the color range) just doesn't cut it. What happens if you want the output to ramp up, then down again, such that values at the extreme ends of the range are mapped to low numbers, whilst those in the middle are mapped to high numbers? For that we have the “Table” mode. “Table” may be a little misleading, as the table you have to supply is one-dimensional. “List” might have been a better name, but table is what the SVG Working Group decided to go with, and what Inkscape exposes. The numbers in the list represent the start and end values for a series of straight line segments; the number of values in the list determines how many segments there are. For example, the table below has five values (you can use spaces and/or commas to separate them): These five values give rise to four separate segments in the graph, causing the output values to ramp up and down rapidly as the input varies:

La valeur de l'interception peut aussi être négative, pour obtenir une sortie plus sombre, à nouveau avec un contraste réduit. Notez bien que la pente peut aussi être négative, ce qui inverse la conversion de sorte que les grandes valeurs sont changées en petites, et vice-versa. Avec une pente de -1 et une interception de 1, la sortie de ce canal est complètement inversée :

Le mode linéaire de la primitive de filtrage considère que vous voulez une simple conversion de l'entrée vers la sortie, pour ajuster la luminosité ou le contraste en modifiant la pente et la position d'une ligne unique. Mais, parfois, une ligne droite unique (même une qui est aplatie aux limites de la plage des couleurs) ne suffit pas. Qu'arrive-t-il si vous voulez que la sortie monte d'abord, puis redescende, de sorte que les valeurs d'extrémités sont converties en faibles valeurs, alors que celles du milieu sont remplacées par des valeurs élevées ? Pour cela, nous disposons du mode « Table ».

« Table » est un peu trompeur, car la table que vous devez fournir est mono-dimensionnelle. « Liste » aurait pu être un meilleur titre, mais table est ce que le groupe de travail SVG a décidé de choisir et ce qu'Inkscape applique. Les nombres de la liste représentent les valeurs de début et de fin d'une série de segments droits ; le nombre de valeurs de la liste détermine combien il y a de segments. Par exemple, la table ci-dessous a cinq valeurs (vous pouvez utiliser des espaces ou des virgules pour les séparer) :

Ces cinq valeurs donnent lieu à quatre segments distincts sur le graphique, entraînant une montée et une descente rapides des valeurs de sortie lorsque les valeurs d'entrée varient :

A table consisting of just (0, 1) would be the same as the identity mapping, whereas (1, 0) would invert the image. To flatten a section of the line, use the same value twice in succession: (1, 0.5, 0.5, 0) gives an inverted image where the details in the low and high values are preserved, but the middle third of numbers are all mapped to 127: As you can see, the input range is divided evenly based on the number of values in your table, and the line ramps smoothly between them. Sometimes, however, a smooth transition is the last thing you want. Suppose that you have to reduce the number of colors in an image (“posterizing”), or even reduce it down to a stark black-and-white version. For these cases there is the “Discrete” mode. With discrete mode you still provide a “table” of values, but rather than defining start and end points that will be interpolated between, you provide a list of the only output values that are allowed, and Inkscape will map them to sections of the input range. Provide only two numbers and any input value of 127 or less will be mapped to the first value, 128 or greater will be mapped to the second value. Instant monochrome! Provide four numbers and values from 0-63 will be mapped to the first, 64-127 to the second, and so on.

Une table constituée seulement de (0, 1) fera une conversion Identité, alors que (1, 0) inversera l'image. Pour aplatir une section de la ligne, l'utilisation de la même valeur deux fois de suite : (1, 0,5, 0,5, 0) donne une image inversée où les détails sont préservés dans les hautes et les basses valeurs, mais les nombres du tiers central sont tous convertis en 127 :

Comme vous pouvez le voir, l'étendue d'entrée est divisée également sur la base du nombre de valeurs de votre table et les lignes varient doucement entre elles. Quelquefois, cependant, une transition douce n'est pas du tout ce que vous voulez. Supposez que vous devez réduire le nombre de couleurs de l'image (« postériser ») et même la ramener à une version en pur noir et blanc. Dans ces cas, utilisez le mode Discret.

En mode Discret, vous fournissez encore une « table » de valeurs, mais, plutôt que de définir des points de départ et d'arrivée entre lesquels une interpolation est calculée, vous fournissez une liste des seules valeurs de sortie autorisées et Inkscape les convertira en sections de la plage d'entrée. Fournissez seulement deux valeurs et toute valeur d'entrée de 127 ou moins sera convertie dans la première valeur, de 128 ou plus dans la deuxième. Monochrome instantané ! Fournissez 4 nombres et les valeurs de 0 à 63 seront transformées dans le premier nombre, de 64 à 127 dans le second, et ainsi de suite.

Except there's a bug in Inkscape that prevents it working correctly. In discrete mode the last value in your list is skipped – so if you provide two values expecting to get a monochrome output you'll find that every input value is mapped to the first number, and the second is never used. The workaround is obviously to provide three numbers (typically just duplicating the last one), but then the filter will not work correctly in other SVG programs or web browsers. The issue is tracked on Launchpad as bug #1046093, and a fix has been committed for the forthcoming 0.92 release of Inkscape, which is good – but it does also mean that if you provide an extra value to get the filter to work in 0.91, your image will look wrong when you upgrade to 0.92. For the examples below I've pretended that Inkscape works the way it should – just bear in mind that when I say (0, 1) you should actually use (0, 1, 1) to get it to work on the current release. Speaking of which, here is that monochrome output, using a discrete table containing (0, 1): This one uses values of (1, 0.75, 0.5, 0.25, 0) to posterize Mona down to five shades of gray, whilst inverting the output at the same time:

Sauf qu'il y une erreur dans Inkscape qui l'empêche de fonctionner correctement. En mode Discret, la dernière valeur de votre liste est sautée. Ainsi, si vous fournissez deux valeurs en souhaitant obtenir une sortie monochrome, vous verrez que chaque valeur d'entrée est convertie dans la première valeur, et que la seconde n'est jamais utilisée. La solution est évidemment de fournir trois nombres (typiquement en dupliquant le dernier), mais alors le filtre ne fonctionnera pas correctement dans d'autres programmes SVG ou navigateurs Web. Le défaut est suivi sur Launchpad sous l'erreur #1046093, et une solution a été validée pour la prochaine publication 0.92 d'Inkscape, ce qui est bien, mais cela veut dire aussi que, si vous fournissez une valeur supplémentaire pour faire fonctionner le filtre en 0.91, votre image sera fausse quand vous ferez la mise à niveau en 0.92.

Pour les exemples ci-dessous, j'ai fait comme si Inkscape fonctionnait correctement - gardez simplement en tête que ce que je dis (0, 1) devrait être réellement (0, 1, 1) pour que ça marche dans la version actuelle. A ce propos, voici cette version monochrome, en utilisant une table discrète contenant (0, 1) :

Celle-ci utilise les valeurs (1, 0.75, 0.5, 0.25, 0) pour postériser la Joconde en cinq nuances de gris, tout en inversant la sortie dans le même temps :

One thing you've undoubtedly noticed about all of the modes so far is that the graphs consist entirely of straight lines – either horizontal ones in the case of Discrete, or angled in the case of Table, Linear and Identity. The last option adds a bit of curvature to the graph, but don't get too excited; it doesn't allow you to draw an arbitrary Bézier curve, but rather just supply three parameters for a gamma correction curve. In case you're not familiar with gamma correction, it's a non-linear mapping of input to output values, which is used to adjust the brightness and contrast of an image to compensate for differences in perceived brightness at the ends of the range. Think of it as a more sophisticated option than just changing the slope and intercept using the Linear mode, because it allows lower values to change at a different rate than higher values. The Gamma mode takes three parameters: Amplitude, Exponent and Offset. The output value from the transfer function is calculated using the following formula: output = Amplitude × inputExponent + Offset

Une chose que vous aurez probablement déjà constaté pour tous ces modes, c'est que les graphiques sont entièrement constitués de lignes droites, horizontales dans le cas de Discret, anguleuses pour Table, Linéaire et Identité. La dernière option ajoute un peu de courbure au graphique, mais ne vous réjouissez pas trop ; elle ne vous permet pas de dessiner une courbe de Bézier quelconque, mais plutôt d'alimenter trois paramètres pour une courbe de correction du gamma.

Dans le cas où vous ne seriez pas familier avec la correction du gamma, c'est une conversion non linéaire des valeurs d'entrée vers celles de sortie, qui est utilisée pour ajuster la luminosité et le contraste d'une image, afin de compenser les différences de luminosité perçue aux deux bouts de la plage. Voyez-la comme une option plus sophistiquée que la simple modification de la pente et du point d'interception utilisés dans le mode Linéaire, car elle permet aux valeurs faibles d'être modifiées plus fortement que les fortes valeurs.

Le mode Gamma utilise trois paramètres : l'Amplitude, l'Exposant et l'Offset. La valeur de sortie de la fonction de transfert est calculée par la formule suivante :

sortie = Amplitude x entréeExposant + Offset

That is, the input value (which is in the range 0 to 1) is raised to the power of the Exponent value, multiplied by the Amplitude and added to the Offset. Often the Amplitude is left as 1, and the Offset as 0, so the output is simply the input raised to the power of the Exponent. For an Exponent of 2, therefore, the result looks something like this: To lighten an image simply use an exponent value of less than 1 – such as in this example with a value of 0.5. Notice the similarity to the Linear mode with slope values of 0.5 (to darken) and 2 (to lighten). Gamma mode often gives a more detailed result, particularly where there are subtle changes in the darker areas of the input range. Although I've used a grayscale image to illustrate this filter, in practice you can use a different transfer function for each color component, and also for the alpha channel – useful for leaving the alpha channel untouched in Identity mode whilst you alter the color channels, or alternatively for only affecting the alpha channel whilst the colors remain untouched.

C'est-à-dire que la valeur d'entrée est portée à la puissance de la valeur de l'exposant, multipliée par l'amplitude et ajoutée à l'offset. Souvent l'amplitude est maintenue à 1, et l'offset à 0, ce qui fait que la sortie est simplement l'entrée à la puissance de l'exposant. Ainsi, avec un exposant de 2, le résultat ressemble à ceci :

Pour éclaircir une image, utilisez simplement une valeur d'exposant inférieure à 1, tel cet exemple avec une valeur de 0,5.

Notez la similarité avec le mode Linéaire, avec les pentes à 0,5 (pour foncer) et 2 (pour éclaircir). Le mode Gamma offre souvent un résultat plus détaillé, particulièrement s'il y a des modifications subtiles dans les parties sombres de la plage d'entrée.

Bien que j'aie utilisé une image en niveaux de gris pour illustrer ce filtre, vous pouvez en pratique utiliser une fonction de transfert différente pour chaque composante de couleur, ainsi que pour le canal alpha, utile pour conserver intact le canal alpha dans le mode Identité alors que vous modifiez les canaux de couleurs, ou, au contraire, pour n'affecter que le canal alpha tout en conservant les couleurs intactes.

To finish, therefore, here's a final image of Mona in all her colorful glory, with four different component transfers applied. The top left quarter has a Table (1, 0) applied to just the green channel, with the others left as Identity; the top right uses Table (0, 1, 0, 1, 0) on all the color channels; the bottom right uses Discrete (0, 0.25, 0.5, 0.75, 1) on the color channels to posterize the image, and the bottom left uses Table (1, 0) on all the channels to produce a “photographic negative” effect. Image Credits “La Gioconda” (aka “Mona Lisa”) by Leonardo da Vinci http://en.wikipedia.org/wiki/File:Mona_Lisa,_by_Leonardo_da_Vinci,_from_C2RMF_retouched.jpg

Donc, pour finir, voici une image de la Joconde dans toute sa gloire colorée, avec l'application de quatre différents transferts de composantes. Le quart en haut à gauche est une Table (1, 0) appliquée au seul canal vert, avec les trois autres en Identité ; celui du haut à droite utilise une Table (0, 1, 0, 1, 0) sur tous les canaux de couleur ; en bas à droite, Discret (0, 0.25, 0.5, 0.75, 1) est utilisé sur les canaux de couleurs pour postériser l'image, et en bas à gauche, Table (1, 0) est utilisé sur tous les canaux pour produire un effet de « négatif photographique ».

Crédits image : La Joconde (aka Mona Lisa) par Leonardo da Vinci https://fr.wikipedia.org/wiki/Fichier:Mona_Lisa,_by_Leonardo_da_Vinci,_from_C2RMF_retouched.jpg

issue116/inkscape.txt · Dernière modification : 2017/01/07 15:05 de andre_domenech