Контрольная работа: Нейронная сеть Хемминга

2. Изображение локализуется и приводится к нужному масштабу.

3. Образ поточечно подаётся на входы i-го нейрона. Если k-я точка образа чёрная, то весу k-го входа присваивается значение 0.5, в противном случае - 0.5 (см. формулу 5 п.3.2.5).

4. Переход на шаг 1, пока не исчерпаны все эталонные образы.

Исходный код алгоритма обучения выглядит так:

TImage* I1=new TImage (this); // Сюда загружаем эталонный образ TImage* I2=new TImage (this); // А здесь будет масштабированный I2->Width=iDestSize;

I2->Height=iDestSize;

for (int i=0; i<M; i++) { I1->Picture->LoadFromFile (AnsiString (i) +". bmp");

vScale (I2, I1); // Читаем и масштабируем образ for (int x=0; x<iDestSize; x++) for (int y=0; y<iDestSize; y++) // Перебираем поточечно if (I2->Canvas->Pixels [x] [y] ==clBlack) InputRow [i]. fW [x*iDestSize+y] =0.5;

else InputRow [i]. fW [x*iDestSize+y] =-0.5;

} deleteI1;

deleteI2;

3. Локализация и масштабирование изображения

Для успешной работы нужно выяснить точный размер и местоположение образа цифры. После локализации - приводим образ к размеру 40*40 (масштабирование). Эти операции выполняются как на этапе обучения сети, так и на этапе распознавания. Всё это проделывает функция void vScale (TImage*, TImage*).

Для эталона, ввиду отсутствия помех, локализацию провести очень просто: достаточно последовательно просмотреть все точки образа и найти границы цифры:

float iMinX, iMinY, iMaxX, iMaxY; // Границы локализованной цифры iMinX=iMinY=iSourceSize+1;

iMaxX=iMaxY=-1;

for (int x=0; x<iSourceSize; x++) for (int y=0; y<iSourceSize; y++) if (Source->Canvas->Pixels [x] [y] ==clBlack) { if (x<iMinX) iMinX=x;

if (y<iMinY) iMinY=y; if (x>iMaxX) iMaxX=x;

if (y>iMaxY) iMaxY=y;

}

В данной реализации используется стандартный алгоритм обратного масштабирования без интерполяции (Source - исходный образ, Dest - отмасштабированный):

const float fScaleX= (iMaxX-iMinX) /iDestSize; // Коэффициенты сжатия const float fScaleY= (iMaxY-iMinY) /iDestSize;

for (int x=0; x<iDestSize; x++) for (int y=0; y<=iDestSize; y++) Dest->Canvas->Pixels [x] [y] = Source->Canvas->Pixels [x*fScaleX+iMinX] [y*fScaleY+iMinY] ;

4 Искажение изображения

Чтобы не распознавать эталонные образы - введем искажение. Воспользуемся двумя способомами искажения:

Добавление N-процентного шума.

for (int x=0; x<IBroke2->Width; x++)

for (int y=0; y<IBroke2->Height; y++)

// Добавляем белый X% -й шум

if (random (100) <iPercent) // iPercent- это процент шума, кот // пользователь может указать через интерфейс диалогового окна

if (IBroke2->Canvas->Pixels [x] [y] ==clBlack)

К-во Просмотров: 295
Бесплатно скачать Контрольная работа: Нейронная сеть Хемминга