Поиск

Эквализация гистограммы из double


Сижу, голову ломаю. Похоже, простейший способ — преобразовать данные в целые (до 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;
}

eddy_em.livejournal.com

Добавить комментарий