Le flou d'image avec le filtre Flou gaussien est largement utilisĂ© dans une grande variĂ©tĂ© de tĂąches. Mais parfois, vous voulez un peu plus de variĂ©tĂ© qu'un seul filtre pour toutes les occasions, dans lequel un seul paramĂštre se prĂȘte au rĂ©glage - sa taille. Dans cet article, nous examinerons plusieurs autres implĂ©mentations de flou.
Présentation
L'effet Flou gaussien est une opération linéaire et représente mathématiquement une convolution de l'image avec la matrice de filtre. Dans ce cas, chaque pixel de l'image est remplacé par la somme des pixels proches prise avec certains facteurs de pondération.
Le filtre est appelé gaussien car il est construit à partir d'une fonction appelée gaussienne,
:

dont une version bidimensionnelle est obtenue par sa rotation autour de l'axe des ordonnées,
:

Ici pour chaque paire de coordonnées
la distance au centre est calculée par la formule
, qui est passé comme argument à la fonction gaussienne - et, comme vous pouvez facilement le voir,
rĂ©duit Ă
.
Matrice construite sur un segment
et avec un certain niveau d'échantillonnage, cela ressemblera à ceci:
\ left (\ begin {array} {ccccccc} 1,52 \ fois 10 ^ {- 8} & 2,26 \ fois 10 ^ {- 6} & 0,0000454 & 0,000123 & 0,0000454 & 2,26 \ fois 10 ^ {- 6} & 1,52 \ fois 10 ^ {- 8} \\ 2,26 \ fois 10 ^ {- 6} & 0,000335 & 0,00674 & 0,0183 & 0,00674 & 0,000335 & 2,26 \ fois 10 ^ {- 6} \\ 0,0000454 & 0,00674 & 0,135 & 0,368 & 0,135 & 0,00674 & 0,0000454 \\ 0,000123 & 0,0183 & 0,368 & 1,00 & 0,368 & 0,0183 & 0,000123 \\ 0,0000454 & 0,00674 & 0,135 & 0,368 & 0,135 & 0,00674 & 0,0000454 \\ 2,26 \ fois 10 ^ {- 6} & 0,000335 & 0,00674 & 0,0183 & 0,00674 & 0,000335 & 2,26 \ fois 10 ^ {- 6} \\ 1,52 \ fois 10 ^ {- 8} & 2,26 \ fois 10 ^ {- 6} & 0,0000454 & 0,000123 & 0,0000454 & 2,26 \ fois 10 ^ {{ -6} & 1,52 \ fois 10 ^ {- 8} \\ \ end {array} \ right)
Ou, si nous considérons les valeurs des éléments de la matrice comme un niveau de luminosité, comme ceci:

En termes de traitement du signal, cela s'appelle la réponse impulsionnelle, car c'est exactement ce à quoi ressemblera le résultat de la convolution de ce filtre avec une seule impulsion (dans ce cas, un pixel).
Initialement, un gaussien est dĂ©fini sur un intervalle infini. Mais du fait qu'il se dĂ©sintĂšgre assez rapidement, il est possible d'exclure des calculs des valeurs proches de zĂ©ro - car elles n'affecteront toujours pas le rĂ©sultat. Dans les applications rĂ©elles, la normalisation de la valeur est Ă©galement nĂ©cessaire pour qu'aprĂšs convolution la luminositĂ© de l'image ne change pas; et dans le cas de flou d'une image dans laquelle chaque pixel a la mĂȘme couleur, l'image elle-mĂȘme ne devrait pas changer.
Pour plus de commodité, la normalisation est également souvent utilisée en coordonnées, en introduisant un paramÚtre supplémentaire
(lu comme "sigma") - pour considérer un argument dans la plage
et
détermine le taux de compression du gaussien:
Séparateur de normalisation
obtenu ici analytiquement par une intégrale définie à l'infini:
Du fait que l'égalité tient
Le flou gaussien peut ĂȘtre implĂ©mentĂ© sĂ©quentiellement, d'abord en lignes puis en colonnes - ce qui vous permet d'Ă©conomiser beaucoup sur les calculs. Dans ce cas, il est nĂ©cessaire d'utiliser la formule de normalisation pour le cas unidimensionnel -
Commencer
Pour un filtre arbitraire, nous devons d'abord définir notre propre fonction d'atténuation à partir d'une variable
, à partir de laquelle la fonction de deux variables est obtenue par rotation en remplaçant
sur
oĂč
et
ce sont les coordonnées de l'élément de matrice dans la plage
, et qui est ensuite utilisé pour remplir les éléments de la matrice. La normalisation ne sera pas considérée analytiquement, mais une sommation directe de tous les éléments de la matrice - c'est à la fois plus simple et plus précis - car aprÚs discrétisation la fonction est «amincie» et la valeur de normalisation dépendra du niveau de discrétisation.
Dans le cas oĂč les Ă©lĂ©ments de la matrice sont numĂ©rotĂ©s Ă partir de zĂ©ro, les coordonnĂ©es
ou
est calculé par la formule
oĂč
- le numéro de série de l'élément dans la ligne ou la colonne, et
- nombre total d'éléments.
Par exemple, pour une matrice 5 par 5, cela ressemblerait Ă ceci:
\ left (\ begin {array} {ccccc} f (-1, -1) & f \ left (- \ frac {1} {2}, - 1 \ right) & f (0, -1) & f \ left (\ frac {1} {2}, - 1 \ right) & f (1, -1) \\ f \ left (-1, - \ frac {1} {2} \ right) & f \ left (- \ frac {1} {2}, - \ frac {1} {2} \ droite) & f \ left (0, - \ frac {1} {2} \ right) & f \ left (\ frac { 1} {2}, - \ frac {1} {2} \ right) & f \ left (1, - \ frac {1} {2} \ right) \\ f (-1.0) & f \ left (- \ frac {1} {2}, 0 \ droite) & f (0,0) & f \ gauche (\ frac {1} {2}, 0 \ droite) & f (1,0) \\ f \ left (-1, \ frac {1} {2} \ right) & f \ left (- \ frac {1} {2}, \ frac {1} {2} \ right) & f \ left (0, \ frac {1} {2} \ right) & f \ left (\ frac {1} {2}, \ frac {1} {2} \ right) & f \ left (1, \ frac {1} {2 } \ droite) \\ f (-1,1) & f \ gauche (- \ frac {1} {2}, 1 \ droite) & f (0,1) & f \ gauche (\ frac {1} { 2}, 1 \ droite) & f (1,1) \\ \ end {array} \ droite)
Ou, si nous excluons les valeurs limites qui sont toujours nulles, les coordonnées seront calculées par la formule
et la matrice prendra donc la forme
\ left (\ begin {array} {ccccc} f \ left (- \ frac {4} {5}, - \ frac {4} {5} \ right) & f \ left (- \ frac {2} { 5}, - \ frac {4} {5} \ right) & f \ left (0, - \ frac {4} {5} \ right) & f \ left (\ frac {2} {5}, - \ frac {4} {5} \ right) & f \ left (\ frac {4} {5}, - \ frac {4} {5} \ right) \\ f \ left (- \ frac {4} {5 }, - \ frac {2} {5} \ right) & f \ left (- \ frac {2} {5}, - \ frac {2} {5} \ right) & f \ left (0, - \ frac {2} {5} \ right) & f \ left (\ frac {2} {5}, - \ frac {2} {5} \ right) & f \ left (\ frac {4} {5}, - \ frac {2} {5} \ right) \\ f \ left (- \ frac {4} {5}, 0 \ right) & f \ left (- \ frac {2} {5}, 0 \ right ) & f (0,0) & f \ left (\ frac {2} {5}, 0 \ right) & f \ left (\ frac {4} {5}, 0 \ right) \\ f \ left ( - \ frac {4} {5}, \ frac {2} {5} \ droite) & f \ left (- \ frac {2} {5}, \ frac {2} {5} \ right) & f \ gauche (0, \ frac {2} {5} \ droite) & f \ gauche (\ frac {2} {5}, \ frac {2} {5} \ droite) & f \ left (\ frac {4} {5}, \ frac {2} {5} \ right) \\ f \ left (- \ frac {4} {5}, \ frac {4} {5} \ right) & f \ left (- \ frac {2} {5}, \ frac {4} {5} \ right) & f \ left (0, \ frac {4} {5} \ right) & f \ left (\ frac {2} {5}, \ frac {4} {5} \ right) & f \ left (\ frac {4} {5}, \ frac {4} {5} \ right) \\ \ end {array} \ right)
Une fois les éléments de la matrice calculés par la formule, il est nécessaire de calculer leur somme et d'y diviser la matrice. Par exemple, si nous obtenons une matrice
\ left (\ begin {array} {ccc} 1 & 4 & 1 \\ 4 & 20 & 4 \\ 1 & 4 & 1 \\ \ end {array} \ right)
alors la somme de tous ses éléments sera de 40, et aprÚs normalisation, elle prendra la forme
\ left (\ begin {array} {ccc} \ frac {1} {40} & \ frac {1} {10} & \ frac {1} {40} \\ \ frac {1} {10} & \ frac {1} {2} & \ frac {1} {10} \\ \ frac {1} {40} & \ frac {1} {10} & \ frac {1} {40} \\ \ end {array } \ droite)
et la somme de tous ses éléments devient 1.
Atténuation linéaire
Tout d'abord, prenez la fonction la plus simple - la ligne:
\ left \ {\ begin {array} {ll} 1-x, & x <1 \\ 0, & x \ geqslant 1 \\ \ end {array} \ right.

Une définition continue par morceaux nécessite ici que la fonction soit garantie de passer à zéro et qu'aucun artefact n'apparaisse aux coins de la matrice pendant la rotation. De plus, comme la rotation utilise la racine de la somme des carrés des coordonnées, qui est toujours positive, il suffit de déterminer la fonction uniquement dans la partie positive des valeurs. En conséquence, nous obtenons:

Atténuation linéaire douce
Une transition nette d'une ligne oblique à des fonctions nulles peut provoquer une contradiction avec un sens de la beauté. Pour le résoudre, la fonction aidera
dans lequel
détermine la «rigidité» de l'amarrage,
. Par exemple
nous obtenons
\ left \ {\ begin {array} {ll} 1- \ frac {3 xx ^ 3} {2}, & x <1 \\ 0, & x \ geqslant 1 \\ \ end {array} \ right.

et le filtre lui-mĂȘme ressemblera

Atténuation hyperbolique
Le filtre peut ĂȘtre rendu plus "net" et aller plus facilement Ă zĂ©ro en prenant une autre fonction, par exemple une hyperbole, et en assurant une transition en douceur vers zĂ©ro en additionnant avec une parabole.

AprĂšs tous les calculs et simplifications, on obtient la formule
\ left \ {\ begin {array} {ll} \ frac {(x-1) ^ 2 (k x + k + 1)} {(k + 1) (k x + 1)}, & x <1 \\ 0, & x \ geqslant 1 \\ \ end {array} \ right.
dans quel paramĂštre
détermine la nature de l'atténuation:

et le filtre lui-mĂȘme se penchera (pour
) comment

Effet bokeh
Vous pouvez aller d'une autre maniĂšre - pour rendre le haut du filtre non pointu, mais stupide. La façon la plus simple de mettre en Ćuvre cela est de dĂ©finir la fonction d'amortissement comme constante:
\ left \ {\ begin {array} {ll} 1, & x <1 \\ 0, & x \ geqslant 1 \\ \ end {array} \ right.

Mais dans ce cas, nous obtenons une forte pixellisation, ce qui contraste avec le sens de la beauté. Pour la rendre plus lisse sur les bords, une parabole d'ordre supérieur nous aidera, à partir de laquelle, en la déplaçant le long de l'axe des ordonnées et en la quadrillant, nous obtenons
\ left \ {\ begin {array} {ll} \ left (1-x ^ n \ right) ^ 2, & x <1 \\ 0, & x \ geqslant 1 \\ \ end {array} \ right.
ParamĂštre variable
Vous pouvez obtenir un large éventail d'options de filtrage:




En modifiant légÚrement la fonction d'amortissement, vous pouvez rendre l'anneau sur les bords du filtre plus prononcé, par exemple comme ceci:
\ left \ {\ begin {array} {ll} \ left (1-x ^ n \ right) ^ 2 \ left (d + x ^ m \ right), & x <1 \\ 0, & x \ geqslant 1 \\ \ end {array} \ right.
Ici le paramĂštre
détermine la hauteur du centre, et
- la netteté de la transition vers les bords.
Pour
nous obtenons

mais pour

Variations gaussiennes
La fonction du gaussien lui-mĂȘme peut Ă©galement ĂȘtre modifiĂ©e directement. La façon la plus Ă©vidente de le faire est de paramĂ©trer l'exposant - nous ne l'examinerons pas maintenant, mais prenons une option plus intĂ©ressante:
\ left \ {\ begin {array} {ll} e ^ {\ frac {kx ^ 2} {x ^ 2-1}}, & -1 <x <1 \\ 0, et sinon \\ \ end { tableau} \ Ă droite.
En raison du fait qu'avec
dénominateur unitaire
tend à zéro fraction
tend Ă moins l'infini, et l'exposant lui-mĂȘme tend Ă©galement Ă zĂ©ro. Divisant ainsi par
permet de compresser le domaine de définition de fonction avec
avant
. De plus, lorsque
en raison de la division par zéro (

) la valeur de la fonction n'est pas définie, mais a deux limites - la limite d'une part (de l'intérieur) est zéro, et d'autre part, l'infini:
Puisque les valeurs limites ne sont pas incluses dans l'intervalle, alors zéro dans la limite d'un seul cÎté est tout à fait suffisant. Fait intéressant, cette propriété s'étend à toutes les dérivées de cette fonction, ce qui garantit une correspondance parfaite avec zéro.
ParamĂštre
détermine la similitude avec le gaussien - plus il est grand, plus la similitude est forte - en raison du fait qu'une section de plus en plus linéaire
tomber au centre de la fonction. On pourrait supposer qu'à cause de cela, à la limite, vous pouvez obtenir le gaussien d'origine - mais, malheureusement, non - les fonctions sont toujours différentes.

Vous pouvez maintenant voir ce qui s'est passé:





Variations de forme
En changeant la fonction de transition de deux coordonnées à une
, vous pouvez obtenir d'autres formes, pas seulement un disque. Par exemple:


En passant Ă des nombres complexes, vous pouvez construire des figures plus complexes:



Dans ce cas, vous devez vous assurer que lors de la conversion des coordonnées ne dépassent pas l'intervalle
- bien, ou vice versa, redéfinissez la fonction d'amortissement pour les valeurs négatives de l'argument.
Quelques exemples spécifiques
Un article ne serait pas complet sans des tests pratiques sur des images spécifiques. Comme nous n'avons pas de travail scientifique, nous ne prendrons pas non plus l'image de
Lena - nous prendrons quelque chose de doux et de moelleux:


Atténuation hyperbolique 


Atténuation unidirectionnelle 
Les mĂȘmes filtres, mais pour le texte:






Conclusion
De mĂȘme, vous pouvez crĂ©er des filtres plus complexes, y compris ceux avec une nettetĂ© ou des contours; et Ă©galement modifier ceux dĂ©jĂ considĂ©rĂ©s.
Le filtrage non linéaire est particuliÚrement intéressant, lorsque les valeurs des coefficients de filtrage dépendent des coordonnées ou de l'image filtrée directement - mais c'est déjà un sujet pour d'autres études.
Plus en détail, la dérivation des fonctions d'ancrage avec une constante est considérée
ici . Les fonctions de fenĂȘtre considĂ©rĂ©es
ici peuvent Ă©galement ĂȘtre utilisĂ©es comme fonction d'attĂ©nuation - il suffit de mettre Ă l'Ă©chelle l'argument c (0,1) Ă (
, 1) ou considérer
initialement les fonctions de fenĂȘtre par la formule
.
Le document source de Wolfram Mathematica pour cet article peut ĂȘtre tĂ©lĂ©chargĂ©
ici .