Re[3]: sample for Histogram Equalization
От: Lafkadio Россия  
Дата: 11.07.05 10:05
Оценка:
L>> if (j-i > 255)
L>> {
L>> Fns[0]=0;
L>> Fns[r]=255;
L>> }[/b]
R>Зачем этот кусок, ведь в if мы никогда не попадаем...
Согласен, можно убрать. это просто осталось от исходного кода Яншина и Калинина, они не только выравнивали гистограмму но и одновременно масштабировали ее в пределах Umin и Umax. Публикую целиком раздел посвященный выравниванию гистограммы.


Как говорилось выше, необходимо «развязать» между собой диапазон уровней исходного изображения и диапазон уровней, воспроизводимых на экране программами тонового вывода. Для этого мы используем функциональное преобразование уровня.
Для нахождения требуемой функции служит подпрограмма KIPJAR (листинг 2.8). Искомая функция находится посредством сопоставления гистограммы исходного изображения с гистограммой, которую должно иметь преобразованное изображение в идеальном случае. Для получения гистограммы исходного изображения вызывается подпрограмма KIMHIS. Здесь мы несколько забегаем вперед, так как эта подпрограмма рассматривается только в следующей главе (что не мешает нам воспользоваться ей). В качестве желаемой берется равномерная гистограмма; при необходимости можно задать любую другую. Функция преобразования получается из условия пошаговой минимизации отклонения гистограммы преобразованного изображения от требуемой формы. Подпрограмма KIPJAR имеет 6 параметров. Это исходное изображение, его размеры, минимальный и максимальный уровень преобразованного поля и массив, в который помещается (в табличной форме) найденная функция. Подпрограммы KIPIMA и KIPIMD дают примеры использования полученной функции.




void KIPJAR (Image, Ni, Nj, Umin, Umax, Fns)
SHOW Image[];
int Ni, Nj, Umin, Umax;
int Fns;            //Fns[0:MURMAX]
/* Получение таблично заданной функции Fns[]
    преобразующей яркость изображения таким образом, 
    чтобы гистограмма преобразованного поля была
    максимально приближена к равномерной.
    Беспоисковый локально-оптимальный алгоритм.

    Image - исходное изображение
    Ni, Nj - его размеры
    Umin - требуемый минимальный уровень
    Umax - требуемый максимальный уровень
    Fns - сформированная нелинейность

*/
int u, r;
int Hold[MURMAX +1];// для прежней гистограммы
int Hdes[MURMAX +1];// для желаемой гистограммы
int Derr;
unsigned int Vg, SumDes, SumFct=0;

if (Umin<0 || Umin > Umax || Umax > MURMAX)
{
    // Lafkdio. Выдача сообщения об ошибке
    return;
}

KIMHIS(Image, Ni, Nj, Hold); // Получение гистограммы изображения
// Lafkadio. Приводить эту функцию не буду так как эта часть обычно сложностей не вызывает.

Vg=0;
for(u=MURMAX; u >= 0; u--)
{
    Vg+= Hold[u]; 
    Hdes[u]=0;
}
for(u=Umax; u >= Umin; u--)
{
    Vg-= (Hdes[u]=Vg/ (u-Umin+1));
}

SumDes = Hdes[0];
for(u=0, r=0;r <=MURMAX;)
{
    Derr=SumDes-SumFct;
    if (Hold[r]<= 2*Derr)
    {
        SumFct+=Hold[r];
        Fns[r++]=u;
    }
    else
    {
        Fns[r]=u++;
        if(u<Umax)
            SumDes+=Hdes[u];
    }
    }
}

for(r=MURMAX;Hold[r]==0;r--);
for(u=0;Hold[u]==0;u++);

if (r-u>Umax-Umin)
{
    Fns[0]=Umin;
    Fns[r]=Umax;
}
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.