La technique du masque flou
Published on Thursday 31 December 2009
Introduction :
Dans la plupart des programmes de traitement d'images astronomiques, il existe une fonction permettant de réaliser un "masque flou".
Cette technique est utilisée depuis longtemps en photographie et permet de mieux faire ressortir les petits détails de l'image en augmentant leur contraste.
En photographie, on réalise une copie de l'image, mais en s'arrangeant de façon à ce que cette image soit floue, et avec un contraste plus faible que l'original. On superpose ensuite la copie floue à l'original, et on fait un tirage de ce sandwich. Je ne vais pas rentrer dans le détail de l'opération photographique, qui reste difficile à contrôler sans une sensitométrie précise.
Dans le monde digital, la technique revient à prendre l'image, à la convoluer par un filtre gaussien, dont on peut faire varier la largeur à mi hauteur, que l'on soustrait à l'original. On multiplie le tout par un coefficient, pour obtenir ce que l'on appelle un masque de détail, que l'on rajoute à l'image.
Convolution, rappel :
On peut utiliser différents types de filtres. Le plus simple est le filtre passe bas. L'opération consiste à remplacer chaque pixel par la moyenne des pixels environnants. On utilise ce que l'on appelle une matrice de convolution, qui par exemple dans le cas d'un filtre passe bas 3x3 sera :
1 1 1
1 1 1
1 1 1
Ce qui revient à dire que la valeur du pixel de coordonées (x,y) est remplacée par :
1* (x-1,y-1) + 1* (x-1,y) + 1* (x-1,y+1) +
1* (x,y-1) + 1* (x,y)+ 1* (x,y+1) +
1* (x+1,y-1) + 1* (x+1,y) +1* (x+1,y+1)
le tout divisé par 9.
On peut utiliser d'autres matrices de convolution, par exemple la même chose, mais prenant une zone plus grande (la zone des 7x7 pixels autour du pixel, on refait le même calcul, en divisant la valeur obtenue par 49), une qui va favoriser plutôt le pixel central, ou des filtres adaptatifs, tels que les valeurs de la matrice de convolution ait une valeur dépendant d'une relation mathématique, comme par exemple celle qui définit une surface gaussienne (en forme de cloche). Dans ce cas, la valeur du pixel central reste prédominante, mais les pixels environnants sont également pris en compte et ce d'autant moins qu'ils sont éloignés du pixel central.
Principe de base :
Dans cette étude j'ai utilisé une image qui m'a été confiée par Thierry Legault que je remercie au passage.
Il s'agit d'un composite de 20 images de 0.3 secondes, au foyer F/35 de son Schmidt Cassegrain de 30cm, avec un filtre rouge. Le 6 Janvier 2002 à 0h06 TU.
Il s'agit d'une image acquise avec une caméra CCD, donc possèdant un haut rapport signal sur bruit. Les conclusions de ce travail ne sont donc pas forcèment exploitables tels quels pour une image possèdant une qualité plus faible, telle que par exemple une image obtenue avec une webcam, possèdant une dynamique de 8 bits (255 niveaux de gris).
Voici donc un exemple de base :
Image originale : Image masquée avec une largeur à mi hauteur de 2, et un coefficient de 10
La manière dont le masque flou fonctionne est simple à comprendre. Voici la procédure en langage script de PRISM :
Pour les personnes non familières à la programmation en général, les lignes commencant par REM sont des remarques (des commentaires), les autres sont des instructions.
REM Execute un masque flou sur une image
print "Indiquez le nom de l'image :"
REM on demande le nom de l'image
getfilename Nom$
REM on demande la taille de la gaussienne et le coefficient
Input "Sigma de la Gaussienne : " Sigma
Input "Coef : " Coef
REM on ouvre l'image
open img1 Nom$
REM on réalise une copie de l'image
duplicate img1 img2
REM On lui applique un filtre gaussien de largeur à mi hauteur sigma
gauss img2 Sigma
REM on réalise à nouveau une copie de l'originale
duplicate img1 img3
REM à laquelle on soustrait l'image filtrée (floue)
sub img3 img2
REM on multiplie ce sandwich par une constante
mult img3 coef
REM on aditionne le tout à l'image originale
add img1 img3
REM on ferme les images intermédiaires.
close img2
close img3
Voici dans le détail les opérations pour un masque (2,5) (avec un filtre dont la largeur à mi hauteur est de 2 pixels, avec un coefficient d'amplification de 5) :
Image originale et Image convoluée par un filtre gaussien de largeur à mi hauteur 2
Soustraction des deux images La même multipliée par un facteur 5
Et l'addition de ce masque à l'image originale, pour le résultat final:
On voit que sur le masque de détail, il existe un bord noir autour de la planète, dans cette zone les pixels ont une valeur négative. Lorsque l'on traite une image stellaire, ceci produit une auréole noire autour des étoiles, formant ce que l'on appelle "des étoiles au beurre noir". Il existe une manière de supprimer cet effet en "clippant", c'est à dire en mettant à zéro les pixels dont la valeur est négative. De la même façon, si l'on pousse trop loin l'effet du masque, on peut obtenir des "détails" qui n'ont plus rien à voir avec la réalité.
Au niveau du calcul, on voit que les deux procédures, photographique et digitale sont légérement différentes, mais dans le principe il s'agit de la même chose.
Si on dénote Img l'image, Gauss, l'image convoluée par le filtre gaussien, et coeff le coefficient de multiplication du masque de détail, on réalise ((Img - Gauss) x coeff) + Img alors qu'en photographie, on aurait plutôt : Img - (coeff x Gauss)
L'expression originale ((Img - Gauss) x coeff) + Img peut aussi s'écrire : Img x (coeff + 1) - (Gauss x coeff), ou si l'on veut : Img - (Gauss x coeff/(coeff+1))
Donc on voit qu'à une légère différence au niveau de l'expression du coefficient, les deux procédures sont identiques.
Comment choisir la largeur du filtre et le coefficient multiplicatif ?
J'ai réalisé le tableau suivant avec les différents coefficients, et en réalisant une visualisation automatique sous PRISM (le tout avec un petit script).
De gauche à droite, l'image masquée avec l'image filtrée multipliée par un facteur allant de 0.6 à 1 par pas de 0.1. Donc l'image la plus à droite est le "masque de détail".
Pour des raisons de place, j'ai été obligé de diminuer les images d'un facteur 2
De haut en bas, le filtre gaussien va d'une taille de 1 à une taille de 9 pixels (en fait demi largeur du filtre).
Vers le bas à droite, le fond de ciel est clair, montrant l'effet de rebord du au filtre. Un calage des seuils de visualisation permettrait de supprimer cet effet. Je n'ai pas pris le temps de le faire en manuel sur les images.
Certaines images ne sont pas réellement utiles. Mais comme le tout a été généré par une seule macro, autant ne pas s'en priver et voir ce que ca donne, y compris avec des réglages pas adapté à cette image. Soyons exhaustifs.
Je ne sais pas pour vous, mais personellement, celle qui me plait le plus serait plutôt dans le côté haut droit de ce tableau (filtre de 1 à 2 de largeur, et masque multiplié par 0.9, ce qui dans la fonction programmée de masque flou, doit correspondre à un facteur multiplicatif de 20 (parce que 20/21 = 0.9523 ).
Seul problème, PRISM est pour l'instant limité à un facteur multiplicatif de 15, ce qui correspond à un facteur de 0.93. Si l'on utilise le script par contre, on peut faire ce que l'on veut.
J'ai donc exploré plus en détail cette zone, en couvrant les largeurs de filtre de 1.3 à 2.2, et les facteurs d'atténuation du masque de 0.9 à 0.98 le tout par pas de 0.2.
Pour la procédure typique digitale, les largeurs à mi hauteur des filtres sont identiques, et les facteurs multiplicateurs vont donc de 11.5, 15.6, 24 et 49.
Le seuil de visualisation de ces images ont été ajustées manuellement, généralement parce que la partie centrale était trop blanche, et en remontant également un peu le fond de ciel. La manipulation de ces images est complétement linéaire. En utilisant un programme graphique (Paint Shop Pro, Photoshop), il serait faisable de modifier le contraste local des images (par exemple en ajustant le gamma de l'image). Ce n'est pas fait ici.
Le tout étant une affaire de goût, en ce qui me concerne, je suis à nouveau plus à l'aise dans la partie haute droite du tableau.