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