<< | Liste des exercices | Étiquetage des blobs >>

1. Calcul des distances généralisées

Afin de déterminer la meilleure correspondance entre les blobs décrivant le contenu des images courante et précédente, nous avons vu en cours qu'il faut calculer une distance.

Distance euclidienne

Dans un premier temps, on va utiliser une distance euclidienne pour déterminer la similarité de tous les couples (nouveau blob, ancien blob) calculés à partir des listes contenues dans les variables sNewBlobs et sOldBlobs. Pour ce faire, on ne considère que les coordonnées des centres des blobs.

  1. Modifier la partie du code suivant, qui initialement affecte la valeur -1.0 à toutes les distances:
/* ------------------------------------------------------
Calcul des distances generalisees
------------------------------------------------------ */
for (i = 0; i < iOldBlobs; i++) {
    for (j = 0; j < iNewBlobs; j++) {
        // A modifier !!!
        dDistance[iNewBlobs * i + j] = -1.0;
    }
}
  1. Expliquer comment les distances sont stockées dans la zone mémoire qui débute à l'adresse contenue dans la variable dDistance. Pour vérifier que votre code calcule correctement le tableau des distances, vous pouvez déplacer derrière ce dernier la série d'instructions qui affiche la zone mémoire dDistance:
// Affichage pour verification
for (i = 0; i < iOldBlobs; i++) {
    for (j = 0; j < iNewBlobs; j++) {
        printf (" %7.2lf", dDistance[iNewBlobs * i + j]);
    }
    printf ("\n");
}
printf ("\n");

Calcul du minimum des distances

Dans l'algorithme qui permet de trouver les associations entre blobs, la deuxième étape consiste à rechercher le minimum des listes de distances, soit selon les lignes, soit selon les colonnes. Le choix entre ces deux options dépend du nombre de blobs présents dans les images courante et précédente.

Dans notre cas, afin de visualiser simplement si les valeurs minimales sont correctement marquées, on va forcer à la valeur -1.0 tous les éléments du tableau qui ne correspondent pas aux distances minimales.

  1. Pour ce faire, il faut compléter la portion suivante du code:
/* ------------------------------------------------------
Calcul du minimum des distances en ligne ou colonne
------------------------------------------------------ */
if (iNewBlobs > iOldBlobs) {
    // Calcul du minimum en lignes
    // A completer !!!
}
else {
    // Calcul du minimum en colonnes
    // A completer !!!
}

Comme auparavant, pour vérifier que tous les éléments de la matrice ne correspondant pas aux valeurs minimales ont été correctement ramenés à la valeur -1.0 après le traitement, vous pouvez dupliquer le bloc d'affichage du contenu du tableau.

La partie suivante du code ne doit pas être modifiée. Elle sert simplement à retirer du tableau les valeurs de distance qui sont supérieures à un certain seuil (stocké dans la variable dSeuilDistance. A la suite de cette partie du code, on peut vérifier que le tableau ne contient qu'au plus une seule valeur différente de -1.0 dans chaque ligne et chaque colonne.

/* ------------------------------------------------------
Elimination des distances min superieures au seuil
------------------------------------------------------ */
for (i = 0; i < iOldBlobs * iNewBlobs; i++) {
    if (dDistance[i] > dSeuilDistance) {
        dDistance[i] = -1.0;
    }
}

Passage à une distance généralisée

  1. Modifier la partie du code qui calcule les distances afin de tenir compte non seulement de la distance euclidienne entre les centres des blobs, mais également de la différence entre les racines carrées de leurs surfaces. Vérifier s'il faut ajuster le seuil dSeuilDistance qui permet d'éviter d'associer des couples de blobs considérés comme trop différents.