Détection de pics 2D#

DataLab fournit une fonctionnalté de « Détection de pics 2D » qui est basée sur un algorithme de filtrage minimum-maximum.

../../_images/peak2d_app_param.png

Paramètres de détection de pics 2D.#

La fonctionnalité s’utilise de la façon suivante :
  • Créer ou ouvrir une image dans l’espace de travail de DataLab

  • Sélectionner « Détection de pics 2D » dans le menu Analyse »

  • Saisir les paramètres « Taille de voisinage » et « Seuil relatif »

  • Cocher « Créer des régions d’intérêt » si vous souhaitez que des ROI soient définies pour chaque pic détecté (ce qui peut s’avérer utile en cas de calcul ultérieur sur chaque pic détecté, tel que par exemple une détection de contour).

../../_images/peak2d_app_results.png

Résultats d’une détection de pics 2D (voir le test « peak2d_app.py »)#

Les résultats sont affichés dans un tableau :
  • Chaque ligne est associée à un pic détecté

  • La première colonne contient l’indice de la ROI (0 si aucune ROI n’est définie)

  • Les deuxième et troisième colonnes contiennent les coordonnées des pics

../../_images/peak2d_app_zoom.png

Exemple de détection de pics 2D.#

L’algorithme de détection de pics 2D fonctionne de la manière suivante :
  • Tout d’abord, des images filtrées minimum-maximum sont calculées en utilisant un algorithme de fenêtre glissante dont la taille est définie par l’utilisateur (implémentation basée sur scipy.ndimage.minimum_filter et scipy.ndimage.maximum_filter)

  • Ensuite, la différence entre ces deux images filtrées est ecrêtée à une valeur correspondant à un seuil défini par l’utilisateur

  • L’image résultante est étiquetée en utilisant scipy.ndimage.label

  • Les coordonnées des pics sont ensuites obtenues en calculant le centre de chaque étiquette

  • Les doublons sont éventuellement supprimés

Les paramètrees de la détection de pics 2D sont les suivants :
  • « Taille de voisinage »: taille de la fenêtre glissante (cf. plus haut)

  • « Seuil relatif »: seuil de détection

La fonctionnalité est basée sur la fonction get_2d_peaks_coords du module cdl.algorithms :

def get_2d_peaks_coords(
    data: np.ndarray, size: int | None = None, level: float = 0.5
) -> np.ndarray:
    """Detect peaks in image data, return coordinates.

    If neighborhoods size is None, default value is the highest value
    between 50 pixels and the 1/40th of the smallest image dimension.

    Detection threshold level is relative to difference
    between data maximum and minimum values.

    Args:
        data: Input data
        size: Neighborhood size (default: None)
        level: Relative level (default: 0.5)

    Returns:
        Coordinates of peaks
    """
    if size is None:
        size = max(min(data.shape) // 40, 50)
    data_max = spi.maximum_filter(data, size)
    data_min = spi.minimum_filter(data, size)
    data_diff = data_max - data_min
    diff = (data_max - data_min) > get_absolute_level(data_diff, level)
    maxima = data == data_max
    maxima[diff == 0] = 0
    labeled, _num_objects = spi.label(maxima)
    slices = spi.find_objects(labeled)
    coords = []
    for dy, dx in slices:
        x_center = int(0.5 * (dx.start + dx.stop - 1))
        y_center = int(0.5 * (dy.start + dy.stop - 1))
        coords.append((x_center, y_center))
    if len(coords) > 1:
        # Eventually removing duplicates
        dist = distance_matrix(coords)
        for index in reversed(np.unique(np.where((dist < size) & (dist > 0))[1])):
            coords.pop(index)
    return np.array(coords)