eddy_em: (Default)
[personal profile] eddy_em
Сижу, голову ломаю. Похоже, простейший способ — преобразовать данные в целые (до 65535 уровней) и работать с ними... Все равно при результирующем отображении данные будут передискретизированны.
Велосипедостроение продолжается. Библиотечка постепенно обрастает разными функциями.
UPD:
"Как надо" получается уродливо, сделал несколько иначе:

doubleimage *dbl_histeq(doubleimage *im, size_t nlevls){
    if(!im || !im->data) return NULL;
    double success = TRUE;
    histogram *hist = dbl2histogram(im, nlevls);
    if(!hist || !hist->data || !hist->levels){
        success = FALSE;
        goto theret;
    }
    double *newlevels = MALLOC(double, nlevls+1);
    size_t cumul = 0;
    for(size_t i = 0; i < nlevls; ++i){
        cumul += hist->data[i];
        // calculate new gray level
        newlevels[i+1] = ((double)cumul) / hist->totpix;
        DBG("newlevels[%zd]=%g", i+1, newlevels[i+1]);
    }
    // now we can change image values due to new level
    OMP_FOR()
    for(size_t i = 0; i < im->totpix; ++i){
        double d = im->data[i];
        double dnl = d * nlevls;
        size_t v = (size_t)dnl;
        if(v >= nlevls){
            v = nlevls-1;
        }
        double frac = dnl - v;
        if(frac < 0.){
            DBG("frac=%g<0", frac);
            frac = 0.;
        }else if(frac > 1.){
            DBG("frac=%g>1", frac);
            frac = 1;
        }
        im->data[i] = (newlevels[v+1] - newlevels[v]) * frac + newlevels[v];
    }
    FREE(newlevels);
    theret:
    histogram_free(&hist);
    if(success) return im;
    else return NULL;
}

April 2025

S M T W T F S
  1 23 45
67 89101112
13141516171819
20212223242526
27282930   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 22nd, 2025 08:48 am
Powered by Dreamwidth Studios