Changeset 2274 for research


Ignore:
Timestamp:
Apr 16, 2008, 12:09:26 AM (12 years ago)
Author:
Sam Hocevar
Message:
  • Implemented a few study modes:
    1. study displacement on progressive blends of 2 images
    2. exhaustive ED kernel optimisation using standard HVS gaussian distance
    3. exhaustive ED kernel optimisation using off-center gaussian distance
File:
1 edited

Legend:

Unmodified
Added
Removed
  • research/2008-displacement/main.c

    r2273 r2274  
    503503    float mat[NN][NN];
    504504    float *tmp, *tmp2;
    505     float e0, best, fx = -1., fy = -1., step = 2.;
     505    float e0, best = 0., fx = -1., fy = -1., step = 2.;
    506506    int dx, dy;
    507507
     
    541541    free(tmp);
    542542
    543     printf("%g -> %g for %g %g\n", 1000 * e0, 1000 * best, fx, fy);
     543    printf("E = %g E_min = %g dx = %g dy = %g\n",
     544           1000 * e0, 1000 * best, fx, fy);
    544545    fflush(stdout);
    545546}
     
    557558}
    558559
     560static void usage(char *argv[])
     561{
     562    fprintf(stderr, "Usage: %s <mode> [ARGS...]\n", argv[0]);
     563    fprintf(stderr, "Allowed modes:\n");
     564    fprintf(stderr, " -1 <src1> <src2>   raster FS displacement study on blends of src1 and src2\n");
     565    fprintf(stderr, " -2 <src>           quick (a,b,c,d) ED kernel analysis on src\n");
     566    fprintf(stderr, " -3 <src>           exhaustive (a,b,c,d) ED kernel analysis on src\n");
     567}
     568
    559569int main(int argc, char *argv[])
    560570{
    561571    float mat0[NN][NN];
    562572    float mat[NN][NN];
    563     float *src, *src2, *dest, *tmp, *tmp2;
     573    float *src;
    564574    float sigma;
    565     int dx, dy, a, b, c, d, i;
     575    int mode, dx, dy, i;
    566576
    567577    if(argc < 2)
    568         return 1;
    569 
    570     src = load(argv[1]);
     578    {
     579        fprintf(stderr, "%s: too few arguments\n", argv[0]);
     580        usage(argv);
     581        return EXIT_FAILURE;
     582    }
     583
     584    if(argv[1][0] != '-' || !(mode = atoi(argv[1] + 1)))
     585    {
     586        fprintf(stderr, "%s: invalid mode `%s'\n", argv[0], argv[1]);
     587        usage(argv);
     588        return EXIT_FAILURE;
     589    }
     590
     591    src = load(argv[2]);
    571592    if(!src)
    572593        return 2;
    573594
     595    switch(mode)
     596    {
     597        case 1:
     598        {
     599            float *src2, *dest, *tmp;
     600
     601            if(argc < 3)
     602                return 3;
     603            src2 = load(argv[2]);
     604            if(!src2)
     605                return 4;
     606
     607            for(i = 0; i <= 100; i++)
     608            {
     609                tmp = merge(src, src2, (float)i / 100.);
     610                dest = ed(tmp, false, 7, 0, 1, 3, 5, 0, 0, 0, 0, 0, 0, 0);
     611                study(tmp, dest, 1.2, 0.001);
     612                free(dest);
     613                free(tmp);
     614            }
     615            free(src2);
     616            free(src);
     617        }
     618        break;
     619
     620        case 2:
     621        case 3:
     622        {
     623            float *dest, *tmp, *tmp2;
     624            int a, b, c, d, e;
     625
     626            makegauss(mat0, 1.2, 0, 0);
     627            for(a = 0; a <= 16; a++)
     628            for(b = 0; b <= 16; b++)
     629            for(c = 0; c <= 16; c++)
     630            for(d = 0; d <= 16; d++)
     631            for(e = 0; e <= 16; e++)
     632            {
     633                if(a + b + c + d + e != 16)
     634                    continue;
     635
     636                /* Slightly shuffle our coefficients to avoid waiting until
     637                 * 75% progress before having an idea of what's going on. */
     638                int a2 = a, b2 = b, c2 = c, d2 = d, e2 = e;
     639#define SHUFFLE(p,q,n) \
     640    if(p+q) { int tmp = p+q; p = (p+n) % (tmp+1); q = tmp-p; }
     641                SHUFFLE(c2, d2, 7); SHUFFLE(b2, d2, 5);
     642                SHUFFLE(a2, d2, 3); SHUFFLE(b2, c2, 2);
     643                SHUFFLE(a2, e2, 3); SHUFFLE(b2, e2, 2);
     644                SHUFFLE(a2, c2, 4); SHUFFLE(a2, b2, 6);
     645                SHUFFLE(c2, e2, 9); SHUFFLE(d2, e2, 7);
     646                SHUFFLE(a2, d2, 9); SHUFFLE(a2, b2, 7);
     647
    574648#if 0
    575     if(argc < 3)
    576         return 3;
    577     src2 = load(argv[2]);
    578     if(!src2)
    579         return 4;
    580 
    581     for(i = 0; i <= 100; i++)
    582     {
    583         tmp = merge(src, src2, (float)i / 100.);
    584         dest = ed(tmp, 7, 0, 1, 3, 5, 0, 0, 0, 0, 0, 0, 0);
    585         study(tmp, dest, 1.2, 0.001);
    586         free(dest);
    587         free(tmp);
    588     }
    589     free(src2);
    590     free(src);
     649                if(b2 > c2) continue;
     650                if(d2 > c2) continue;
     651                if(d2 > a2) continue;
    591652#endif
     653                /* We only want 4-cell kernels for now */
     654                if(b2) continue;
     655                //printf("K = %d,%d,%d,%d,%d ", a2, b2, c2, d2, e2);
     656                printf("K = %d,%d,%d,%d ", a2, c2, d2, e2);
     657
     658                dest = ed(src, false, a2, 0, b2, c2, d2, e2, 0, 0, 0, 0, 0, 0);
     659                if(mode == 2)
     660                {
     661                    tmp = gauss(src, mat0);
     662                    tmp2 = gauss(dest, mat0);
     663                    printf("E = %.5g\n", 1000. * dist(tmp, tmp2));
     664                    free(tmp);
     665                    free(tmp2);
     666                }
     667                else
     668                    study(src, dest, 1.2, 0.01);
     669                fflush(stdout);
     670                free(dest);
     671            }
     672
     673            free(src);
     674        }
     675        break;
    592676
    593677#if 0
     
    646730
    647731#if 0
    648     makegauss(mat0, 1.2, 0, 0);
    649     for(a = 0; a <= 16; a++)
    650     for(b = 0; b <= 16; b++)
    651     for(c = 0; c <= 16; c++)
    652     for(d = 0; d <= 16; d++)
    653     {
    654         float *tmp;
    655         if(a + b + c + d != 16)
    656             continue;
    657 #if 0
    658         if(b > c) continue;
    659         if(d > c) continue;
    660         if(d > a) continue;
    661 #endif
    662         printf("%02d %02d %02d %02d: ", a, b, c, d);
    663         dest = ed(src, true, a, 0, 0, b, c, d, 0, 0, 0, 0, 0, 0);
    664         //dest = ed(src, false, a, 0, 0, b, c, d, 0, 0, 0, 0, 0, 0);
    665         //study(src, dest, 1.2, 0.01);
    666         tmp = gauss(src, mat0);
    667         tmp2 = gauss(dest, mat0);
    668         printf("%.5g\n", 1000. * dist(tmp, tmp2));
    669         fflush(stdout);
    670         free(tmp);
    671         free(tmp2);
    672         free(dest);
    673     }
    674 #endif
    675 
    676 #if 0
    677732    tmp = gauss(src, 0., 0.);
    678733    for(a = 0; a < 16; a++)
     
    777832#endif
    778833
     834    }
     835
     836#if 0
    779837    tmp = new();
    780838    a = 0;
     
    787845        save(dest, buf);
    788846    }
     847#endif
    789848
    790849    return 0;
Note: See TracChangeset for help on using the changeset viewer.