Эквализация гистограммы из double
Apr. 1st, 2019 11:27 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Сижу, голову ломаю. Похоже, простейший способ — преобразовать данные в целые (до 65535 уровней) и работать с ними... Все равно при результирующем отображении данные будут передискретизированны.
Велосипедостроение продолжается. Библиотечка постепенно обрастает разными функциями.
UPD:
"Как надо" получается уродливо, сделал несколько иначе:
Велосипедостроение продолжается. Библиотечка постепенно обрастает разными функциями.
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;
}