Система идентификации личности по отпечаткам пальцев

Разработка алгоритма формирования относительных параметров для минюций. Подбор параметров системы допусков и критериев схожести при сравнении отпечатков. Метод пригоден для распознавания битовых изображений: символьной информации, шрифтов и подписей.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 23.06.2008
Размер файла 4,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

//Обработка картинки, ее изменение

//Обработка линии на которую указывает imap

//Исправление псевдо-раздвоений и псевдо-окончаний на указанной линии

{

int changeN = 0; //количество модификаций на линии

int kol = 0; //количество пройденных точек

int vec = 0; //направление поиска очередной точки

int tekS = 0; //Текущее количество коротких векторов

CPoint A, //Начало вектора

B; //Конец вектора

TAbsFing vecDotS; //массив точек для коротких векторов

TAbsFing vecDotL; //массив точек для длинных векторов

TAbsFing historyDotL; //история точек для длинных векторов

TAbsDot _tmpDotFing;

TAbsFing::iterator iter;

TAbsDot resetDot, bestDot;

double alpha; //направление вектора (в радианах)

int stopKol = 1500; //предел шагов

int ret = 0; //счетчик шагов после прохождения начальной точки

bool homeOver = false; //признак окончания обработки

_dot->pr1 = false;

A = _dot->coord; B = _dot->coord;

CPoint olddot, dot = _dot->coord; //Текущая точка на линии

do{

//основной цикл обработки,

//варианты завершения цикла

//продолжается до тех пор пока вся линия не будет пройдена (нормальный вариант)

//зацикливание (не нормальный вариант, их несколько)

//

olddot = dot;

dot = pic->NextDotCW(dot, vec); //Поиск следующей точки _по часовой_ стрелке

if(dot.x == olddot.x && dot.y == olddot.y)

{//положение точки не изменилось => выход//

CString s;

s.Format("x = %d, y = %d, kol= %d", dot.x, dot.y, kol);

if(MESSAGEOUT)MessageBox(0, "положение точки не изменилось => выход\n" + s, "", MB_OK);

return changeN;

}

kol++; //подсчет пройденных точек

if(kol % LEN_S == 0)

{//появился новый короткий вектор

tekS++;

A = B;

B = dot;

//pic2->Line(A,B, 1, 0x999999);

_tmpDotFing.coord = A;

alpha = GetAlpha(A, B); //расчет локального направления между KOL_S пикселями (направление короткого вектора)//

double dAlpha = 0.0; //Разница углов

if(vecDotS.size() > 0) //в списке можно взять предыдущее значение

dAlpha = alpha - vecDotS.begin()->alpha;

/**/ if (abs(dAlpha) >= M_PI) //разница между новым углом и предыдущим не нормальная!

{//необходимо скорректировать текущую alpha

/**/ if (dAlpha < 0.0)

{

while (abs(dAlpha) > M_PI)

{

alpha += 2.0 * M_PI;

dAlpha += 2.0 * M_PI;

}

}else

{

while (dAlpha >= M_PI)

{

alpha -= 2.0 * M_PI;

dAlpha -= 2.0 * M_PI;

}

}

}

_tmpDotFing.alpha = alpha; //запоминание направления из точки А//

vecDotS.push_front(_tmpDotFing);

///////////////////////////////////////////////////////////////////////

///////проверяем два соседних длинных вектора при условии что//////////

///////пройдено достаточно точек, чтоб сравнивать длнинные вектора/////

if(vecDotS.size() < KOL_S) continue;

//Вычисление среднего направления LEN_L коротких векторов//

//запись данных по длинному вектору////////////////////////

double sumAlpha = 0.0;

iter = vecDotS.begin();

vecDotL.clear(); //пересчитаем длинные вектора

for(int i = 0; i < KOL_S; i++)

{

sumAlpha += iter->alpha;

if ((i+1) % LEN_L == 0)

{

_tmpDotFing = *iter;

_tmpDotFing.alpha = sumAlpha / LEN_L;

vecDotL.push_back(_tmpDotFing);

sumAlpha = 0.0;

}

iter++;

}

if (abs(vecDotL.begin()->alpha) > 3*2*M_PI)

{//слишком много оборотов//

CString s;

s.Format("alpha = %.2f", vecDotL.begin()->alpha*180);

if(MESSAGEOUT)MessageBox(0, "слишком много оборотов\n"+s, "", MB_OK);

return changeN;

}

//проверяем два соседних длинных вектора//

dAlpha = vecDotL.begin()->alpha - (++vecDotL.begin())->alpha;

if (abs(dAlpha) > (TEST_ALPHA / 180.0 * M_PI)) //сильный изгиб//

{

if (historyDotL.empty())

{ //сохранение состояния//

resetDot = vecDotL.back();

bestDot.alpha = 0.0;

}

if (dAlpha > 0) //раздвоение

alpha = (vecDotL.front().alpha - M_PI + (vecDotL.back().alpha)) / 2.0;

else //окончание

alpha = (vecDotL.front().alpha + M_PI + (vecDotL.back().alpha)) / 2.0;

_tmpDotFing = vecDotL.front();

_tmpDotFing.alpha = alpha; //направление в СТ (специфичная точка)//

_tmpDotFing.type = dAlpha<0; //тип СТ//

historyDotL.push_front(_tmpDotFing);

if(bestDot.alpha <= abs(dAlpha))

{

bestDot.coord = _tmpDotFing.coord;

bestDot.alpha = abs(dAlpha);

}

}

else //сильный изгиб//

{

if (!historyDotL.empty()) //был _пройден_ сильный изгиб

{

alpha = 0.0;

for(iter = historyDotL.begin(); iter != historyDotL.end(); iter++)

alpha += iter->alpha;

alpha /= historyDotL.size(); //среднее значение в пройденной СТ

iter = historyDotL.begin();

for(unsigned int i = 0; i<(historyDotL.size()/2); i++) iter++;

CPoint wdot = bestDot.coord; //наиболее вероятная точка для СТ

CPoint dotForAccept = FindAcceptDot(wdot, alpha, iter->type);

if (dotForAccept.x != -1)

{ //точка имеет продолжение//

COLORREF cl;

cl = (historyDotL.begin()->type)?0x000000:0xffffff;

//здесь можно поиграть с разной толщиной линии//

pic->Line(wdot, dotForAccept, 4, cl);

_dot->pr1 = true; //эту линию необходио еще раз проанализировать

changeN++;

stopKol += (stopKol-kol < 200)?200:0;

//stopKol += (kol*1.5 > stopKol)?500:0;

//загрузить начальное состояние

if(!historyDotL.begin()->type)

{ //если ликвидировано слипание то необходимо добавить новую точку на карту

_map.push_back(TMapElDot(dot));

}

//пройдена начальная точка, продлим анализ

//очень возможно, что начальную точку мы больше не попадем

if(ret-KOL_S*LEN_S < 0)

{

ret = 0;

homeOver = false;

stopKol = 500;

}

A = B = dot = resetDot.coord;

vecDotS.clear();

vecDotL.clear();

//------------------------------

}

historyDotL.clear();

}

}

}

if (dot.x == _dot->coord.x && dot.y == _dot->coord.y)

{//вероятно обход линии завершен

if (kol <= 2)

{//Линия подозрительно короткая

CString s;

s.Format("%d", kol);

if(MESSAGEOUT)MessageBox(0, "kol<=2 kol = " + s, "", MB_OK);

return changeN;

}else

{

homeOver = true; //пройти необходимо дальше начала

stopKol = kol + KOL_L*LEN_L*LEN_S;

}

}

if (homeOver) ret++;

}while(ret < (LEN_L*LEN_S*KOL_L) && ret < stopKol && kol <= stopKol);

_dot->pr2 = false;

return changeN;

}

inline double TAnalysePicture::GetAlpha(const CPoint A, const CPoint B)

//Направлени из точки А в В [-pi,pi)

{

if(A == B) return 0.0;

double alpha;

if (A.x - B.x == 0)

{

if (A.y > B.y) alpha = M_PI_2;

else alpha = -M_PI_2;

}else

{

double a = ((double)A.y-B.y)/((double)B.x-A.x);

alpha = atan(a);

if (A.x > B.x)

{

if (alpha < 0) alpha += M_PI;

else alpha -= M_PI;

if (A.y == B.y) alpha = -M_PI;

}

}

return alpha;

}

bool TAnalysePicture::TestFindDot(int _x, int _y)

//тест точки: Разность направлений вперед и назад должно быть меньше 110 градусов

{

const int len = 7;

CPoint A(_x, _y), B, C;

//первый вектор

B = A;

int vec = 0;

for(int i = 1; i<=len; i++)

B = tmpPic->NextDotCW(B, vec);

//------расчет угла-------//

double alpha1 = GetAlpha(A, B);

//второй вектор

C = B;

B = A;

vec = 0;

for(int i = 1; i<=len; i++)

{

B = tmpPic->NextDotCCW(B, vec);

if(abs(B.x-C.x) < 3 && abs(B.y-C.y) < 3) return true;

}

//------расчет угла-------//

double alpha2 = GetAlpha(A, B);

//-----alpha1, alpha2------//

alpha1 = abs(alpha2 - alpha1);

if (alpha1 > M_PI) alpha1 = 2.0*M_PI - alpha1;

return alpha1 < (110.0/180.0 * M_PI);

}

CPoint TAnalysePicture::FindAcceptDot(CPoint dot, double alpha, bool type)

//Поиск продолжения из окончания/раздвоения

{

const int maxL = 11;

const int minL = 3;

COLORREF color;

color = (type)?0x000000:0xffffff;

//окончание - ищем черную точку

//раздвоение - ищем белую точку

int i = 0;

while (i<=6) //разброс поиска в указанном направлении alpha

{

int l = minL;

int k = (i+1) / 2;

if (i % 2 == 1) k = -k;

while (l<=maxL)

{

double arg = alpha + k * M_PI * 5.0/180.0;

int x = dot.x + (int)(l*cos(arg)+0.5);

int y = dot.y - (int)(l*sin(arg)+0.5);

if (tmpPic->GetPixel(x, y) == color) //важное условие цвета точки!!!

{

if(TestFindDot(x,y)) //проверка найденной точки (на "вшивость" :) )

return CPoint(x, y); //найденная точка

else

break;

}

l++; //увеличение дальности поиска

}

i++;

}

return CPoint(-1, -1); //точка не найдена

}

bool TAnalysePicture::Show(int x, int y, int xt, int yt)

{

if(xt!=-1) pic2->Show(xt, yt);

return pic->Show(x, y);

}

TFingPicture *TAnalysePicture::GetPic1()

{

return pic;

}

TFingPicture *TAnalysePicture::GetPic2()

{

return pic2;

}

double TAnalysePicture::ChangeAlphaInterval(double _alpha)

//Приведение итрервала к [-pi,pi)

{

double ret = abs(_alpha);

while(ret >= 2.0*M_PI) ret -= 2.0*M_PI;

if(ret > M_PI) ret = 2.0*M_PI - ret;

else ret = -ret;

if(_alpha > 0) ret = -ret;

return ret;

}

/*Фильтрование полученных точек

отсеиваются близкостоящие направленные в противоположные строки

а так же точки слева и справа от которых нет линий*/

int TAnalysePicture::DotsFilter(TAbsFing &_dots)

{

int leftDots = 0;

TAbsFing::iterator iter1;

TAbsFing::iterator iter2;

for(iter1 = _dots.begin(); iter1 != _dots.end(); iter1++)

{

if(!iter1->show) continue;

//отсев точек сложным условием (условие окружения)

iter1->show = LeftDot(iter1);

}

for(iter1 = _dots.begin(); iter1 != _dots.end(); iter1++)

{

if(!iter1->show) continue;

//отсев близкостоящих точек

for(iter2 = iter1, ++iter2; iter2 != _dots.end(); iter2++)

{

if(!iter2->show) continue;

double difL = GetS(iter1->coord,iter2->coord);

if( //условия отсева

(

//на близком растоянии (15) находятся два окончания/раздвоения направленных друг на друга

(difL < 15)&&

((abs(iter2->alpha - iter1->alpha) > (165.0/180.0*M_PI))&&(abs(iter2->alpha - iter1->alpha)<(195.0/180.0*M_PI)))

)

||

(

//или просто очень близкие точки (<5..10)

(difL < 10)&&(iter1->type == iter2->type)

)

)

{

iter1->show = false;

iter2->show = false;

}

}

}

return leftDots;

}

inline double TAnalysePicture::GetS(CPoint A, CPoint B)

//растояние между точками

{

return sqrt( (double)((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)) );

}

/*Если точка является окончанием, то слева и справа от нее должны быть линии если это не так, то точку нужно исключить из дальнейшего анализа*/

bool TAnalysePicture::LeftDot(TAbsFing::iterator &iter)

{

COLORREF color = 0x000000; //ищем черную точку для окончаний

if(!iter->type) color = 0xffffff;; //ищем белую точку для раздвоений

int l, k = 35;

const int minL = 4, maxL = 12;

bool find = false;

while(k <= 55)

{

l = minL;

while(l <= maxL)

{

int x = iter->coord.x + (int)(l*cos(iter->alpha + k/180.0*M_PI)+0.5);

int y = iter->coord.y - (int)(l*sin(iter->alpha + k/180.0*M_PI)+0.5);

if(pic->GetPixel(x,y) == color) // важное условие!!!

{ find = true; break;} //нашли точку слева

l++;

}

if(find) break;

k += 10; //Поиск с шагом 10гр

}

if(!find) return false;

k = 35;

while(k <= 55)

{

l= minL;

while(l <= maxL)

{

int x = iter->coord.x + (int)(l*cos(iter->alpha - k/180.0*M_PI)+0.5);

int y = iter->coord.y - (int)(l*sin(iter->alpha - k/180.0*M_PI)+0.5);

if(pic->GetPixel(x,y) == color) // важное условие!!!

return true; //нашли точку справа

l++;

}

k += 10;

}

return false;

}

П.1.10. ТЕКСТ МОДУЛЯ TFingPicture.h

#pragma once

#include "Fing.h"

///////////////////////////////////////////////////////////////////////////////

//Класс изображения.

//Хранение изображения, выполнение простейших операции над ним

///////////////////////////////////////////////////////////////////////////////

class TFingPicture

{

private:

CDC pic; //указатель на изображение

BITMAP bmp; //изображение

bool IsLoad; //изображение загружено

CDC *Screen; //указатель на окно программы

public:

TFingPicture(CDC *_Screen); //_Screen - указатель на окно

~TFingPicture(void);

bool Load(const CString src); //загрузить изображение из файла src

bool Show(int X, int Y); //отобразить изображение на окне в координатах (X,Y)

bool SetPixel(CPoint dot, COLORREF color); //установка цвета пикселя dot

bool SetPixel(int x, int y, COLORREF color); //установка цвета пикселя (x,y)

COLORREF GetPixel(CPoint dot); //взятие цвета пикселя dot

COLORREF GetPixel(int x, int y); //взятие цвета пикселя (x,y)

bool FloodFill(CPoint dot, COLORREF color=0xffffff); //заливка области (по умолчанию черным цветом)

bool FloodFill(int x, int y, COLORREF color=0xffffff); //заливка области (по умолчанию черным цветом)

bool Line(CPoint from, CPoint to, int width, COLORREF color);//рисование линии

bool Rectangle(CPoint from, CPoint to, int width=2, COLORREF color=0xffffff); //рисование прямоугольника

bool Copy(TFingPicture &from); //копирование изображения

CPoint NextDotCW(const CPoint dot, int &vec); //Поиск следующей точки "_по часовой_ стрелке"

CPoint NextDotCCW(const CPoint dot, int &vec); //Поиск следующей точки "_против часовой_ стрелке"

CPoint GetSize(); //получение размера изображения

};

П.1.11. ТЕКСТ МОДУЛЯ TFingPicture.cpp

#include "StdAfx.h"

#include "TFingPicture.h"

///////////////////////////////////////////////////////////////////////////////

//Класс изображения.

//Хранение изображения, выполнение простейших операции над ним

///////////////////////////////////////////////////////////////////////////////

//координаты окружающих точек

const CPoint incXY[8]=

{

CPoint(-1, -1),

CPoint(0, -1),

CPoint(1, -1),

CPoint(1, 0),

CPoint(1, 1),

CPoint(0, 1),

CPoint(-1, 1),

CPoint(-1, 0)};

TFingPicture::TFingPicture(CDC *_Screen)

{

Screen = _Screen;

pic.CreateCompatibleDC(Screen);

IsLoad = false;

}

TFingPicture::~TFingPicture(void){}

//отобразить изображение на окне в координатах (X,Y)

bool TFingPicture::Show(int X, int Y)

{

if (!IsLoad) return false;

int kx = bmp.bmWidth;

int ky = bmp.bmHeight;

return Screen->StretchBlt(X, Y, bmp.bmWidth, bmp.bmHeight, &pic, 0, 0, kx, ky, SRCCOPY)>0;

}

//загрузить изображение из файла src

bool TFingPicture::Load(const CString src)

{

IsLoad = false;

CBitmap bm;

bm.Detach();

IsLoad = bm.Attach(LoadImage(0, src, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE))>0;

bm.GetObject(sizeof(BITMAP), &bmp);

pic.SelectObject(&bm);

return IsLoad;

}

// color = BGR;

bool TFingPicture::SetPixel(CPoint dot, COLORREF color)

{

if (!IsLoad) return false;

pic.SetPixel(dot.x, dot.y, color);

return true;

}

bool TFingPicture::SetPixel(int x, int y, COLORREF color)

{

if (!IsLoad) return false;

pic.SetPixel(x, y, color);

return true;

}

// color = BGR;

COLORREF TFingPicture::GetPixel(CPoint dot)

{

if (!IsLoad) return false;

return pic.GetPixel(dot.x, dot.y);

}

COLORREF TFingPicture::GetPixel(int x, int y)

{

if (!IsLoad) return false;

return pic.GetPixel(x, y);

}

bool TFingPicture::FloodFill(CPoint dot, COLORREF color)

{

if(!IsLoad) return false;

COLORREF col = GetPixel(dot);

CBrush br(color);

pic.SelectObject(&br);

pic.ExtFloodFill(dot.x, dot.y, col, FLOODFILLSURFACE);

return true;

}

bool TFingPicture::FloodFill(int x, int y, COLORREF color)

{

if(!IsLoad) return false;

COLORREF col = GetPixel(x, y);

CBrush br(color);

pic.SelectObject(&br);

pic.ExtFloodFill(x, y, col, FLOODFILLSURFACE);

return true;

}

bool TFingPicture::Line(CPoint from, CPoint to, int width, COLORREF color)

{

if(!IsLoad) return false;

CPen pen(PS_SOLID, width, color);

pic.SelectObject(&pen);

pic.MoveTo(from.x, from.y);

pic.LineTo(to.x, to.y);

return true;

}

bool TFingPicture::Rectangle(CPoint from, CPoint to, int width, COLORREF color)

{

if(!IsLoad) return false;

Line(from, CPoint(from.x, to.y), width, color);

Line(CPoint(from.x, to.y), to, width, color);

Line(to, CPoint(to.x, from.y), width, color);

Line(CPoint(to.x, from.y), from, width, color);

return true;

}

bool TFingPicture::Copy(TFingPicture &from)

{

bmp = from.bmp;

IsLoad = from.IsLoad;

Screen = from.Screen;

return pic.BitBlt(0, 0, bmp.bmWidth, bmp.bmHeight, &from.pic, 0, 0, SRCCOPY)>0;

}

CPoint TFingPicture::NextDotCW(const CPoint dot, int &vec)

//Поиск следующей точки "_по часовой_ стрелке"

//vec вероятное направление поиска

{

int i = vec,

step = 0;

CPoint newdot = dot;

COLORREF clMas[9];

clMas[8] = clMas[0] = GetPixel(dot.x-1, dot.y-1);

clMas[1] = GetPixel(dot.x, dot.y-1);

clMas[2] = GetPixel(dot.x+1, dot.y-1);

clMas[3] = GetPixel(dot.x+1, dot.y);

clMas[4] = GetPixel(dot.x+1, dot.y+1);

clMas[5] = GetPixel(dot.x, dot.y+1);

clMas[6] = GetPixel(dot.x-1, dot.y+1);

clMas[7] = GetPixel(dot.x-1, dot.y);

do{

if(clMas[i+1] < clMas[i])

{

vec = (i + 1) % 8;

newdot.x = dot.x + incXY[vec].x;

newdot.y = dot.y + incXY[vec].y;

if(vec % 2 == 0) SetPixel(dot.x + incXY[vec+1].x, dot.y + incXY[vec+1].y, 0x000000);

vec = (vec + 5) % 8;

return newdot; //найдена новая точка

}

i = (i + 1) % 8;

step++;

}while(step <= 8);

return dot; //поиск ни к чему не привел

}

CPoint TFingPicture::NextDotCCW(const CPoint dot, int &vec)

//Поиск следующей точки "_против часовой_ стрелке"

//vec вероятное направление поиска

{

int i = vec,

step = 0;

CPoint newdot = dot;

COLORREF clMas[9];

clMas[8] = clMas[0] = GetPixel(dot.x-1, dot.y-1);

clMas[1] = GetPixel(dot.x-1, dot.y);

clMas[2] = GetPixel(dot.x-1, dot.y+1);

clMas[3] = GetPixel(dot.x, dot.y+1);

clMas[4] = GetPixel(dot.x+1, dot.y+1);

clMas[5] = GetPixel(dot.x+1, dot.y);

clMas[6] = GetPixel(dot.x+1, dot.y-1);

clMas[7] = GetPixel(dot.x, dot.y-1);

do{

if(clMas[i+1] < clMas[i])

{

vec = (i + 1) % 8;

newdot.x = dot.x + incXY[(8-vec)%8].x;

newdot.y = dot.y + incXY[(8-vec)%8].y;

if(vec % 2 == 0) SetPixel(dot.x + incXY[8-vec-1].x, dot.y + incXY[8-vec-1].y, 0x000000);

vec = (vec + 5) % 8;

return newdot; //найдена новая точка

}

i = (i + 1) % 8;

step++;

}while(step <= 8);

return dot; //поиск ни к чему не привел

}

CPoint TFingPicture::GetSize()

//получение размера изображения

{ if(!IsLoad) return false;

return CPoint(bmp.bmWidth, bmp.bmHeight);}

ПРИЛОЖЕНИЕ 2 РУКОВОДСТВО ПРОГРАММИСТА

П.2.1. НАЗНАЧЕНИЕ ПРОГРАММЫ

Программа распознавания личности по отпечаткам пальцев имеет идентификатор FingerAnalyser и предназначена для автоматической идентификации личности по папиллярному узору. Программа FingerAnalyser выполняет следующие функции:

1) модификация изображения, исправление искажений;

2) выделение локальных особенностей - минюций. Формирование списка минюций в абсолютных параметрах;

3) сортировка списка абсолютных параметров, исключение ложных и ненадежных минюций;

4) конвертирование абсолютных параметров в отностительные, формирование списка относительных параметров;

5) установка системы допусков для учета корреляцции изображений

6) сравнение одного отпечатка с множеством других.

Данная работа реализует такое преобразование изображения, при котором данные о расположение уникальных особенностей сохраняются наиболее полно и с наименьшим содержанием ложной информации.

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

П.2.2. УСЛОВИЯ ПРИМЕНЕНИЯ ПРОГРАММЫ

Программа FingerAnalyser предъявляет следующие требования к техническим средствам:

- стандартный x86-совместимый ПК;

- тактовая частота процессора 900 МГц или более;

- объем оперативной памяти не менее 64 Мб;

- разрешение экрана монитора не менее 1024x768.

Программа FingerAnalyser предъявляет следующие требования к программным средствам:

- операционная система семейства Windows (Windows 9x/ME/NT/2000/XP);

- среда для разработки приложений Microsoft Visual Studio C++ 2003.

Интерфейс программы представлен на рис. П.2.1.

Интерфейс программы FingerAnalyser

Рис. П.2.1

На форме программы в визуальном виде представляется, после открытия через пункт «Открыть», исходное изображение, после нажатия на кнопку «Анализ», скорректированное изображение и визуальное представление структурного вида отпечатка. После чего можно нажатием на кнопку «Сравнить» отыскать в базе схожие отпечатки.

При каждом анализе отпечатка создается файл с его структурным описанием. Для того чтобы поместить отпечаток в базу данных отпечатков, для последующего стравнения с ним, необходимо нажать на кнопку «Запомнить в базу». Для запоминания в базу можно выбирать группу файлов для применения операции записи в базу данных для всех выбранных файлов.

П.2.3. ХАРАКТЕРИСТИКА ПРОГРАММЫ

Программа FingerAnalyser требует для своего функционирования наличия в проекте файлов, содержащих растровые представления папиллярного узора.

В состав программы входят следующие файлы, необходимые для ее функционирования:

1) FingerAnalyser.exe - исполняемый файл, содержащий основной интерфейс программы;

2) MFC - библиотеки для поддержки оконного среды;

3) blank.bmp - пустое изображение;

4) report.txt - файл отчет в который записываются все результаты сравнения

5) sav/*.sav - файлы со структурным представлением отпечатков

6) sav/fingbase.bse - база данных отпечатков

7) dll библиотеки MFC

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

П.2.4. ОБРАЩЕНИЕ К ПРОГРАММЕ

Для запуска программы необходимо убедиться в том, что необходимые библиотеки MFC находятся в том же каталоге, что и исполняемый файл или в каталоге Windows/System32.

Для корректной работы программы она должна находиться в каталоге, к которому есть права на чтение и запись.

Для запуска подсистемы необходимо в оболочке системы на главном окне нажать на кнопку «Анализ» - для сравнения нужного отпечатка с набором имеющимся в базе данных, или «Запомнить в базу» - для внесения указанных отпечатков в базу данных.

П.2.5. ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ

Входными и выходными данными для программы является файл базы данных отпечатков sav/fingbase.bse. Структура файла:

src [kol] [dpi] [date] [description]

src [kol] [dpi] [date] [description]

src [kol] [dpi] [date] [description]

В каждой строке файла базы данных отпечатков содержится описание одного отпечатка. В табл. П.2.1 приведен формат записи в файле базы данных.

Таблица П.2.1

Формат записи файла базы данных

Поле

Формат

Описание

src

Строка

путь к образу из которого была получена информация

kol

Целое

количество точек

dpi

Целое

качество исходного отпечатка (dot per inch)

date

Дата

дата отпечатка

description

строка

описание

Выходными данными для программы является файл sav/*.sav со структурным представлением, содержащий статистические характеристики минюций на отпечатке. Этот файл имеет следующий формат:

x y alpha type [show]

x y alpha type [show]

x y alpha type [show]

В каждой строке файла структурного представления содержится описание одной минюции. В табл. П.2.2 приведен формат строки со структурным описанием минюции в абсолютных параметрах.

Таблица П.2.2

Формат строки файла со структурным описанием

Поле

Формат

Описание

x

Целое

Абцисса минюции на растре

y

Целое

Ордината минюции на растре

alpha

Целое

Ориентация минюции на растре

type

Байт

Тип минюции. Раздвоение или окончание

Кроме того, выходной информацией для данной подсистемы является файл отчет report.txt, содержащий отпечатки из базы данных, в которых были обнаружены сходства с обрабатываемым отпечатком.

В каждой строке отчета содержится описание отпечатка, его имя, количество совпавших точек при распознавании и степень сходства.
В табл. П.2.3 приведен формат данных. На рис. П.2.2 приведен пример файла отчета.

report.txt имеет следующий формат:

------ Namei ------

Counti1 Pcti1 Sourcei1

Counti2 Pcti2 Sourcei2

Countik Pctik Sourceik

Всего в базе: NN

Таблица П.2.3

Формат данных файла-отчета

Поле

Формат

Описание

Name

Строка

Имя отпечатка

Count

Целое

Абсцисса минюции на растре

Pct

Целое

Степень сходства отпечатков в процентах, принимает значения (0, 100]

Source

Строка

Путь к файлу, из которого были взяты параметры

NN

Целое

Количество отпечатков имеющихся в базе данных

Файл-отчет

------ hedgeR1_2.bmp ------

7 70 с:\мои документы\fing\fingc\fingeranalyser\pic\base\hedger1_1.bmp

Всего в базе: 58

------ starkyR2_2.bmp ------

5 50 с:\мои документы\fing\fingc\fingeranalyser\pic\base\starkyr2_1.bmp

Всего в базе: 58

------ karR2_2.bmp ------

3 30 с:\мои документы\fing\fingc\fingeranalyser\pic\base\karr2_1.bmp

Всего в базе: 58

------ vasL1_2.bmp ------

21 100 с:\мои документы\fing\fingc\fingeranalyser\pic\vasl1_1.bmp

56 100 с:\мои документы\fing\fingc\fingeranalyser\pic\vasl1_2.bmp

12 100 с:\мои документы\fing\fingc\fingeranalyser\pic\vasl1_3.bmp

Всего в базе: 58

------ tatL1_2.bmp ------

Ни одного отпечатка не найдено!

Рис. П.2.2

П.2.6. СООБЩЕНИЯ

Сообщения, выдаваемые программисту, приведены в табл. П.2.4.

Таблица П.2.4

Сообщения программисту

Сообщение

Действие программиста

Отпечаток не обработан

Прежде чем запускать сравнение необьходимо провести анализ

База данных пуста

В базе данных нет информации ни об одном отпечатке. Необходимо заполнить базу данных отпечатков

Отпечаток не пригоден для сохранения в базу

На отпечатке либо слишком мало обнаружено минюций, менее 10, либо слишком много, более 80

Ни одного отпечатка не найдено

В результате поиска не совпало ни одного отпечтака

Невозможно создать базу данных с отпечатками

Возможно нет прав на запись или нет свободного места на носителе

Невозможно создать файл

Возможно нет прав на запись или нет свободного места на носителе

Невозможно открыть файл

Возможно нет прав на чтение или не сеществует запрашиваемого файла на носителе

Обнаружены сходства

В базе данных были обнаружены отпечатки, имеющие схожее представление.

Визуализация результатов проведения анализа приведена на рис. П.2.2.

ПРИЛОЖЕНИЕ 3 РУКОВОДСТВО ОПЕРАТОРА

П.3.1. НАЗНАЧЕНИЕ ПРОГРАММЫ

Программа распознавания личности по отпечаткам пальцев имеет идентификатор FingerAnalyser и предназначена для автоматической идентификации личности по папиллярному узору. Программа FingerAnalyser выполняет следующие функции:

1) модификация изображения, исправление искажений;

2) выделение локальных особенностей - минюций. Формирование списка минюций в абсолютных параметрах;

3) сортировка списка абсолютных параметров, исключение ложных и ненадежных минюций;

4) конвертирование абсолютных параметров в отностительные, формирование списка относительных параметров;

5) установка системы допусков для учета корреляцции изображений;

6) сравнение одного отпечатка с множеством других.

Данная работа реализует такое преобразование изображения, при котором данные о расположение уникальных особенностей сохраняются наиболее полно и с наименьшим содержанием ложной информации.

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

П.3.2. УСЛОВИЯ ВЫПОЛНЕНИЯ ПРОГРАММЫ

Программа FingerAnalyser предъявляет следующие требования к техническим средствам:

- стандартный x86-совместимый ПК;

- тактовая частота процессора 900 МГц или более;

- объем оперативной памяти не менее 64 Мб;

- разрешение экрана монитора не менее 1024x768.

Программа FingerAnalyser предъявляет следующие требования к программным средствам:

- операционная система семейства Windows (Windows 9x/ME/NT/2000/XP);

- dll библиотеки MFC

П.3.3. ВЫПОЛНЕНИЕ ПРОГРАММЫ

Интерфейс программы представлен на рис. П.3.1.

Интерфейс программы FingerAnalyser

Рис. П.3.1

На форме программы в визуальном виде представляется, после открытия через пункт «Открыть», исходное изображение, после нажатия на кнопку «Анализ», скорректированное изображение и визуальное представление структурного вида отпечатка. Для вызова работы подсистемы необходимо в оболочке системы на главном окне нажать на кнопку «Сравнить».

При каждом анализе отпечатка создается файл с его структурным описанием. Для того чтобы поместить отпечаток в базу данных отпечатков, для последующего стравнения с ним, необходимо нажать на кнопку «Запомнить в базу». Для запоминания в базу можно выбирать группу файлов для применения операции записи в базу данных для всех выбранных файлов.

П.3.4. СООБЩЕНИЯ ОПЕРАТОРУ

Сообщения, выдаваемые оператору, приведены в табл. П.3.1.

Таблица П.3.1

Сообщения оператору

Сообщение

Действие оператора

Отпечаток не обработан

Прежде чем запускать сравнение необьходимо провести анализ

База данных пуста

В базе данных нет информации ни об одном отпечатке. Необходимо заполнить базу данных отпечатков

Отпечаток не пригоден для сохранения в базу

На отпечатке либо слишком мало обнаружено минюций, менее 10, либо слишком много, более 80

Ни одного отпечатка не найдено

В результате поиска не совпало ни одного отпечтака

Невозможно создать базу данных с отпечатками

Возможно нет прав на запись или нет свободного места на носителе

Невозможно создать файл

Возможно нет прав на запись или нет свободного места на носителе

Невозможно открыть файл

Возможно нет прав на чтение или не сеществует запрашиваемого файла на носителе

Обнаружены сходства

В базе данных были обнаружены отпечатки, имеющие схожее представление.

Визуализация результатов проведения сравнения приведена на рис. П.3.1.

ПРИЛОЖЕНИЕ 4 РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ

В табл. П.4.1 приведены результаты сравнения всех отпечатков полученных при испытаниях. Для проверки правильности работы имена файлам давались таким образом, что бы можно было определить принадлежность отпечатка.

Формат результата сравнения: A/B,

где A - количество совпавших минюций;

B - процент совпадения.

Формат имени файла: <Name><R|L><C>_<E>.bmp

где Name - имя человека, которому принадлежит отпечаток;

R - отпечаток с правой руки, L - отпечаток с левой руки;

С - порядковый номер пальца, начиная с большого;

E - экземпляр отпечатка.

Таблица П.4.1

Результаты сравнения

vovR2_1.bmp

1L1_1.BMP

1L2_1.BMP

1L3_1.BMP

1R1_1.BMP

1R2_1.BMP

1R3_1.BMP

1R4_1.bmp

2l1_1.bmp

2l2_1.bmp

2r1_0.bmp

2r2_0.bmp

1L1_2.bmp

 

24/100

 

 

 

 

 

 

 

 

 

 

1L2_2.BMP

 

 

9/90

 

 

 

 

 

 

 

 

 

1R1_2.BMP

 

 

 

 

23/100

 

 

 

 

 

 

 

1R2_1rotate2.bmp

 

 

 

 

 

23/100

 

 

 

 

 

 

1R2_2.BMP

 

 

 

 

 

16/100

 

 

 

 

 

 

1R3_2.BMP

 

 

 

 

 

 

1/10

3/30

 

 

 

 

1R4_2.bmp

 

 

 

 

 

 

 

15/100

 

 

 

 

2l1_2.bmp

 

 

 

 

 

 

 

 

14/100

 

 

 

2l2_2.bmp

 

 

 

 

 

 

 

 

 

8/80

 

 

2r1_1.bmp

 

 

 

 

 

 

 

 

 

 

 

 

2r2_1.bmp

 

1/10

 

 

 

 

 

 

 

 

 

 

2r3_1.bmp

 

 

 

 

 

 

 

 

 

 

 

 

3l1_2rotate.bmp

 

 

 

 

 

 

 

 

 

 

 

 

3l2_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

alexR1_3.bmp

 

 

 

 

 

 

 

 

 

 

 

 

alexR2_3.bmp

 

 

 

 

 

 

 

 

 

 

 

 

1L1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

1L2_2.BMP

 

 

 

 

 

 

 

 

 

 

 

 

1R1_2.BMP

 

 

 

 

 

 

 

 

 

 

 

 

1R2_1rotate2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

1R2_2.BMP

 

 

 

 

 

 

 

 

 

 

 

 

1R3_2.BMP

 

 

 

 

 

 

 

 

 

 

 

 

1R4_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

2l1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

2l2_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

2r1_1.bmp

 

 

 

2/20

 

 

 

 

 

 

 

 

2r2_1.bmp

 

 

 

 

 

 

 

 

 

 

 

 

2r3_1.bmp

48/100

 

 

 

 

 

 

 

 

 

 

 

3l1_2rotate.bmp

 

24/100

 

 

1/10

 

 

 

 

 

 

 

3l2_2.bmp

 

 

21/100

 

 

 

 

 

 

 

 

 

alexR1_3.bmp

 

 

 

 

 

4/40

 

 

 

 

 

 

alexR2_3.bmp

 

 

 

 

 

 

4/40

 

 

 

 

 

apmAR1_2.bmp

 

 

 

 

 

 

 

4/40

 

 

 

 

apmAR2_2.bmp

 

 

 

 

 

 

 

 

9/90

 

 

 

apmAR3_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

apmBR1_2.bmp

 

 

 

 

 

 

 

 

 

 

12/100

 

apmBR2_2.bmp

 

 

 

 

 

 

 

 

 

 

 

20/100

apmBR3_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

hedgeR1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

hedgeR2_3.bmp

 

 

 

 

 

 

 

 

 

 

 

 

karR1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

karR2_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

starkyR1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

starkyR2_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

starR1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

vasL1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

vasL2_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

vasR1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

vovR1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

1L1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

1L2_2.BMP

 

 

 

 

 

 

 

 

 

 

 

 

1R1_2.BMP

 

 

 

 

 

 

 

 

 

 

 

 

1R2_1rotate2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

1R2_2.BMP

 

 

 

 

 

 

 

 

 

 

 

 

1R3_2.BMP

 

 

 

 

 

 

 

 

 

 

 

 

1R4_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

2l1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

2l2_2.bmp

 

 

 

 

 

 

 

1/10

 

 

 

 

2r1_1.bmp

 

 

 

 

 

 

 

 

 

 

 

 

2r2_1.bmp

 

 

 

 

 

 

 

 

 

 

 

 

2r3_1.bmp

 

 

 

 

 

 

 

 

 

 

 

 

3l1_2rotate.bmp

 

 

 

 

 

 

 

 

 

 

 

 

3l2_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

alexR1_3.bmp

 

 

 

 

 

 

 

 

 

 

 

 

alexR2_3.bmp

 

 

 

 

 

 

 

 

 

 

 

 

apmAR1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

apmAR2_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

apmAR3_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

apmBR1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

apmBR2_2.bmp

 

 

 

 

 

 

 

 

 

 

 

 

apmBR3_2.bmp

14/100

 

 

 

 

 

 

 

 

 

 

 

hedgeR1_2.bmp

 

7/70

 

 

 

 

 

 

 

 

 

 

hedgeR2_3.bmp

 

 

6/60

 

 

 

 

 

 

 

 

 

karR1_2.bmp

 

 

 

15/100

 

 

 

 

 

 

 

 

karR2_2.bmp

 

 

 

 

2/20

 

 

 

 

 

 

 

starkyR1_2.bmp

 

 

 

 

 

12/100

 

 

 

 

 

 

starkyR2_2.bmp

 

 

 

 

 

 

6/60

 

 

 

 

 

starR1_2.bmp

 

 

 

 

 

 

 

22/100

 

 

 

 

vasL1_2.bmp

 

 

 

 

 

 

 

 

20/100

 

 

 

vasL2_2.bmp

 

 

 

 

 

 

 

 

 

10/100

 

 

vasR1_2.bmp

 

 

 

 

 

 

 

 

 

 

15/100

 

vovR1_2.bmp

 

 

 

 

 

 

 

 

 

 

 

49/100

ПРИЛОЖЕНИЕ 5 АЛЬТЕРНАТИВНОЕ ИСПОЛЬЗОВАНИЕ ПРОГРАММЫ

Для тестирования программы было использовано 2 метода распознавания. Метод 1 не зависит от ориентации буквы на плоскости, метод 2 имеет привязанность к вертикальному положению буквы. При распознавании символьной информации было не распознано около 18% по методу 2 и 22% по методу 1. Результат сравнения приведен в табл. П.5.1.

Формат результата сравнения: A/B,

где A - количество совпавших минюций;

B - процент совпадения.

Таблица П.5.1

Результат распознавания символов

Открытый образ

Результат сравнения (метод 2)

Открытый образ

Результат сравнения (метод 1)

Первое обнару-женное значение

Второе

обнаруженное

значение

Первое обнаруженное значение

Второе

обнаруженное

значение

_a1.bmp

А (4/80)

Н (5/62)

_a1.bmp

Н (2 25)

Ы (1 20)

_a2.bmp

А (5/100)

Н (3/37)

_a2.bmp

А (2 40)

Ц (1 11)

_б1.bmp

Б (5/100)

Г (3/60)

_б1.bmp

Б (5 100)

Ш (4 44)

_б2.bmp

Б (5/83)

Е (5/55)

_б2.bmp

Б (5 83)

Ш (4 44)

_в1.bmp

В (3/100)

_в1.bmp

В (3 100)

Е (1 11)

_в2.bmp

В (3/100)

_в2.bmp

В (3 100)

Б (1 20)

_г1.bmp

Г (3/75)

Б (3/60)

_г1.bmp

Г (3 75)

Б (3 60)

_г2.bmp

Г (4/66)

Е (5/55)

_г2.bmp

Г (4 66)

Щ (3 20)

_д1.bmp

Д (8/80)

Щ (7/46)

_д1.bmp

Д (8 80)

Г (3 30)

_д2.bmp

Д (8/80)

Щ (5/33)

_д2.bmp

Д (9 90)

Щ (3 20)

_е1.bmp

Е (7/70)

Ы (8/61)

_е1.bmp

Е (7 70)

Э (5 50)

_ж1.bmp

Ж (10/83)

Х (7/58)

_ж1.bmp

Ж (10 83)

Х (7 58)

_ж2.bmp

Ж (10/83)

Ж (6/50)

_ж2.bmp

Ж (10 83)

Х (7 58)

_з1.bmp

З (5/55)

Д (4/40)

_з1.bmp

З (5 55)

Э (4 44)

_з2.bmp

Э (4/57)

Щ (3/20)

_з2.bmp

Е (5 55)

Ю (1 14)

_и1.bmp

И (5/83)

Х (4/57)

_и1.bmp

И (4 66)

К (4 57)

_и2.bmp

И (4/66)

Ы (3/50)

_и2.bmp

И (4 66)

М (5 62)

_к1.bmp

К (7/100)

Ж (6/54)

_к1.bmp

К (7 100)

Ж (6 54)

_к2.bmp

К (7/100)

М (4/50)

_к2.bmp

К (7 100)

Ж (7 63)

_л1.bmp

П (5/83)

Л (4/57)

_л1.bmp

П (4 66)

Л (4 57)

_л2.bmp

П (5/83)

Л (4/57)

_л2.bmp

П (5 83)

Л (4 57)

_м1.bmp

М (6/75)

Ж (7/63)

_м1.bmp

М (7 87)

Ж (3 27)

_м2.bmp

М (8/100)

И (6/75)

_м2.bmp

М (8 100)

Ъ (2 25)

_н1.bmp

Н (8/100)

Ю (6/66)

_н1.bmp

Н (8 100)

Ч (6 75)

_н2.bmp

Н (8/100)

Ч (6/75)

_н2.bmp

Н (8 100)

Ч (6 75)

_о1.bmp

_о1.bmp

_о2.bmp

_о2.bmp

_п1.bmp

П (6/100)

Л (5/71)

_п1.bmp

П (6 100)

Ш (6 66)

_п2.bmp

П (6/100)

Г (3/50)

_п2.bmp

П (6 100)

Ш (6 66)

_р1.bmp

Д (3/30)

Г (1/25)

_р1.bmp

Р (1 25)

П (1 16)

_р2.bmp

Х (3/42)

Н (3/37)

_р2.bmp

Р (3 75)

Х (3 42)

_с1.bmp

С (2/40)

Ц (2/22)

_с1.bmp

С (3 60)

Ц (2 22)

_с2.bmp

К (1/14)

Ж (1/9)

_с2.bmp

Щ (1 6)

_т1.bmp

Т (5/100)

Г (3/60)

_т1.bmp

Т (5 100)

Г (2 40)

_т2.bmp

Т (5/100)

Г (3/60)

_т2.bmp

Т (4 80)

Г (3 60)

_у1.bmp

У (5/83)

Ч (5/71)

_у1.bmp

Ю (4 44)

Ш (4 44)

_у2.bmp

У (4/80)

Щ (4/26)

_у2.bmp

У (1 20)

К (1 14)

_ф1.bmp

Ф (3/100)

П (3/50)

_ф1.bmp

П (3 37)

Ц (3 33)

_ф2.bmp

Ф (3/100)

П (3/50)

_ф2.bmp

Ф (3 100)

Ц (3 33)

_х1.bmp

Х (7/87)

Ж (7/63)

_х1.bmp

Х (7 87)

Ч (4 50)

_х2.bmp

Х (7/87)

К (6/75)

_х2.bmp

Х (6 75)

К (5 62)

_ц1.bmp

Ц (8/88)

Ш (5/55)

_ц1.bmp

Ц (8 88)

П (4 50)

_ц2.bmp

Ц (9/100)

Ш (6/66)

_ц2.bmp

Ц (7 77)

Ш (6 66)

_ч1.bmp

Ч (7/100)

Ц (7/77)

_ч1.bmp

Ч (7 100)

Н (5 62)

_ч2.bmp

Ч (7/100)

Ц (7/77)

_ч2.bmp

Ч (7 100)

П (5 71)

_ш1.bmp

Ш (6/66)

Ц (5/55)

_ш1.bmp

Ш (6 66)

П (5 62)

_ш2.bmp

Ш (6/66)

Ц (5/55)

_ш2.bmp

П (5 62)

Ы (3 37)

_щ1.bmp

Ц (9/81)

Ю (8/72)

_щ1.bmp

Ц (6 54)

Щ (7 46)

_ъ1.bmp

Ъ (5/83)

Д (3/30)

_ъ1.bmp

Ъ (4 66)

Г (3 60)

_ъ2.bmp

Ъ (5/83)

З (2/33)

_ъ2.bmp

Ъ (5 83)

Ы (4 30)

_ы1.bmp

Ы (4/66)

Ч (4/57)

_ы1.bmp

Ь (3 50)

Ы (2 33)

_ы2.bmp

Ы (4/66)

Ь (3/50)

_ы2.bmp

Ы (5 83)

Ь (3 50)

_ь1.bmp

Ь (3/75)

Ы (3/60)

_ь2.bmp

Ь (3 60)

Н (2 25)

_ь2.bmp

Ю (2/22)

Щ (2/13)

_ь1.bmp

Ь (3 75)

Я (3 42)

_э1.bmp

Э (3/50)

Л (1/14)

_э1.bmp

Э (3 50)

Ш (1 11)

_э2.bmp

Э (5/100)

Щ (1/6)

_э2.bmp

Е (5 55)

Э (1 20)

_ю1.bmp

Ю (8/88)

Н (7/77)

_ю1.bmp

Ю (7 77)

Ч (6 66)

_ю2.bmp

Н (7/77)

Ю (6/66)

_ю2.bmp

Н (6 66)

Ю (5 55)

_я1.bmp

Я (5/71)

Ж (4/36)

_я1.bmp

Я (5 71)

Ж (1 9)

_я2.bmp

Я (4/57)

Ю (4/44)

_я2.bmp

Я (3 42)

Ь (2 33)

Тестирование на чувствительность к ориентации образа на плоскости:

_А_10.bmp

А (4 80)

Х (3 42)

_А_10.bmp

А (1 20)

Р (1 20)

_А_90.bmp

Е (3 33)

Б (2 33)

_А_90.bmp

А (4 80)

Ж (3 27)

_А_30.bmp

Ю (4 66)

Ч (3 50)

_А_30.bmp

А (4 80)

Ж (3 25)

_А_15.bmp

Ю (3 50)

Ц (3 42)

_А_15.bmp

А (3 60)

Щ (4 26)

Итого по методу 2: 11 нераспознано и 15 распознано лучше, чем метод 1.

Итого по методу 1: 13 нераспознано и 6 распознано лучше, чем метод 2.


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.