2012-04-12 4 views
2

Я действительно смущен этой техникой. Я знаю, что гистограмма - это частота для каждого значения (я работаю над изображениями на сером фоне), и я произвел способ сделать это:Точечная обработка изображения - выравнивание гистограммы (обработка)

int[] populateHist (PImage x) 
{ 
    x.loadPixels(); 
    int[] out = new int[256]; 
    for (int i = 0; i < x.pixels.length; i++) 
    { 
    out[(int)red(x.pixels[i])]++; 
    } 
    return out; 
} 

и функция распределения для кумулятивного массива:

int[] spreadFunc (int[] a) 
{ 
    int[] out = new int[256]; 
    for (int i = 0; i < a.length; i++) 
    { 
    if (i == 0) 
    { 
     out[i] = (a[i]); 
    } 
    else 
    out[i] = (a[i]) + (a[i-1]); 
    } 
    return out; 
} 

следующий шаг заключается в нормализации этих значений, так это правильно принимать максимальное значение и разделить все значения с тем же определенным числом, чтобы максимальный теперь 255?

Кроме того, еще одна вещь, которую я смущает, заключается в том, что даже после нормализации гистограммы, как я смогу воссоздать изображение со значениями пикселей с расширением?

ответ

0

Сначала вы получаете CDF (кумулятивная функция распределения). Это, в основном, ваша «функция расширения», но вы должны нормализовать ее так, чтобы она начиналась с 0 до 1 (разделите ее на количество пикселей, используйте удвоения).

Во-вторых, вы переназначить значения пикселей y = cdf(x)*255

Или просто y = cdf(x) и переназначить линейно в мин-макс значения в 0-255 диапазон, это в основном то же самое.

См. Например http://en.wikipedia.org/wiki/Histogram_equalization#Implementation

Смежные вопросы