From 7244b4c8296b1aefa4b61979bd02fc4e586b7e64 Mon Sep 17 00:00:00 2001 From: tTh Date: Sat, 1 Jul 2023 00:48:50 +0200 Subject: [PATCH] NEED MORE DEBUG --- experiment/mnt.c | 131 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 116 insertions(+), 15 deletions(-) diff --git a/experiment/mnt.c b/experiment/mnt.c index 304110f..f0e1df9 100644 --- a/experiment/mnt.c +++ b/experiment/mnt.c @@ -1,5 +1,5 @@ /* - * Modeles Numeriques de Terrain + * Modeles Numeriques de Terrain -- UGLY CODE INSIDE !! * */ @@ -7,51 +7,145 @@ #include #include #include +#include #include "../floatimg.h" int verbosity; +/* ------------------------------------------------------------------- */ +/* for debug purpose */ +int calcul_histo_gray(FloatImg *img, char *fname, int nbslots, float *pmax) +{ +int offset, nbpix, ival; +FILE *fp; +float pixel, minp, maxp; + +int *counts; + +#if DEBUG_LEVEL +fprintf(stderr, ">>> %s ( %p '%s' %d )\n", __func__, + img, fname, nbslots); +#endif + +if (FIMG_TYPE_GRAY != img->type) { + return -2; + } + +/* allocate memory for histogram computation */ +counts = calloc(nbslots, sizeof(int)); +if (NULL == counts) { + fprintf(stderr, "malloc fail in %s\n", __func__); + abort(); + } + +nbpix = img->width * img->height; +minp = 1e10, maxp = -1e10; + +for (offset=0; offsetR[offset]; + if (pixel < minp) minp = pixel; + if (pixel > maxp) maxp = pixel; + } +fprintf(stderr, " values = %g < %g\n", minp, maxp); + +*pmax = maxp; /* copy value for the caller */ + +/* calcul de l'histogramme avec scaling */ +for (offset=0; offsetR[offset]; + ival = (int)((pixel * (float)nbslots) / maxp); + counts[ival]++; + // fprintf(stderr, "%6d %10.6f %i\n", offset, pixel, ival); + } + +if (NULL == (fp = fopen(fname, "w"))) { + perror(fname); + exit(1); + } +for (ival=0; ival>> %s ( %p %p )\n", __func__, src, dst); +#endif #define W (src->width) #define DX 1.0 #define DY 1.0 +/* allocate a graylevel image for storing la 'pente' */ +memset(&tmp, 0, sizeof(FloatImg)); +foo = fimg_create(&tmp, src->width, src->height, FIMG_TYPE_GRAY); +if (foo) { + fprintf(stderr, "create tmp pic --> %d\n", foo); + return foo; + } +/* calcul de la pente : a vérifier ! */ for (y=0; y<(src->height-1); y++) { for (x=0; x<(src->width-1); x++) { - offset = (y * src->width) + x; + offset = (y * W) + x; z1 = src->R[offset]; z2 = src->R[offset+1]; z3 = src->R[offset+W]; z4 = src->R[offset+W+1]; - a = ( z1 + z2 + z3 + z4) / 4.0; b = (-z1 + z2 - z3 + z4) / 2.0 / DX; c = (-z1 - z2 + z3 + z4) / 2.0 / DY; - pente = atanf(sqrt(b*b + c*c)); - - dst->R[offset] = 0; - if (pente < 0.0) dst->G[offset] = pente; - else dst->B[offset] = pente; - - + tmp.R[offset] = pente; } } +foo = calcul_histo_gray(&tmp, "histogramme.data", 499, &maxp); +if (foo) fprintf(stderr, "<<< calcul histo -> %d\n", foo); + + +minp = 1e10; +seuil = 0.640 * maxp; +fprintf(stderr, "seuil = %f\n", seuil); + +for (offset=0; offset<(src->width*src->height); offset++) { + pente = tmp.R[offset]; + if (pente > seuil) { + if (pente < minp) minp = pente; + } + if (pente > maxp) maxp = pente; + } +fprintf(stderr, "minp --> %f maxp --> %f\n", minp, maxp); + +/* recopie dans l'image destination avec translation hauteur */ +for (offset=0; offset<(src->width*src->height); offset++) { + pente = tmp.R[offset] - minp; + if (pente < 0.0) pente = 0.0; + dst->R[offset] = pente; + dst->G[offset] = pente; + dst->B[offset] = pente; + } + +/* clean the memory */ +fimg_destroy(&tmp); + return 0; } /* ------------------------------------------------------------------- */ @@ -61,15 +155,17 @@ FloatImg src, dst; char *infile, *outfile; int foo; +verbosity = 1; /* FIXME */ + if (3 != argc) { - fprintf(stderr, "%s need 2 args : infile & outfile\n", argv[0]); + fprintf(stderr, "'%s' need 2 args : infile & outfile\n", argv[0]); fimg_print_version(0); exit(1); } infile = argv[1]; outfile = argv[2]; -fprintf(stderr,"--- working on %s\n", infile); +if (verbosity) fprintf(stderr,"*** MNT %s -> %s\n", infile, outfile); foo = fimg_create_from_dump(infile, &src); if (foo) { @@ -82,6 +178,7 @@ if (foo) { fprintf(stderr, "err %d cloning image\n", foo); exit(1); } +fimg_clear(&dst); foo = brotche_mnt_style(&src, &dst); if (foo) { @@ -95,6 +192,10 @@ if (foo) { exit(1); } +/* clean the memory */ +fimg_destroy(&src); +fimg_destroy(&dst); + return 0; } /* ------------------------------------------------------------------- */