Besoin de plus de flous différents

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, e−x2:



dont une version bidimensionnelle est obtenue par sa rotation autour de l'axe des ordonnĂ©es, e−(x2+y2):



Ici pour chaque paire de coordonnĂ©es (x,y)la distance au centre est calculĂ©e par la formule  sqrtx2+y2, qui est passĂ© comme argument Ă  la fonction gaussienne - et, comme vous pouvez facilement le voir, e− left( sqrtx2+y2 right)2rĂ©duit Ă  e−(x2+y2).

Matrice construite sur un segment [−3,3]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  sigma(lu comme "sigma") - pour considĂ©rer un argument dans la plage [−1,1]et  sigmadĂ©termine le taux de compression du gaussien:

 frace− fracx2+y22 sigma22 pi sigma2


SĂ©parateur de normalisation 2 pi sigma2obtenu ici analytiquement par une intĂ©grale dĂ©finie Ă  l'infini:

 int− infty infty int− infty inftye− fracx2+y22 sigma2 dxdy=2 pi sigma2


Du fait que l'Ă©galitĂ© tient e− left(x2+y2 right)=e−x2e−y2Le 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 -

 frace− fracx22 sigma2 sqrt2 pi sigma2



Commencer


Pour un filtre arbitraire, nous devons d'abord dĂ©finir notre propre fonction d'attĂ©nuation Ă  partir d'une variable f, Ă  partir de laquelle la fonction de deux variables est obtenue par rotation en remplaçant xsur  sqrtx2+y2oĂč xet yce sont les coordonnĂ©es de l'Ă©lĂ©ment de matrice dans la plage (−1,1), 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 xou yest calculĂ© par la formule

 frac2indexsize−1−1


oĂč index- le numĂ©ro de sĂ©rie de l'Ă©lĂ©ment dans la ligne ou la colonne, et taille- 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

 frac2taille−index+1taille


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

1− fracnx−xnn−1


dans lequel ndétermine la «rigidité» de l'amarrage, n>1. Par exemple n=3nous 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 k>0détermine la nature de l'atténuation:



et le filtre lui-mĂȘme se penchera (pour k=5) 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 nVous pouvez obtenir un large Ă©ventail d'options de filtrage:

n=0,5


n=2


n=10


n=50



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 ddétermine la hauteur du centre, et m- la netteté de la transition vers les bords.
Pour d=0,2,m=2,n=10nous obtenons



mais pour d=0,m=12,n=2



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 xdĂ©nominateur unitaire x2−1tend Ă  zĂ©ro fraction  frackx2x2−1tend Ă  moins l'infini, et l'exposant lui-mĂȘme tend Ă©galement Ă  zĂ©ro. Divisant ainsi par x2−1permet de compresser le domaine de dĂ©finition de fonction avec (− infty, infty)avant (−1,1). De plus, lorsque x= pm1en raison de la division par zĂ©ro ( 1 $ ^ 2-1 = 0 $ ) 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:

 undersetx to1− textlime frackx2x2−1=0


 undersetx to1+ textlime frackx2x2−1= infty


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 kdĂ©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  frac1x2−1tomber 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é:

k=5


k=2


k=0,5


k=0,1


k=0,01



Variations de forme


En changeant la fonction de transition de deux coordonnĂ©es Ă  une  sqrtx2+y2, vous pouvez obtenir d'autres formes, pas seulement un disque. Par exemple:

f gauche( frac gauche|x−y droite|+ gauche|x+y droite|2 droite)




f( gauche|x droite|+ gauche|y droite|)




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

f left( frac left| Re left((x+iy)(−1) frac03 right) right|+ left| Re left((x+iy)(−1) frac13 right) right|+ left| Re left((x+iy)(−1) frac23 droite) droite| sqrt3 droite)





f biggl(10 left| Re left((x+iy)(−1) frac18 right) right| biggr) cdotf( left|x+iy droite|)




f biggl( biggl|5 left|x+iy right|(x+iy) Re biggl( cos left( frac52 arg(x+iy) right) biggr) biggr| biggr) cdotf( left|x+iy right|)





Dans ce cas, vous devez vous assurer que lors de la conversion des coordonnées ne dépassent pas l'intervalle (0,1)- 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:



Gaussiana




Atténuation hyperbolique




La croix




Bague




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) Ă  (  frac12, 1) ou considĂ©rer initialement les fonctions de fenĂȘtre par la formule  frac12 left(f left( fractx+1t−1 right)−f left( fractx−1t−1 droite) droite).

Le document source de Wolfram Mathematica pour cet article peut ĂȘtre tĂ©lĂ©chargĂ© ici .

Source: https://habr.com/ru/post/fr432622/


All Articles