Здравствуйте, 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]