#include "include.h"

/****************************************
* Segmentation de la balustrade
* de l'image de la bibliotheque
*
* Thomas Maure - ENST - Avril 1997
****************************************/

main (argc, argv) int argc; char * argv[];
{
IMAGE ** images; int i, num;

/* INITIALISATION DE 10 IMAGES */
images = init_all_images (10,437, 590);

/* Premiere phase : Extraction par seuillage
* et filtrage de la balustrade
*/
if(1)
{
/* CHARGEMENT DE L'IMAGE */
mm0_imagin_enst (images[0], "original");

/* seuillage direct */
mm0_thresh(images[0],images[1],130,256);
mm0_imaout_enst(images[1],"seuil");

/* petite ouverture pour deconnecter */
mm0_open(images[1],images[2],images[9],1);
mm0_imaout_enst(images[2],"seuil_ouvert");

/* grosse ouverture lineaire pour tout filtrer
* sauf la balustrade horizontale
*/
mm0_lin_open(images[2],images[3],25,0,0);

/* reconstruction */
mm0_recons(images[3],images[2]);
mm0_imaout_enst(images[3],"recons");

/* filtre alterne pour remplir les trous et
* filtrer les barbules
*/
mm0_open(images[3],images[3],images[9],1);
mm0_close(images[3],images[3],images[9],1);
mm0_imaout_enst(images[3],"seuil_filtre");
}

/* Deuxieme phase : Reconnection de la balustrade */
if(1)
{
/* CHARGEMENT DE L'IMAGE BINAIRE SEUILLEE */
mm0_imagin_enst(images[0], "seuil_filtre");
mm0_imagin_enst (images[8], "original");
mm0_copy(images[0],images[1]);

/* calcul de la distance hexagonale pour une reconnection */
mm0_distance_hexa(images[1]);
mm0_calgebre(images[1],8,images[1],LCR_MIN);
mm0_imaout_enst(images[1],"distance");

/* dilatation geodesique pour supprimer les minimaux regionaux */
mm0_calgebre(images[1],+1,images[2],LCR_SUB);
mm0_num_dil_geod(images[2],images[1],0);

/* calcul des lignes de partage des eaux */
mm0_calgebre(images[1],-1,images[1],LCR_MUL);
mm0_calgebre(images[1],255,images[1],LCR_ADD);
mm0_lpe1(images[1],images[2]);
mm0_calgebre(images[2],1,images[2],LCR_MIN);
mm0_calgebre(images[2],1,images[2],LCR_XOR);
mm0_imaout_enst(images[2],"lpe");

/* dilatation des LPE, reconnection des contours */
mm0_dilate(images[2],images[2],images[9],4);
mm0_algebre(images[2],images[0],images[3],LCR_OR);
mm0_imaout_enst(images[3],"final_binaire");

/* calcule les contours trouves et les met en blanc */
mm0_erode(images[3],images[4],images[9],1);
mm0_algebre(images[3],images[4],images[4],LCR_SUB);
mm0_calgebre(images[4],255,images[4],LCR_MUL);

/* supprime le blanc 255 de l'image */
mm0_calgebre(images[8],254,images[8],LCR_MIN);

/* superpose les contours (en blanc) a l'image originale */
mm0_algebre(images[8],images[4],images[5],LCR_MAX);

/* sauve l'image finale */
mm0_imaout_enst(images[5],"final");
}
}