source: soft/giet_vm/applications/rosenfeld/src/ecc_generation.c @ 823

Last change on this file since 823 was 822, checked in by meunier, 9 years ago

In rosenfeld:

  • Updated nrio0, nrio1, nrio2, nrio1f, nrio2f, nrio1x, nrbool1, nrbool2 and nralloc1 in the nrc2 lib in order to use macro-typed functions
  • Updated the simulation script to include performance evaluation with random images, and a script to generate graphs
  • Updated the clock.h to use 64-bit integers, which potentially breaks the printing on the giet
File size: 18.2 KB
Line 
1/* ------------------------ */
2/* --- ecc_generation.c --- */
3/* ------------------------ */
4
5#include <stdio.h>
6#include <stdlib.h>
7#include <math.h>
8
9
10#ifdef CLI
11#include "nrc_os_config.h"
12#include "nrc.h"
13#endif
14
15
16#include "lutNR.h" // pour conversion 0,1 <-> 0,255
17
18#include "ecc_common.h"
19#include "ecc_features.h"
20
21#include "mt19937.h" // Mersenne Twister generator
22#include "ecc_generation.h"
23
24
25// --------------------------------------------------------------------------------------------------------------------------
26void generate_granularity_density_float(uint8 ** X, int i0, int i1, int j0, int j1, int granularity, float density, int seed)
27// --------------------------------------------------------------------------------------------------------------------------
28{
29    uint8 x;
30    double r;
31
32    //srand(seed); // pour toujours generer les meme sequences
33    init_genrand(seed);
34
35    for (int i = i0; i <= i1; i += granularity) {
36        for (int j = j0; j <= j1; j += granularity) {
37
38            //r = 100.0*(double)rand() / rmax;
39            //r = 100.0*(double)rand() / rmax;
40            r = 100.0 * (double) genrand_real2();
41            if (r <= density) {
42                x = 1;
43            }
44            else {
45                x = 0;
46            }
47
48            for (int di = 0; di < granularity; di++) {
49                for (int dj = 0; dj < granularity; dj++) {
50                    if ((i + di <= i1) && (j + dj <= j1)) {
51                        X[i + di][j + dj] = x;
52                    }
53                } // dj
54            } // di
55        } // j
56    } // i
57}
58
59// ----------------------------------------------------------------------------------------------------------------------
60void generate_granularity_density_int(uint8 ** X, int i0, int i1, int j0, int j1, int granularity, int density, int seed)
61// ----------------------------------------------------------------------------------------------------------------------
62{
63    generate_granularity_density_float(X, i0, i1, j0, j1, granularity, (float) density, seed);
64}
65
66// -----------------------------------------------------------------------------------------------------------
67void generate_granularity_density_name(char * name, int granularity, int density, char * filename, int maxlen)
68// -----------------------------------------------------------------------------------------------------------
69{
70    snprintf(filename, maxlen, "%s_%02d_%03d.pgm", name, granularity, density);
71}
72
73// ---------------------------------------------------------------------------------------------------------------------------------
74void generate_granularity_density_ext_name(char * name, int granularity, int density, char * extension, char * filename, int maxlen)
75// ---------------------------------------------------------------------------------------------------------------------------------
76{
77    snprintf(filename, maxlen, "%s_%02d_%03d.%s", name, granularity, density, extension);
78}
79// --------------------------------------------------------------------------------------------------------------------------
80void generate_size_granularity_density_name(char * name, int size, int granularity, int density, char * filename, int maxlen)
81// --------------------------------------------------------------------------------------------------------------------------
82{
83    snprintf(filename, maxlen, "%s_%d_%02d_%03d.pgm", name, size, granularity, density);
84}
85// -----------------------------------------------------------------------------------------------------------------------------------------------
86void generate_size_granularity_density_ext_name(char * name, int size, int granularity, int density, char *extension, char * filename, int maxlen)
87// -----------------------------------------------------------------------------------------------------------------------------------------------
88{
89    snprintf(filename, maxlen, "%s_%d_%02d_%03d.%s", name, size, granularity, density, extension);
90}
91// -----------------------------------------------------------------------------------------------------
92void generate_size_granularity_name(char * name, int size, int granularity, char * filename, int maxlen)
93// -----------------------------------------------------------------------------------------------------
94{
95    snprintf(filename, maxlen, "%s_%d_%02d.pgm", name, size, granularity);
96}// ------------------------------------------------------------------------------------------
97void generate_name100(char * name, int granularity, float density, char *filename, int maxlen)
98// -------------------------------------------------------------------------------------------
99{
100    // density en pourcentage: 0:100
101    // mais aussi <1, par exe 0.01
102    int d = (int) ceil(100 * density);
103    snprintf(filename, maxlen, "%s_%02d_%05d.pgm", name, granularity, d);
104}
105// ----------------------------------------
106int test_generation(int argc, char * argv[])
107// ----------------------------------------
108{
109    uint8 ** X;
110    uint8 ** X255;
111    char filename[32];
112
113    int n = 1024;
114    int border = 2;
115
116    int d; // density
117    int dmin = 5;
118    int dmax = 95;
119    int dstep = 5;
120
121    int g; // granularity
122    int gmin = 1;
123    int gmax = 16;
124
125    int seed = 0;
126
127    n = 256;
128    n = 2048;
129    n = 4096;
130   
131    X    = ui8matrix(0 - border, n - 1 + border, 0 - border, n - 1 + border);
132    X255 = ui8matrix(0 - border, n - 1 + border, 0 - border, n - 1 + border);
133
134    for (g = gmin; g <= gmax; g *= 2) {
135        for (d = dmin; d <= dmax; d += dstep) {
136            generate_granularity_density_int(X, 0, n - 1, 0, n - 1, g, d, seed);
137            generate_granularity_density_name("I", g, d, filename, 32);
138            printf(filename);
139            bin2gray_ui8matrix(X, 0, n - 1, 0, n - 1, X255);
140            SavePGM_ui8matrix(X255, 0, n - 1, 0, n - 1, filename); 
141        }
142    }
143    free_ui8matrix(X,    0 - border, n - 1 + border, 0 - border, n - 1 + border);
144    free_ui8matrix(X255, 0 - border, n - 1 + border, 0 - border, n - 1 + border);
145
146    return 0;
147}
148
149// ------------------------------------------
150void hline(uint8 ** X, int i, int j0, int j1)
151// ------------------------------------------
152{
153    for (int j = j0; j <= j1; j++) {
154        X[i][j] = 1;
155    }
156}
157// ------------------------------------------
158void vline(uint8 ** X, int i0, int i1, int j)
159// ------------------------------------------
160{
161    for (int i = i0; i <= i1; i++) {
162        X[i][j] = 1;
163    }
164}
165
166// ------------------------------------------------------------
167void draw_rectangle(uint8 ** X, int i0, int i1, int j0, int j1)
168// ------------------------------------------------------------
169{
170    hline(X, i0, j0, j1);
171    vline(X, i0, i1, j0);
172    vline(X, i0, i1, j1);
173    hline(X, i1, j0, j1);
174}
175
176// ---------------------------------------------------
177void spirale_simple(uint8 ** X, int height, int width)
178// ---------------------------------------------------
179{
180    int i0, j0; // point de depart haut
181    int i1, j1; //point de depart haut
182    int c, nc;  // nombre de carres
183    int n;      //min(height, width)
184   
185    zero_ui8matrix(X, 0, height - 1, 0, width - 1);
186   
187    if (height < width) {
188        n = height;
189    }
190    else {
191        n = width;
192    }
193   
194    // sans correction
195   
196   
197    // avec correction
198    i0 = 0;
199    i1 = 2 * (n / 2) - 1;
200    j0 = 0;
201    j1 = 2 * (n / 2) - 1;
202   
203    nc = n / 4;
204   
205    for (c = 0; c < nc; c++) {
206        draw_rectangle(X, i0 + 2 * c, i1 - 2 * c, j0 + 2 * c, j1 - 2 * c);
207        X[1 + 2 * c    ][0 + 2 * c    ] = 0;
208        X[1 + 2 * c + 1][0 + 2 * c + 1] = 1;
209    }
210   
211    // centre
212    //X[n/2][n/2] = 1;
213    for (c = i0 + 2 * nc; c <= i1 - 2 * nc; c++) {
214        hline(X, c, j0 + 2 * nc, j1 - 2 * nc);
215    }
216}
217
218// --------------------------------------------------
219void spirale_double(uint8 **X, int height, int width)
220// --------------------------------------------------
221{
222    int i0, j0; // point de depart haut
223    int i1, j1; //point de depart haut
224    int c, nc;  // nombre de carres
225    int n;      //min(height, width)
226   
227    zero_ui8matrix(X, 0, height-1, 0, width-1);
228   
229    if (height < width) {
230        n = height;
231    }
232    else {
233        n = width;
234    }
235   
236    // correction
237    //n = ((n-1) & (~0x3))+1;
238   
239    i0 = 0;
240    i1 = 2 * (n / 2) - 1;
241    j0 = 0;
242    j1 = 2 * (n / 2) - 1;
243   
244    nc = n / 4;
245   
246    for (c = 0; c < nc; c++) {
247        draw_rectangle(X, i0 + 2 * c, i1 - 2 * c, j0 + 2 * c, j1 - 2 * c);
248    }
249    for (c = 0; c < nc; c++) {
250        X[(i0 + 1) + (2 * c    )][(j0) + (2 * c    )] = 0;
251        X[(i0 + 1) + (2 * c + 1)][(j0) + (2 * c + 1)] = 1;
252       
253        X[(i1 - 1) - (2 * c    )][(j1) - (2 * c    )] = 0;
254        X[(i1 - 1) - (2 * c + 1)][(j1) - (2 * c + 1)] = 1;
255    }
256    // centre
257    //X[n/2][n/2] = 1;
258    for (c = i0 + 2 * nc; c <= i1 - 2 * nc; c++) {
259        hline(X, c, j0 + 2 * nc, j1 - 2 * nc);
260    }
261}
262// ------------------------
263void routine_spirale(int n)
264// ------------------------
265{
266    uint8 ** X;
267    uint8 ** X255;
268    char filename[128];
269    //char *ptr = (char*) filename;
270   
271    int h, w;
272    h = w = n;
273   
274    X    = ui8matrix(0, h - 1, 0, w - 1);
275    X255 = ui8matrix(0, h - 1, 0, w - 1);
276   
277    snprintf(filename, 128, "spirale_simple_%d.pgm", n);
278    spirale_simple(X, h, w);
279    bin2gray_ui8matrix(X,   0, h - 1, 0, w - 1, X255);
280    SavePGM_ui8matrix(X255, 0, h - 1, 0, w - 1, filename); 
281   
282    snprintf(filename, 128, "spirale_double_%d.pgm", n);
283    spirale_double(X, h, w);
284    bin2gray_ui8matrix(X,   0, h - 1, 0, w - 1, X255);
285    SavePGM_ui8matrix(X255, 0, h - 1, 0, w - 1, filename);/**/
286   
287    free_ui8matrix(X,    0, h - 1, 0, w - 1);
288    free_ui8matrix(X255, 0, h - 1, 0, w - 1);
289}
290
291// ---------------------------------------
292void test_spirale(int argc, char * argv[])
293// ---------------------------------------
294{
295    routine_spirale(128);
296    routine_spirale(127);
297    routine_spirale(126);
298    routine_spirale(125);
299   
300    routine_spirale(256);
301    routine_spirale(512);
302    routine_spirale(1024);
303}
304
305// ---------------------------------------------
306int test_generation_HGH(int argc, char * argv[])
307// ---------------------------------------------
308{
309    uint8 ** X;
310    uint8 ** X255;
311    char filename[32];
312
313    int h = 1280;
314    int w = 90 * 1024;
315
316    int border = 2;
317
318    float d = 0.01; // density
319    int g = 4; // granularity
320
321    int seed = 0;
322
323    //w = h;
324
325    X    = ui8matrix(0 - border, h - 1 + border, 0 - border, w - 1 + border);
326    X255 = ui8matrix(0 - border, h - 1 + border, 0 - border, w - 1 + border);
327
328    generate_granularity_density_float(X, 0, h - 1, 0, w - 1, g, d, seed);
329    generate_granularity_density_name("HGH", g, d, filename, 32);
330    printf(filename);
331    bin2gray_ui8matrix(X,   0, h - 1, 0, w - 1, X255);
332    SavePGM_ui8matrix(X255, 0, h - 1, 0, w - 1, filename); 
333
334    free_ui8matrix(X,    0 - border, h - 1 + border, 0 - border, w - 1 + border);
335    free_ui8matrix(X255, 0 - border, h - 1 + border, 0 - border, w - 1 + border);
336
337    return 0;
338}
339
340// ---------------------------------------------
341int image_analysis_2014(int argc, char * argv[])
342// ---------------------------------------------
343{
344    // uint8 **X;
345    // uint8 **X255;
346
347    // char filename[32];
348
349    // uint32 **E32; //algo pixel
350    // uint32 **E4; // algo LSL
351
352    // uint32 *T, *A; // tables equivalence
353
354    // // Label *label;
355
356    // uint32 nemax = NEMAX;
357
358    // int neamax = nemax;
359    // int ncmax = 10;
360   
361    // int n = 1024;
362    // int height, width;
363    // int border = 2;
364    // long i0, i1, j0, j1;
365
366    // int d; // density
367    // int dmin = 1;
368    // int dmax = 99;
369    // int dstep = 1;
370
371    // int g; // granularity
372    // int gmin = 1;
373    // int gmax = 2;
374    // int seed = 1;
375
376    // uint32 na;
377    // uint32 np_pixel, ne_pixel, na_pixel;
378    // uint32 ns_segment, ne_segment, na_segment;
379    // uint32 nb_step, nb_concavity;
380
381    // n = 256;
382    // n = 1024;
383    // //n = 2048;
384    // X    = ui8matrix(0-border, n-1+border, 0-border, n-1+border);
385    // X255 = ui8matrix(0-border, n-1+border, 0-border, n-1+border);
386
387    // i0 = 0; i1 = n-1; j0 = 0; j1 = n-1;
388    // height = n; width = n;     
389
390    // E32 = ui32matrix(i0-border, i1+border, j0-border, j1+border);
391    // E4  = ui32matrix(i0-border, i1+border, j0-border, j1+border);
392    // zero_ui32matrix(E32, i0-border, i1+border, j0-border, j1+border);
393    // zero_ui32matrix(E4,  i0-border, i1+border, j0-border, j1+border);
394
395    // T = ui32vector(0, nemax);
396    // A = ui32vector(0, nemax);
397
398    // initT(T, nemax);
399    // initT(A, nemax);
400
401    // // label = Label_pConstructor_Empty();
402    // // Label_Set_ImageB(label, X);
403    // // Label_Set_ImageL(label, E4);
404
405    // // Label_Set_Parameters           (label, width, height, neamax, ncmax);
406    // // Label_Set_AlgorithmicParameters(label, 32, 8, LABEL_STDZ, LABEL_SELKOW);
407    // // Label_Set_Optimisation(label, LABEL_RLEZ);
408    // // Label_Initialize(label);
409    // //Label_Enable_SecondLabeling(label);
410
411    // printf("image %d x %d\n", n, n);
412
413    // for(g=gmin; g<=gmax; g*=2) {
414       
415    //     printf("----------------\n");
416    //     printf("granulariry = %d\n", g);
417    //     printf("----------------\n");
418
419    //     printf("%3s",  "d");
420
421    //     printf("%8s", "np");
422    //     printf("%8s", "ne");
423    //     printf("%8s", "na");
424       
425    //     printf("%6s", "");
426
427    //     printf("%8s", "ns");
428    //     printf("%8s", "ne");
429    //     printf("%8s", "na");
430
431    //     printf("%6s", "");
432
433    //     printf("%8s", "nc");
434    //     printf("%8s", "ns");
435
436    //     printf("");
437       
438    //     for(d=dmin; d<=dmax; d+=dstep) {
439
440    //         zero_ui8matrix(X, 0, n-1, 0, n-1);
441    //         zero_ui32matrix(E32, 0, n-1, 0, n-1);
442    //         zero_ui32matrix(E4,  0, n-1, 0, n-1);
443    //         initT(T, nemax);
444    //         initT(A, nemax);
445    //         //printf("seed = %d\n", seed);
446    //         generate_granularity_density_int(X, 0, n-1, 0, n-1, g, d, seed);
447
448    //         //na = Rosenfeld_Analysis_8C(X, height, width, E32, T, A, nemax, Stats);
449    //         na = Rosenfeld_Analysis_8C(X, height, width, E32, T, A, nemax, &np_pixel, &ne_pixel, &na_pixel);
450    //         //Label32_Rosenfeld8_Features_SPEED(label);
451
452    //         ns_segment = label->ns;
453    //         ne_segment = label->nea;
454    //         na_segment = label->na;
455
456    //         nb_concavity = ne_segment - na_segment;
457    //         nb_step      = ne_pixel - ne_segment;
458
459    //         printf("%3d", d);
460
461    //         printf("%8d", np_pixel);
462    //         printf("%8d", ne_pixel);
463    //         printf("%8d", na_pixel);
464
465    //         printf("%6s", "");
466
467    //         printf("%8d", ns_segment);
468    //         printf("%8d", ne_segment);
469    //         printf("%8d", na_segment);
470
471    //         printf("%6s", "");
472
473    //         printf("%8d", nb_concavity);
474    //         printf("%8d", nb_step);
475
476    //         printf("");
477    //     }
478    //     printf("");
479    // }
480    // free_ui8matrix(X,    0-border, n-1+border, 0-border, n-1+border);
481    // free_ui8matrix(X255, 0-border, n-1+border, 0-border, n-1+border);
482
483    return 0;
484}
485// --------------------------
486void test_generation_mt(void)
487// --------------------------
488{
489    int n = 32;
490   
491    printf("---------------------------");
492    printf("-- test_mersenne_twister --");
493    printf("---------------------------");
494
495   
496    init_genrand(0);
497    for (int i = 0; i < n; i++) {
498        printf("%10lu ", genrand_int32());
499        if (i % 8 == 7) {
500            printf("\n");
501        }
502    }
503    printf("\n---");
504   
505    init_genrand(1);
506    for (int i = 0; i < n; i++) {
507        printf("%10lu ", genrand_int32());
508        if (i % 8== 7) {
509            printf("\n");
510        }
511    }
512    printf("\n---");
513   
514    init_genrand(0);
515    for (int i = 0; i < n; i++) {
516        printf("%10lu ", genrand_int32());
517        if (i % 8== 7) {
518            printf("\n");
519        }
520    }
521    printf("\n---");
522   
523    init_genrand(1);
524    for (int i = 0; i < n; i++) {
525        printf("%10lu ", genrand_int32());
526        if (i % 8 == 7) {
527            printf("\n");
528        }
529    }
530}
531
532// --------------------------------------
533void image_zoom2(int argc, char * argv[])
534// --------------------------------------
535{
536    uint8 x, ** X, ** Y;
537    int i0, i1, j0, j1;
538    int height, width;
539    char * src_filename;
540    char * dst_filename;
541   
542    if (argc < 3) {
543        printf("too few arguments");
544        printf("%s src.pgm dst.pgm\n", argv[0]);
545        return;
546    }
547   
548    src_filename = argv[1];
549    dst_filename = argv[2];
550   
551    X = LoadPGM_ui8matrix(src_filename, &i0, &i1, &j0, &j1);
552   
553    height = i1 - i0 + 1;
554    width  = j1 - j0 + 1;
555   
556    printf("width = %d height = %d\n", width, height);
557   
558    Y = ui8matrix(0, 2 * height - 1, 0, 2 * width - 1);
559   
560    for (int i = 0; i <= height - 1; i++) {
561        for (int j = 0; j <= width - 1; j++) {
562            x = X[i][j];
563            Y[2 * i + 0][2 * j + 0] = x;
564            Y[2 * i + 0][2 * j + 1] = x;
565            Y[2 * i + 1][2 * j + 0] = x;
566            Y[2 * i + 1][2 * j + 1] = x;
567        }
568    }
569    SavePGM_ui8matrix(Y, 0, 2 * height - 1, 0, 2 * width - 1, dst_filename);
570   
571    free_ui8matrix(X, 0,     height - 1, 0,     width - 1);
572    free_ui8matrix(Y, 0, 2 * height - 1, 0, 2 * width - 1);
573}
574
575
576// ---------------------------------------------
577void image_duplication2(int argc, char * argv[])
578// ---------------------------------------------
579{
580    uint8 x, ** X, ** Y;
581    int i0, i1, j0, j1;
582    int height, width;
583    char * src_filename;
584    char * dst_filename;
585   
586    if (argc < 3) {
587        printf("too few arguments");
588        printf("%s src.pgm dst.pgm\n", argv[0]);
589        return;
590    }
591   
592    src_filename = argv[1];
593    dst_filename = argv[2];
594   
595    X = LoadPGM_ui8matrix(src_filename, &i0, &i1, &j0, &j1);
596   
597    height = i1 - i0 + 1;
598    width  = j1 - j0 + 1;
599   
600    printf("width = %d height = %d\n", width, height);
601   
602    Y = ui8matrix(0, 2 * height - 1, 0, 2 * width - 1);
603   
604    // horizontal duplication
605    for (int i = 0; i <= height - 1; i++) {
606        for (int j = 0; j <= width - 1; j++) {
607            x = X[i][j];
608            Y[i][width + j] = x;
609        }
610    }
611   
612    // vertical duplication
613    for (int i = 0; i <= height - 1; i++) {
614        for (int j = 0; j <= 2 * width - 1; j++) {
615            x = X[i][j];
616            Y[height + i][j] = x;
617        }
618    }
619    SavePGM_ui8matrix(Y, 0, 2 * height - 1, 0, 2 * width - 1, dst_filename);
620   
621    free_ui8matrix(X, 0,     height - 1, 0,     width - 1);
622    free_ui8matrix(Y, 0, 2 * height - 1, 0, 2 * width - 1);
623}
624
625
626
627
Note: See TracBrowser for help on using the repository browser.