/* ----------------------------------------------------------------------------------------------------------- */
void routine_median_filter(char *src_path, char *noise_path, char *filename0, char *filename, char *denoise_path)
/* ----------------------------------------------------------------------------------------------------------- */
{
    char complete_filename[1024];
    char *sep;

    int radius;
    int k;
    int ndigit = 1;
    long i0, i1, j0, j1;
    uint8 **X0, **X, **Y;
    float32 p;

    // chargement de l'image sans bruit dans X0 et de l'image bruitee dans X
    // Y doit contenir l'image traitee
    generate_path_filename_extension(src_path, filename0, "pgm", complete_filename);
    X0 = LoadPGM_ui8matrix(complete_filename, &i0, &i1, &j0, &j1);
    generate_path_filename_extension(noise_path, filename, "pgm", complete_filename);
    X  = LoadPGM_ui8matrix(complete_filename, &i0, &i1, &j0, &j1);
    Y = ui8matrix(i0, i1, j0, j1);

    // -------------------
    // -- median kernel --
    // -------------------
    sep = "_M_";

    radius = 1; // parametre du bloc de code
    k = radius;
    median_ui8matrix(X, i0, i1, j0, j1, radius, Y);
    p = psnr(X0, i0, i1, j0, j1, Y);
    generate_path_filename_sep_k_ndigit_extension(denoise_path, filename, sep, k, ndigit, "pgm", complete_filename);
    printf("%s -> PSNR = %8.2f db\n", complete_filename, p);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);
    // ajouter ici d'autre instances du bloc de code avec d'autres valeurs de radius
}
/* ------------------------------------------------------------------------------------------ */
void routine_generate_sample(uint8 background, uint8 foreground, char *filename, char *dst_path)
/* ------------------------------------------------------------------------------------------ */
{
    // creation d'un carre d'intensite foreground sur un fond d'intensite background
    char complete_filename[1024];

    //int i, j;
    long size = 32;
    long i0, i1, j0, j1;
    uint8 **X;

    i0 = 0;
    i1 = size-1;
    j0 = 0;
    j1 = size-1;

    X = ui8matrix(0, size-1, 0, size-1);

    init_ui8matrix_param(X, 0, size-1, 0, size-1, background, 0, 0);
    init_ui8matrix_param(X, size/4, size-1-size/4, size/4, size-1-size/4, foreground, 0, 0);

    generate_path_filename_extension(dst_path, filename, "pgm", complete_filename); puts(complete_filename);
    SavePGM_ui8matrix(X, 0, size-1, 0, size-1, complete_filename);

    free_ui8matrix(X, 0, size-1, 0, size-1);
}
/* ---------------------------------------------------------------------- */
void routine_impulse_noise(char *src_path, char *filename, char *noise_path)
/* ---------------------------------------------------------------------- */
{
    char complete_filename[1024];
    char *sep = "_IN_"; // Impulse Noise
    float32 percent;
    int ndigit = 3; // codage du 3 chiffres du pourcentage de bruit impulsionnel dans le nom du fichier
    long i0, i1, j0, j1;
    uint8 **X, **Y;
    float32 p;

    // chargement de l'image et allocation d'une image avec des bords
    generate_path_filename_extension(src_path, filename, "pgm", complete_filename); puts(complete_filename);
    X = LoadPGM_ui8matrix(complete_filename, &i0, &i1, &j0, &j1);
    Y = ui8matrix(i0, i1, j0, j1);

    percent = 0.5f; // parametre du bloc de code
    //printf("%4d : ",(int)(10.0f*percent));
    impulse_noise_ui8matrix(X, i0, i1, j0, j1, percent/100.0f, Y);
    p = psnr(X, i0, i1, j0, j1, Y);
    generate_path_filename_sep_k_ndigit_extension(noise_path, filename, sep, (int)(10.0f*percent), ndigit, "pgm", complete_filename);
    printf("%s -> PSNR = %8.2f db\n", complete_filename, p);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);


    // ajouter ici d'autre instances du bloc de code avec d'autres valeurs de percent

 }
/* ---------------------------------------------------------- */
void routine_fgl(char *src_path, char *filename, char *dst_path)
/* ---------------------------------------------------------- */
{
    char complete_filename[1024];
    char *sep1 = "_FGL_";
    char *sep2 = "_FGLG_";
    int k;
    int ndigit = 2;
    uint8 **X, **Y, **Z;
    long i0, i1, j0, j1;
    
    float32 alpha;
    
    generate_path_filename_extension(src_path, filename, "pgm", complete_filename); puts(complete_filename);
    X = LoadPGM_ui8matrix(complete_filename, &i0, &i1, &j0, &j1);
    Y = ui8matrix(i0, i1, j0, j1);
    Z = ui8matrix(i0, i1, j0, j1);
    
    /*alpha = 0.4; // parametre
    k = (int) (10*alpha);
    fgl_ui8matrix(X, i0, i1, j0, j1, alpha, Y);
    //roberts_ui8matrix(Y, i0, i1, j0, j1, Z);
    sobel_ui8matrix(Y, i0, i1, j0, j1, Z);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep1, k, ndigit, "pgm", complete_filename); puts(complete_filename);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep2, k, ndigit, "pgm", complete_filename); puts(complete_filename);
    SavePGM_ui8matrix(Z, i0, i1, j0, j1, complete_filename);*/
    
    alpha = 0.8; // parametre
    k = (int) (10*alpha);
    fgl_ui8matrix(X, i0, i1, j0, j1, alpha, Y);
    roberts_ui8matrix(Y, i0, i1, j0, j1, Z);
    //sobel_ui8matrix(Y, i0, i1, j0, j1, Z);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep1, k, ndigit, "pgm", complete_filename); puts(complete_filename);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep2, k, ndigit, "pgm", complete_filename); puts(complete_filename);
    SavePGM_ui8matrix(Z, i0, i1, j0, j1, complete_filename);
    
    double_intensity_ui8matrix(Z, i0, i1, j0, j1, Z);
    double_intensity_ui8matrix(Z, i0, i1, j0, j1, Z);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, "VISU", k, ndigit, "pgm", complete_filename); puts(complete_filename);
    SavePGM_ui8matrix(Z, i0, i1, j0, j1, complete_filename);
    
    // free
    free_ui8matrix(X, i0, i1, j0, j1);
    free_ui8matrix(Y, i0, i1, j0, j1);
}    
/* ----------------------------------------------------------------------------------------- */
void routine_contour_threshold(char *src_path, char *filename, uint8 threshold, char *dst_path)
/* ----------------------------------------------------------------------------------------- */
{
    char complete_filename[1024];
    char *sep;
    int k;
    int optimal_threhsold;
    int ndigit = 3; // nombre de chiffres pour coder le seuil
    uint8 value = 255;
    uint8 **X, **Y;
    long i0, i1, j0, j1;
    
    puts("=================================");
    printf(" === %s ===\n", filename);
    puts("=================================");
    
    k = threshold;
    generate_path_filename_extension(src_path, filename, "pgm", complete_filename); puts(complete_filename);
    X = LoadPGM_ui8matrix(complete_filename, &i0, &i1, &j0, &j1);
    Y = ui8matrix(i0, i1, j0, j1);
    
    display_ui8matrix(X, i0, i1, j0, j1, "%4d", filename);
        
    puts("\n=============================================\n");
    
    sep = "_T_";
    threshold_ui8matrix(X, i0, i1, j0, j1, threshold, value, Y);
    display_ui8matrix(Y, i0, i1, j0, j1, "%4d", "Thresold");
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep, k, ndigit, "pgm", complete_filename); puts(complete_filename);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);
    
    puts("\n=============================================\n");
    
    sep = "_OTSU_";
    optimal_threhsold = calc_otsu_threshold_ui8matrix(X, i0, i1, j0, j1);
    k = optimal_threhsold;
    threshold_ui8matrix(X, i0, i1, j0, j1, optimal_threhsold, value, Y);
    display_ui8matrix(Y, i0, i1, j0, j1, "%4d", "Otsu threshold");   
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep, k, ndigit, "pgm", complete_filename); puts(complete_filename);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);
   
    free_ui8matrix(Y, i0, i1, j0, j1);
}    
/* -------------------------------- */
void test_histogram_equalization(void)
/* -------------------------------- */
{
    puts("==================================");
    puts("=== test_histogram_equalization===");
    puts("==================================");

    long i0, i1, j0, j1;

    char *filename;
    char complete_filename[1024];
    char     *src_path = IMAGE_SRC_PATH;
    char   *noise_path = IMAGE_NOISE_PATH;
    char *denoise_path = IMAGE_DENOISE_PATH;

    uint8 **X, **Y;

    filename = "carre64_GN_20";

    generate_path_filename_extension(noise_path, filename, "pgm", complete_filename); puts(complete_filename);
    X = LoadPGM_ui8matrix(complete_filename, &i0, &i1, &j0, &j1);
    Y = ui8matrix(i0, i1, j0, j1);
    ui32histogram_equalize_ui8matrix(X, i0, i1, j0, j1, Y);
    generate_path_filename_sep_extension(denoise_path, filename, "_HISTO_", "pgm", complete_filename); puts(complete_filename);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);

    // filename = "Hawkes_Bay";
    filename = "femme";

    generate_path_filename_extension(src_path, filename, "pgm", complete_filename); puts(complete_filename);
    X = LoadPGM_ui8matrix(complete_filename, &i0, &i1, &j0, &j1);
    Y = ui8matrix(i0, i1, j0, j1);
    ui32histogram_equalize_ui8matrix(X, i0, i1, j0, j1, Y);
    generate_path_filename_sep_extension(denoise_path, filename, "_HISTO_", "pgm", complete_filename); puts(complete_filename);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);

    printf("\n -> VOIR FICHIERS DE SORTIES\n");
}
Example #7
0
// --------------------------------------------
void bench_mandelbrot_SIMD(int n, int max_iter)
// --------------------------------------------
{
    // ne rien modifier dans cette fonction

    int h, w;
    float a0, a1, b0, b1;
    vuint32 **M32;
    uint32 **wM32;
    uint8 **M8;

    // chronometrie
    int iter, niter = 4;
    int run, nrun = 5;
    double t0, t1, dt, tmin, t;
    double cycles;

    //puts("---------------------------");
    //puts("-- bench_mandelbrot_SIMD --");
    //puts("---------------------------");
    h = w = n;

    M32 = vui32matrix(0, h-1, 0, w/4-1);
    M8  = ui8matrix(0, h-1, 0, w-1);
    wM32 = (uint32**) M32;

    // ne pas changer
    a0 = -1.5;
    a1 = +0.5;
    b0 = -1.0;
    b1 = +1.0;

    CHRONO(calc_mandelbrot_SIMD_F32(M32, h, w, a0, a1, b0, b1, max_iter), cycles);
    printf("SIMD F32: %10.2f\n", cycles/(n*n));

    CHRONO(calc_mandelbrot_SIMD_I32(M32, h, w, a0, a1, b0, b1, max_iter), cycles); // facultatif
    printf("SIMD I32: %10.2f\n\n", cycles/(n*n));

    DEBUG(convert_ui32matrix_ui8matrix(wM32, 0, h-1, 0, w-1, M8));
    DEBUG(SavePGM_ui8matrix(M8, 0, h-1, 0, w-1, "M_v.pgm"));

    free_vui32matrix(M32, 0, h-1, 0, w/4-1);
    free_ui8matrix(M8, 0, h-1, 0, w-1);
}
/* ------------------------------------------------------------ */
void routine_sobel(char *src_path, char *filename, char *dst_path)
/* ------------------------------------------------------------ */
{
    char complete_filename[1024];
    char *sep = "_S";
    uint8 **X, **Y;
    long i0, i1, j0, j1;
    
    generate_path_filename_extension(src_path, filename, "pgm", complete_filename); puts(complete_filename);
    X = LoadPGM_ui8matrix(complete_filename, &i0, &i1, &j0, &j1);
    Y = ui8matrix(i0, i1, j0, j1);
    
    sobel_ui8matrix(X, i0, i1, j0, j1, Y);
    generate_path_filename_sep_extension(dst_path, filename, sep, "pgm", complete_filename); puts(complete_filename);
    double_intensity_ui8matrix(Y, i0, i1, j0, j1, Y);
    
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);
    free_ui8matrix(Y, i0, i1, j0, j1);
}    
/* --------------------------------------------------------------------------------- */
void routine_threshold(char *src_path, char *filename, uint8 threshold, char *dst_path)
/* --------------------------------------------------------------------------------- */
{
    char complete_filename[1024];
    char *sep = "_T_";
    int k;
    int ndigit = 3;
    uint8 value = 255;
    uint8 **X, **Y;
    long i0, i1, j0, j1;

    k = threshold;
    generate_path_filename_extension(src_path, filename, "pgm", complete_filename); puts(complete_filename);
    X = LoadPGM_ui8matrix(complete_filename, &i0, &i1, &j0, &j1);
    Y = ui8matrix(i0, i1, j0, j1);

    threshold_ui8matrix(X, i0, i1, j0, j1, threshold, value, Y);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep, k, ndigit, "pgm", complete_filename); puts(complete_filename);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);
    free_ui8matrix(Y, i0, i1, j0, j1);
}
Example #10
0
// ----------------------------------------------
void bench_mandelbrot_scalar(int n, int max_iter)
// ----------------------------------------------
{
    // ne rien modifier dans cette fonction

    int h, w;
    int i0, i1, j0, j1;
    float a0, a1, b0, b1;
    uint32 **M32;
    uint8 **M8;


    // chronometrie
    int iter, niter = 4;
    int run, nrun = 5;
    double t0, t1, dt, tmin, t;
    double cycles;

    //puts("-----------------------------");
    //puts("-- bench_mandelbrot_scalar --");
    //puts("-----------------------------");

    h = w = n;
    M32 = ui32matrix(0, h-1, 0, w-1);
    M8  = ui8matrix(0, h-1, 0, w-1);

    a0 = -1.5;
    a1 = +0.5;
    b0 = -1.0;
    b1 = +1.0;

    CHRONO(calc_mandelbrot_scalar(M32, h, w, a0, a1, b0, b1, max_iter), cycles);
    printf("scalar:   %10.2f\n", cycles/(n*n));

    DEBUG(convert_ui32matrix_ui8matrix(M32, 0, h-1, 0, w-1, M8));
    DEBUG(SavePGM_ui8matrix(M8, 0, h-1, 0, w-1, "M_scalar.pgm"));

    free_ui32matrix(M32, 0, h-1, 0, w-1);
    free_ui8matrix(M8, 0, h-1, 0, w-1);
}
/* ----------------------------------------------------------------------------------------------------------- */
void routine_smooth_filter(char *src_path, char *noise_path, char *filename0, char *filename, char *denoise_path)
/* ----------------------------------------------------------------------------------------------------------- */
{
    char complete_filename[1024];
    char *sep;

    int k;
    float32 sigma;
    int radius;
    int ndigit;
    long i0, i1, j0, j1;
    uint8 **X0, **X, **Y;
    float32 **K;
    float32 p;

    // chargement de l'image bruitee dans X, et de l'image sans bruit dans X0
    // Y doit contenir l'image traitee
    generate_path_filename_extension(src_path, filename0, "pgm", complete_filename); puts(complete_filename);
    X0 = LoadPGM_ui8matrix(complete_filename, &i0, &i1, &j0, &j1);
    generate_path_filename_extension(noise_path, filename, "pgm", complete_filename); puts(complete_filename);
    X  = LoadPGM_ui8matrix(complete_filename, &i0, &i1, &j0, &j1);
    Y = ui8matrix(i0, i1, j0, j1);

    // ---------------------
    // -- gaussian kernel --
    // ---------------------
    sep = "_G_";
    ndigit = 2; // codage sur 2 chiffre de la valeur de sigma dans le nom du fichier

    sigma = 0.5; // parametre du bloc de code
    k = (int) (10*sigma); // code
    radius = (int) ceil(2*sigma+1);
    printf("sigma = %.1f -> radius = %d\n", sigma, radius);
    K = alloc_kernel(radius);
    init_gaussian_kernel(K, radius, sigma);
    convolve_kernel_ui8matrix(X, i0, i1, j0, j1, K, radius, Y);
    p = psnr(X0, i0, i1, j0, j1, Y);
    generate_path_filename_sep_k_ndigit_extension(denoise_path, filename, sep, k, ndigit, "pgm", complete_filename);
    printf("%s -> PSNR = %8.2f db\n", complete_filename, p);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);
    free_kernel(K, radius);

    // -----------------
    // -- average kernel
    // -----------------
    sep = "_A_";
    ndigit = 1; // codage sur 1 chiffre de la valeur de radius dans le nom du fichier

    radius = 1; // parametre du bloc de code
    k = radius; // code
    K = alloc_kernel(radius);
    init_average_kernel(K, radius);
    convolve_kernel_ui8matrix(X, i0, i1, j0, j1, K, radius, Y);
    p = psnr(X0, i0, i1, j0, j1, Y);
    generate_path_filename_sep_k_ndigit_extension(denoise_path, filename, sep, k, ndigit, "pgm", complete_filename);
    printf("%s -> PSNR = %8.2f db\n", complete_filename, p);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);
    free_kernel(K, radius);


    // liberation de la memoire
    free_ui8matrix(X0, i0, i1, j0, j1);
    free_ui8matrix(X,  i0, i1, j0, j1);
    free_ui8matrix(Y,  i0, i1, j0, j1);
}
/* --------------------------------------------------------------------- */
void routine_gaussian_noise(char *src_path, char *filename, char *dst_path)
/* --------------------------------------------------------------------- */
{
    char complete_filename[1024];
    char *sep = "_GN_"; // Gaussian Noise
    int sigma;
    int ndigit = 2; // codage sur 2 chiffres de la valeur de sigma dans le nom du fichier
    long i0, i1, j0, j1;
    uint8 **X, **Y;
    float32 p;

    // chargement de l'image sans bruit dans X
    // Y doit contenir l'image traitee
    generate_path_filename_extension(src_path, filename, "pgm", complete_filename); puts(complete_filename);
    X = LoadPGM_ui8matrix(complete_filename, &i0, &i1, &j0, &j1);
    Y = ui8matrix(i0, i1, j0, j1);


    sigma = 1; // parametre du bloc de code
    gaussian_noise_ui8matrix(X, i0, i1, j0, j1, (float32) sigma, Y);
    p = psnr(X, i0, i1, j0, j1, Y);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep, sigma, ndigit, "pgm", complete_filename);
    printf("%s -> PSNR = %8.2f db\n", complete_filename, p);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);

    // ajouter ici d'autre instances du bloc de code avec d'autres valeurs de sigma

    sigma = 2; // parametre du bloc de code
    gaussian_noise_ui8matrix(X, i0, i1, j0, j1, (float32) sigma, Y);
    p = psnr(X, i0, i1, j0, j1, Y);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep, sigma, ndigit, "pgm", complete_filename);
    printf("%s -> PSNR = %8.2f db\n", complete_filename, p);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);

    sigma = 3; // parametre du bloc de code
    gaussian_noise_ui8matrix(X, i0, i1, j0, j1, (float32) sigma, Y);
    p = psnr(X, i0, i1, j0, j1, Y);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep, sigma, ndigit, "pgm", complete_filename);
    printf("%s -> PSNR = %8.2f db\n", complete_filename, p);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);

    sigma = 4; // parametre du bloc de code
    gaussian_noise_ui8matrix(X, i0, i1, j0, j1, (float32) sigma, Y);
    p = psnr(X, i0, i1, j0, j1, Y);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep, sigma, ndigit, "pgm", complete_filename);
    printf("%s -> PSNR = %8.2f db\n", complete_filename, p);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);

    sigma = 5; // parametre du bloc de code
    gaussian_noise_ui8matrix(X, i0, i1, j0, j1, (float32) sigma, Y);
    p = psnr(X, i0, i1, j0, j1, Y);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep, sigma, ndigit, "pgm", complete_filename);
    printf("%s -> PSNR = %8.2f db\n", complete_filename, p);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);

    sigma = 10; // parametre du bloc de code
    gaussian_noise_ui8matrix(X, i0, i1, j0, j1, (float32) sigma, Y);
    p = psnr(X, i0, i1, j0, j1, Y);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep, sigma, ndigit, "pgm", complete_filename);
    printf("%s -> PSNR = %8.2f db\n", complete_filename, p);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);

    sigma = 20; // parametre du bloc de code
    gaussian_noise_ui8matrix(X, i0, i1, j0, j1, (float32) sigma, Y);
    p = psnr(X, i0, i1, j0, j1, Y);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep, sigma, ndigit, "pgm", complete_filename);
    printf("%s -> PSNR = %8.2f db\n", complete_filename, p);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);

    sigma = 30; // parametre du bloc de code
    gaussian_noise_ui8matrix(X, i0, i1, j0, j1, (float32) sigma, Y);
    p = psnr(X, i0, i1, j0, j1, Y);
    generate_path_filename_sep_k_ndigit_extension(dst_path, filename, sep, sigma, ndigit, "pgm", complete_filename);
    printf("%s -> PSNR = %8.2f db\n", complete_filename, p);
    SavePGM_ui8matrix(Y, i0, i1, j0, j1, complete_filename);

    // liberation de la memoire
    free_ui8matrix(X, i0, i1, j0, j1);
    free_ui8matrix(Y, i0, i1, j0, j1);
}