00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 #include <stdio.h>
00022 #include <string.h>
00023 #include <flgrCoreMalloc.h>
00024 #include <flgrCoreData.h>
00025 #include <flgrCoreDataIO.h>
00026 #include <flgrCoreIO.h>
00027 #include <flgrCoreCopy.h>
00028 #include <flgrCoreSlideWindow.h>
00029 #include <flgrCoreNhbManage.h>
00030 #include <flgrCoreDispatch.h>
00031 #include <flgrDataToolsFifo.h>
00032 
00033 #include "flgrMorphoWatershedSPP1.h"
00034 
00035 
00036 #define FLGR_MACRO_WATERSHED_SPP1_2D(dtype,dtypename,NB_FIFO)       \
00037   FLGR_Data2D *nhbOdd,*nhbEven;                     \
00038   FLGR_Data2D *nhb;                         \
00039   FLGR_NhbBox2D *cont;                          \
00040   FLGR_Fifo fifo[NB_FIFO];                      \
00041   int *cont_list_x;                         \
00042   int *cont_list_y;                         \
00043   dtype **label_ptr = (dtype**) imlabel->array;             \
00044   dtype **src_ptr = (dtype**) imsrc->array;             \
00045   dtype *cont_ptr;                          \
00046   dtype *cont_center_ptr;                       \
00047   dtype newcolor;                           \
00048   dtype val;                                \
00049   int i,j,w2,h2;                            \
00050   int x, y, z;                              \
00051   int m,n;                              \
00052                                     \
00053                        \
00054                         \
00055                        \
00056   for(i=0 ; i<NB_FIFO ; i++) {                      \
00057     flgr_fifo_init(fifo+i);                     \
00058   }                                 \
00059                                     \
00060               \
00061                 \
00062               \
00063   for(i=0 ; i<imsrc->size_y ; i++) {                    \
00064     for(j=0 ; j<imsrc->size_x ; j++) {                  \
00065                                         \
00066       if(flgr2d_get_data_array_##dtype(label_ptr,i,j) > 0) {        \
00067                                         \
00068     val = flgr2d_get_data_array_##dtype(src_ptr,i,j);       \
00069     flgr_fifo_push(fifo+val, 0, i, j);              \
00070                                         \
00071       }                                 \
00072                                     \
00073     }                                   \
00074   }                                 \
00075                                     \
00076                           \
00077                           \
00078                           \
00079   nhb = flgr2d_create_neighborhood_from_connexity(imsrc->spp,       \
00080                           dtypename,        \
00081                           connexity);       \
00082                                     \
00083   nhbOdd = flgr2d_create_neighborhood_from(nhb);            \
00084   nhbEven = flgr2d_create_neighborhood_from(nhb);           \
00085                                     \
00086   flgr2d_fill_nhbs_for_6_connexity(nhbEven,nhbOdd,nhb,FLGR_NHB_NO_SYM); \
00087                                     \
00088   flgr2d_destroy(nhb);                          \
00089                                     \
00090   cont = flgr2d_create_neighbor_box(nhbOdd);                \
00091                                     \
00092   w2 = cont->nhb_size_x >> 1;                       \
00093   h2 = cont->nhb_size_y >> 1;                       \
00094                                     \
00095   cont_list_x = cont->list_coord_x[0];                  \
00096   cont_list_y = cont->list_coord_y[0];                  \
00097   cont_ptr = (dtype*) cont->list_data_val[0];               \
00098   cont_center_ptr = (dtype*) cont->center_data_val->array;      \
00099                                     \
00100                                     \
00101   for(i=1 ; i<NB_FIFO ; i++) {                      \
00102     while( flgr_fifo_get_size(fifo+i) > 0) {                \
00103                                     \
00104       flgr_fifo_pop(fifo+i, &z, &y, &x);                \
00105                                     \
00106       nhb = ((y%2)==1 ? nhbOdd : nhbEven);              \
00107                                     \
00108       flgr2d_get_neighborhood_##dtype(cont,imlabel,nhb, y, x);      \
00109                                     \
00110       for(j=0 ; j<cont->size[0] ; j++) {                \
00111     n=y+cont_list_y[j]-h2;                      \
00112     m=x+cont_list_x[j]-w2;                      \
00113                                     \
00114     if(flgr_get_array_##dtype(cont_ptr,j) == 0) {           \
00115                                     \
00116       flgr2d_set_data_array_##dtype(label_ptr,n,m,          \
00117                     *cont_center_ptr);      \
00118                                     \
00119       newcolor = flgr2d_get_data_array_##dtype(src_ptr,n,m);    \
00120                                     \
00121       if(newcolor<i) {                      \
00122         newcolor=i+1;                       \
00123         while(newcolor<NB_FIFO-1) {                 \
00124           if(flgr_fifo_get_size(fifo+newcolor)!=0) break;       \
00125           newcolor++;                       \
00126         }                               \
00127       }      \
00128                                     \
00129       flgr_fifo_push(fifo+newcolor,0,n,m);              \
00130                                     \
00131     }               \
00132       }                       \
00133                                     \
00134     }                \
00135   }                            \
00136                                     \
00137   flgr2d_destroy(nhbOdd);                       \
00138   flgr2d_destroy(nhbEven);                      \
00139   flgr2d_destroy_neighbor_box(cont);                    \
00140                                     \
00141                          \
00142   for(i=0 ; i<NB_FIFO; i++) {                       \
00143     flgr_fifo_flush(fifo+i);                        \
00144   }                                 \
00145                                     \
00146   return
00147 
00148 
00149 void flgr2d_watershed_spp1_fgUINT8(FLGR_Data2D *imlabel, FLGR_Data2D *imsrc, FLGR_Connexity connexity) {
00150   FLGR_MACRO_WATERSHED_SPP1_2D(fgUINT8, FLGR_UINT8, 256);
00151 }
00152 
00153 void flgr2d_watershed_spp1_fgUINT16(FLGR_Data2D *imlabel, FLGR_Data2D *imsrc, FLGR_Connexity connexity) {
00154   FLGR_MACRO_WATERSHED_SPP1_2D(fgUINT16, FLGR_UINT16, 65536);
00155 }
00156 
00157 
00158