Re[2]: sample for Histogram Equalization
От: Reunion  
Дата: 11.07.05 04:50
Оценка:
Здравствуйте, Lafkadio, Вы писали:

L>Я пользуюсь следующей функцией:

L>Функция выравнивает гистограмму заданной прямоугольной области изображения. По рассчитанной гистограмме вычисляется дискретная функция распределения, в табличном представлении. Данная функция преобразует яркость изображения таким образом, чтобы гистограмма преобразованного поля была максимально приближена к равномерной. Далее для каждого пикселя изображения, его значение считается индексом в массиве табличного представления функции преобразования, и заменяется на выбранное в ней значение. Алгоритм функции взят из В. Яншин, Г. Калинин "Обработка изображений на языке Си для IBM PC. Алгоритмы и программы", Мир, 1994г. с 88-89.

Спасибо за этот исходник, но вы не могли бы пояснить подробнее, что откуда берется. (Я только про этот метод, второй везде описывается — с ним просто). Кстати, есть и по коду вопросы:

L>
L> // Для простоты считаем что работаем с 8-битным изображением
L> // m_ChannelSize- размер изображения
L> // m_pActiveChannel - массив пикселей изобржения
L> long pHist[256];//Гистограмма исходного изображения

L> //очищаем гистограмму
L> for (int i=0; i< 255; i++) 
L>    pHist[i] = 0;

L> // Вычисляем гистограмму
L> for (i=0; i< m_ChannelSize; i++)
L>    pHist[m_pActiveChannel[i]]++;

L> int  ;
L> long pHistNew[256];
L> int Derr;
L> DWORD Vg, SumDes, SumFct=0;
L> BYTE Fns[256];// функция табличного преобразования

L> Vg=0;
L> for(i=255; i>=0; i--) 
L> {
L>    Vg += pHist[i];
L>        pHistNew[i]=0;
L> }

L> //Вычисляем функцию распределения вероятности, апроксимруя ее
L> //выражением P(x)=sum H(i),i=0..x где H- массив гистограммы
L> for(i=255; i>=0; i--) 
L>    Vg -= (pHistNew[i] = Vg/(i+1));

L> SumDes = pHistNew[0];
L> // Вычисляем функцию табличного преобразования
L> for (i=0, j=0; j<=255; )
L> {
L>    Derr=SumDes-SumFct;
L>    if (pHist[j]<= 2*Derr)
L>    {
L>        SumFct += pHist[j];
L>        Fns[j++]=i;
L>    }
L>    else
L>    {
L>        Fns[j]=i++;
L>        if (i <= 255) 
L>                        SumDes += pHistNew[i];
L>    }
L> }

L> // Вычисляем границы гистограммы исходного изображения
L> for (j=255; pHist[j]==0; j--);
L> for (i=0; pHist[i]==0; i++);
L> if (j-i > 255)
L> {
L>    Fns[0]=0;
L>    Fns[r]=255;
L> }

Зачем этот кусок, ведь в if мы никогда не попадаем...

L> // Вычисляем новое значение каждого пикселя по табличной функции
L> for (i=0; i< m_ChannelSize; i++)
L>    m_pActiveChannel[i]=Fns[m_pActiveChannel[i]];

L>


[skiped]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.