3. Utilisation du filtre LoG et détection multi-échelles

<< Seuillage des passages par 0 du Laplacien | Liste des exercices | >>

Introduction

Cet exercice a pour but de mettre en évidence, dans la détection des passages par 0 du Laplacien, l'avantage apporté par un lissage gaussien préalable à l'application du Laplacien. Nous verrons également comment le réglage de la largeur du filtre gaussien permet la détection des contours d'objets de plus ou moins grande taille.

Génération de masques pour l'opérateur LoG

La méthode fournie masqueLoG retourne le masque de l'opérateur Laplacien de gaussienne (LoG), de taille donnée et pour un écart-type sigma donné :

public static float[] masqueLoG(int tailleMasque, float sigma)
  1. Outre que le masque doit être de taille impaire, comment les paramètres tailleMasque et sigma sont-ils liés ?
  2. Utiliser la méthode masqueLoG dans la méthode run du plugin pour générer le masque LoG pour un écart-type $\sigma$ saisi par l'utilisateur, en tenant compte de la remarque de la question précédente.
  3. Calculer le LoG de l'image par convolution avec le masque ainsi généré.
Attention : il faut éviter une normalisation intempestive du masque par ImageJ. Pour cela, utiliser un objet Convolver dont on a pris soin de désactiver la normalisation avant convolution :
Convolver conv = new Convolver();
conv.setNormalize(false);
conv.convolve(fpLaplacian,masque,tailleMasque,tailleMasque);
  1. Si l'on choisit de seuiller les passages par 0 du laplacien ainsi filtré (LoG), comment la valeur du seuil doit-elle être choisie ? Plus précisément, comment choisir ce seuil en fonction de $\sigma$ et de la taille du voisinage considéré dans la détection des passages par 0 ?.
Remarque : il n'est pas demandé ici d'implémenter ce seuillage (une manipulation sous ImageJ suffit pour répondre à la question).

Détection multi-échelles (Optionnel)

La détection des passages par 0 du Laplacien implémentée à l'exercice 2 possède l'inconvénient de générer des contours épais. On propose de la remplacer par l'algorithme suivant :

// Pour chaque pixel (x,y),
float pixelC = imLaplacien.getPixelValue(x,y);		// Pixel central
float pixelD = imLaplacien.getPixelValue(x+1,y);	// Pixel droit
float pixelB = imLaplacien.getPixelValue(x,y+1);	// Pixel bas
float pixelBD = imLaplacien.getPixelValue(x+1,y+1);	// Pixel bas droit
// Détection des transitions Horizontales
if (pixelC<-seuil && pixelD>seuil) { // Transition horizontale -|+
    imZeros.set(x,y,255); }
if (pixelC>seuil && pixelD<-seuil) { // Transition horizontale +|-
    imZeros.set(x+1,y,255);}
// Détection des transitions Verticales
if (pixelC<-seuil && pixelB>seuil) { // Transition verticale -|+
    imZeros.set(x,y,255);}
if (pixelC>seuil && pixelB<-seuil) { // Transition verticale +|-
    imZeros.set(x,y+1,255);}
// Détection des transitions Diagonales
if (pixelC<-seuil && pixelBD>seuil) { // Transition diagonale -|+
    imZeros.set(x,y,255);}
if (pixelC>seuil && pixelBD<-seuil) { // Transition diagonale +|-
    imZeros.set(x+1,y+1,255);}
  1. Recopier cette portion code dans votre méthode laplacienZero, en l'adaptant éventuellement.
  2. Appliquer la détection de contours par filtre LoG pour différentes valeurs de $\sigma$ (par exemple, $\sigma$=1.4, 2 et 3). Quel intérêt présente cet algorithme de détection ?

Utilisation de la norme du gradient

On va enfin utiliser la norme du gradient pour seuiller les passages par 0 du Laplacien filtré (LoG).

  1. Calculer l'image (binaire) des passages par 0 du LoG de l'image spores, en fixant $\sigma$=1.4 mais sans seuil (seuil=0).
  2. Télécharger et installer le plugin Gradient, puis l'utiliser pour calculer l'image de la norme du gradient de l'image spores.
  3. Masquer l'image de la norme du gradient ainsi obtenue par celle des passages par 0 du Laplacien obtenue à la question 7, grâce au menu Process/Image Calculator... et l'opérateur AND.
  4. Appliquer un seuil sur l'image résultante grâce au menu Image/Adjust/Threshold.
  5. Comparer les points contours ainsi obtenus à ceux fournis par le plugin Gradient qui implémente la méthode de Canny (on fixera par exemple les seuils bas et haut de l'hystérésis respectivement à 8 et 20).