00001
00002
00003
00004 #include <flgrCoreTypes.h>
00005 #include <flgrCoreErrors.h>
00006 #include <flgrCoreData.h>
00007 #include <flgrCoreCopy.h>
00008 #include <flgrCoreCompare.h>
00009 #include <flgrCoreIO.h>
00010 #include <flgrArith.h>
00011 #include <flgrImageIO.h>
00012 #include <flgrMeasureBase.h>
00013 #include <flgrMorphoBase.h>
00014
00015 FLGR_Ret flgr_quasi_distance(FLGR_Data2D *imout ,FLGR_Data2D *imresidu, FLGR_Data2D *imin, FLGR_Data2D *nhb) {
00016 FLGR_Data2D *imEro0 = flgr2d_create_from(imin);
00017 FLGR_Data2D *imEro1 = flgr2d_create_from(imin);
00018 FLGR_Data2D *imSub = flgr2d_create_from(imin);
00019 FLGR_Data2D *imq = flgr2d_create_from(imin);
00020 FLGR_Vector *vecvol1 = flgr_vector_create(imin->spp,FLGR_UINT64);
00021 FLGR_Vector *vecvol2 = flgr_vector_create(imin->spp,FLGR_UINT64);
00022 FLGR_Vector *vec64 = flgr_vector_create(imin->spp,FLGR_UINT64);
00023 FLGR_Vector *vec1 = flgr_vector_create(imin->spp,imin->type);
00024 FLGR_Vector *vec_i = flgr_vector_create(imin->spp,imin->type);
00025 FLGR_Vector *vec0 = flgr_vector_create(imin->spp,imin->type);
00026 int i;
00027 FLGR_Ret ret;
00028
00029 flgr2d_clear_all(imresidu);
00030 flgr2d_clear_all(imout);
00031
00032 flgr2d_copy(imEro0,imin);
00033
00034 flgr_vector_populate_from_string(vec0, "0");
00035 flgr_vector_populate_from_string(vec1, "1");
00036 flgr_vector_populate_from_string(vec64, "1");
00037
00038 flgr2d_measure_volume(imin,vecvol2);
00039 flgr_vector_add(vecvol1,vecvol2,vec64);
00040 i=0;
00041
00042 while(flgr_get_array_fgUINT64(vecvol1->array,0)>flgr_get_array_fgUINT64(vecvol2->array,0)) {
00043 i++;
00044 flgr_vector_copy(vecvol1,vecvol2);
00045
00046 flgr2d_erode(imEro1,imEro0,nhb);
00047 flgr2d_arith_sub(imSub,imEro0,imEro1);
00048
00049 flgr_vector_populate_from_scalar(vec_i, &i);
00050 flgr2d_replace_I_with_I_C_C(imq,imSub,">=",imresidu,vec_i,vec0);
00051
00052 flgr2d_arith_sup(imout,imout,imq);
00053 flgr2d_arith_sup(imresidu,imSub,imresidu);
00054
00055 flgr2d_copy(imEro0,imEro1);
00056 flgr2d_measure_volume(imEro1, vecvol2);
00057
00058 }
00059
00060 flgr2d_measure_volume(imout,vecvol1);
00061 flgr_vector_populate_from_string(vecvol2, "0");
00062
00063 while(flgr_get_array_fgUINT64(vecvol1->array,0) != flgr_get_array_fgUINT64(vecvol2->array,0)) {
00064 flgr_vector_copy(vecvol1,vecvol2);
00065 flgr2d_erode(imEro0, imout, nhb);
00066 flgr2d_arith_sub(imSub, imout, imEro0);
00067 flgr2d_arith_const_addsat_str(imEro1,imEro0,"1");
00068 flgr2d_replace_I_with_C_I_I(imout,imSub,">",vec1,imEro1,imout);
00069 flgr2d_measure_volume(imout,vecvol1);
00070 }
00071
00072 flgr2d_destroy(imEro0);
00073 flgr2d_destroy(imEro1);
00074 flgr2d_destroy(imSub);
00075 flgr2d_destroy(imq);
00076
00077 flgr_vector_destroy(vecvol1);
00078 flgr_vector_destroy(vecvol2);
00079 flgr_vector_destroy(vec64);
00080 flgr_vector_destroy(vec0);
00081 flgr_vector_destroy(vec1);
00082
00083 return FLGR_RET_OK;
00084 }
00085
00086
00087 int main(void) {
00088 FLGR_Data2D *imin,*imqdist, *imresidu;
00089 FLGR_Data2D *nhb1;
00090
00091 imin = flgr2d_load_pgm("../../images/gray/beans.pgm");
00092 imqdist = flgr2d_create_pixmap_from(imin);
00093 imresidu = flgr2d_create_pixmap_from(imin);
00094
00095 nhb1 = flgr2d_create_neighborhood_from_connexity(imin->spp,imin->type,FLGR_6_CONNEX);
00096
00097 flgr_quasi_distance(imqdist,imresidu,imin,nhb1);
00098
00099
00100 flgr2d_save_pgm(imqdist,"qdist.pgm",5);
00101
00102 flgr2d_destroy(imin);
00103 flgr2d_destroy(imqdist);
00104 flgr2d_destroy(imresidu);
00105 flgr2d_destroy(nhb1);
00106
00107 }