Актуальная проблема распознавания образов решается с помощью ее декомпозиции на несколько более простых подзадач, одна из которых - проведение параметрического преобразования Хафа. Приведены примеры программ на С. Листинг #include #include #include #include #define MAXLINES 5 /* Максимальное число прямых */ /* для одного значения угла */ void InitHough(float delt, int freshold); void Hough(int x, int y, int dx, int dy); void CloseHough(void); int getch(void); /* Функция пользователя. Вход: координаты точки */ /* изображения. Выход: 1 или 0 - точка принадлежит */ /* изображению (черная) или нет (белая). */ extern int image(int x,int y); float dt; float far *Cos, far *Sin; unsigned far *H; int fresh; /* delt - размер шага по углу, */ /* freshold - минимальное число точек, по которому */ /* регистрируется прямая */ void InitHough(float delt, int freshold) { float t; int i; dt=delt; fresh=freshold; Cos=(float far *) farmalloc(sizeof(float)*(int)((M_PI+dt/2)/dt)); Sin=(float far *) farmalloc(sizeof(float)*(int)((M_PI+dt/2)/dt)); if(Cos==NULL || Sin==NULL) return; for(t=0, i=0; i<(int)((M_PI+dt/2)/dt); t+=dt, i++) { Cos[i]=cos(t); Sin[i]=sin(t); } } void CloseHough(void) { farfree(Cos); farfree(Sin); } void Hough(int x, int y, int dx, int dy) { int i,j,si,k,R,nt; int **lines; if(!(Cos && Sin)) return; si=4*max(dx,dy)/3; /* Число дискретных элементов по "ро" */ H=(unsigned far *)farmalloc(sizeof(int)*si); if(H==NULL) return; nt=(int)((M_PI+dt/2)/dt); /* Число шагов по углу */ lines=(int **)malloc(sizeof(int *)*nt); if(lines==NULL) goto out; for(i=0; i=0 && R < si) H[R]++; } } } R=0; for(i=0; i fresh) lines[k][R++]=i+1; /* Запоминаем максимумы "ро" для k-го угла */ } } for(i=0; i