2
2
Copyright (c) 1993-2008, Cognitive Technologies
5
����������� ��������� ��������������� � ������������� ��� � ���� ��������� ����,
6
��� � � �������� �����, � ����������� ��� ���, ��� ���������� ��������� �������:
8
* ��� ��������� ��������������� ��������� ���� ������ ���������� ���������
9
���� ����������� �� ��������� �����, ���� ������ ������� � �����������
11
* ��� ��������� ��������������� ��������� ���� � ������������ �/��� �
12
������ ����������, ������������ ��� ���������������, ������ �����������
13
��������� ���� ���������� �� ��������� �����, ���� ������ ������� �
14
����������� ����� �� ��������.
15
* �� �������� Cognitive Technologies, �� ����� �� ����������� �� �����
16
���� ������������ � �������� �������� ��������� �/��� �����������
17
���������, ���������� �� ���� ��, ��� ���������������� �����������
20
��� ��������� ������������� ����������� ��������� ���� �/��� ������� ������ "���
21
��� ����" ��� ������-���� ���� ��������, ���������� ���� ��� ���������������,
22
������� �������� ������������ �������� � ����������� ��� ���������� ����, �� ��
23
������������� ���. �� �������� ��������� ���� � �� ���� ������ ����, �������
24
����� �������� �/��� �������� �������������� ���������, �� � ���� ������ ��
25
��Ѩ� ���������������, ������� ����� �����, ���������, ����������� ���
26
������������� ������, ��������� � �������������� ��� ���������� ����������
27
������������� ������������� ��������� (������� ������ ������, ��� ������,
28
������� ���������, ��� ������ �/��� ������ �������, ���������� ��-�� ��������
29
������� ��� �/��� ������ ��������� �������� ��������� � ������� �����������,
30
�� �� ������������� ����� ��������), �� �� ������������� ���, ���� ���� �����
31
�������� ��� ������ ���� ���� �������� � ����������� ����� ������� � ������.
5
╨рчЁх°рхЄё яютЄюЁэюх ЁрёяЁюёЄЁрэхэшх ш шёяюы№чютрэшх ъръ т тшфх шёїюфэюую ъюфр,
6
Єръ ш т фтюшўэющ ЇюЁьх, ё шчьхэхэш ьш шыш схч, яЁш ёюсы■фхэшш ёыхфє■∙шї єёыютшщ:
8
* ╧Ёш яютЄюЁэюь ЁрёяЁюёЄЁрэхэшш шёїюфэюую ъюфр фюыцэ√ юёЄртрЄ№ё єърчрээюх
9
т√°х єтхфюьыхэшх юс ртЄюЁёъюь яЁртх, ¤ЄюЄ ёяшёюъ єёыютшщ ш яюёыхфє■∙шщ
11
* ╧Ёш яютЄюЁэюь ЁрёяЁюёЄЁрэхэшш фтюшўэюую ъюфр т фюъєьхэЄрЎшш ш/шыш т
12
фЁєушї ьрЄхЁшрырї, яюёЄрты хь√ї яЁш ЁрёяЁюёЄЁрэхэшш, фюыцэ√ ёюїЁрэ Є№ё
13
єърчрээр т√°х шэЇюЁьрЎш юс ртЄюЁёъюь яЁртх, ¤ЄюЄ ёяшёюъ єёыютшщ ш
14
яюёыхфє■∙шщ юЄърч юЄ урЁрэЄшщ.
15
* ═ш эрчтрэшх Cognitive Technologies, эш шьхэр хх ёюЄЁєфэшъют эх ьюуєЄ
16
с√Є№ шёяюы№чютрэ√ т ърўхёЄтх ёЁхфёЄтр яюффхЁцъш ш/шыш яЁюфтшцхэш
17
яЁюфєъЄют, юёэютрээ√ї эр ¤Єюь ╧╬, схч яЁхфтрЁшЄхы№эюую яшё№ьхээюую
20
▌╥└ ╧╨╬├╨└╠╠└ ╧╨┼─╬╤╥└┬╦┼═└ ┬╦└─┼╦▄╓└╠╚ └┬╥╬╨╤╩╚╒ ╧╨└┬ ╚/╚╦╚ ─╨╙├╚╠╚ ╦╚╓└╠╚ "╩└╩
21
╬═└ ┼╤╥▄" ┴┼╟ ╩└╩╬├╬-╦╚┴╬ ┬╚─└ ├└╨└═╥╚╔, ┬█╨└╞┼══█╒ ▀┬═╬ ╚╦╚ ╧╬─╨└╟╙╠┼┬└┼╠█╒,
22
┬╩╦▐╫└▀ ├└╨└═╥╚╚ ╩╬╠╠┼╨╫┼╤╩╬╔ ╓┼══╬╤╥╚ ╚ ╧╨╚├╬─═╬╤╥╚ ─╦▀ ╩╬═╩╨┼╥═╬╔ ╓┼╦╚, ═╬ ═┼
23
╬├╨└═╚╫╚┬└▀╤▄ ╚╠╚. ═╚ ┬╦└─┼╦┼╓ └┬╥╬╨╤╩╚╒ ╧╨└┬ ╚ ═╚ ╬─═╬ ─╨╙├╬┼ ╦╚╓╬, ╩╬╥╬╨╬┼
24
╠╬╞┼╥ ╚╟╠┼═▀╥▄ ╚/╚╦╚ ╧╬┬╥╬╨═╬ ╨└╤╧╨╬╤╥╨└═▀╥▄ ╧╨╬├╨└╠╠╙, ═╚ ┬ ╩╬┼╠ ╤╦╙╫└┼ ═┼
25
═┼╤и╥ ╬╥┬┼╥╤╥┬┼══╬╤╥╚, ┬╩╦▐╫└▀ ╦▐┴█┼ ╬┴┘╚┼, ╤╦╙╫└╔═█┼, ╤╧┼╓╚└╦▄═█┼ ╚╦╚
26
╧╬╤╦┼─╬┬└┬╪╚┼ ╙┴█╥╩╚, ╤┬▀╟└══█┼ ╤ ╚╤╧╬╦▄╟╬┬└═╚┼╠ ╚╦╚ ╧╬═┼╤┼══█┼ ┬╤╦┼─╤╥┬╚┼
27
═┼┬╬╟╠╬╞═╬╤╥╚ ╚╤╧╬╦▄╟╬┬└═╚▀ ╧╨╬├╨└╠╠█ (┬╩╦▐╫└▀ ╧╬╥┼╨╚ ─└══█╒, ╚╦╚ ─└══█┼,
28
╤╥└┬╪╚┼ ═┼├╬─═█╠╚, ╚╦╚ ╙┴█╥╩╚ ╚/╚╦╚ ╧╬╥┼╨╚ ─╬╒╬─╬┬, ╧╬═┼╤┼══█┼ ╚╟-╟└ ─┼╔╤╥┬╚╔
29
╥╨┼╥▄╚╒ ╦╚╓ ╚/╚╦╚ ╬╥╩└╟└ ╧╨╬├╨└╠╠█ ╨└┴╬╥└╥▄ ╤╬┬╠┼╤╥═╬ ╤ ─╨╙├╚╠╚ ╧╨╬├╨└╠╠└╠╚,
30
═╬ ═┼ ╬├╨└═╚╫╚┬└▀╤▄ ▌╥╚╠╚ ╤╦╙╫└▀╠╚), ═╬ ═┼ ╬├╨└═╚╫╚┬└▀╤▄ ╚╠╚, ─└╞┼ ┼╤╦╚ ╥└╩╬╔
31
┬╦└─┼╦┼╓ ╚╦╚ ─╨╙├╬┼ ╦╚╓╬ ┴█╦╚ ╚╟┬┼┘┼═█ ╬ ┬╬╟╠╬╞═╬╤╥╚ ╥└╩╚╒ ╙┴█╥╩╬┬ ╚ ╧╬╥┼╨▄.
33
33
Redistribution and use in source and binary forms, with or without modification,
34
34
are permitted provided that the following conditions are met:
57
57
/************************************************************************/
58
/* DIFFRB.C - ������ �㭪樨 ��� ���ਬ���� */
59
/* ( � Tiger-e �뫨 ����ᠭ� ��� TASM) */
60
/************************************************************************/
61
/* LeftDistance - ����ﭨ� �� ��ࢮ�� �� ��� */
62
/* RightDistance -����ﭨ� �� ��ࢮ�� �ࠢ� ��� */
63
/* SumIntervalBits - ������� �㬬� ��� (��砫� � ����� - ���� ) */
64
/* SumBits - ������� �㬬� ��� � ��ப� ���� */
65
/* VertSum - ������� �㬬� ��� � �⮫�� */
66
/* MinMaxLeft - ���� min � max ����ﭨ� �� ����� ���� */
67
/* MinMaxRight - ���� min � max ����ﭨ� �� �ࠢ�� ���� */
68
/* NumHorizInterval - � ���ࢠ��� � ��ப� */
69
/* NumVertInterval - � ���ࢠ��� � �⮫�� */
70
/* FOOT_A - ����� ���⨪����� ���� ���� */
71
/* FOOT3 - ����� � ��� ( ��������� 3-����� �㪢�) */
72
/* FOOT - ����� � ��� */
73
/* Assym_let - �業��� ���⨪����� �ᨬ����� �㪢� */
74
/* CenterVertInterval - �।��� ���ࢠ�� � �⮫�� */
75
/************************************************************************/
76
/* ��������� : *********************************************************/
77
/* RASTER - 㪠��⥫� �� ��ப� ��� �� ��砫� ࠡ�祭� ���� */
79
/* NWIDTH - �ਭ� �����窨 � �.�. ��� ��ப� */
80
/* NHEIGHT- ������⢮ ��ப � �.�. */
58
/* DIFFRB.C - базовые функции для дискриминаторов */
59
/* ( в Tiger-e были написаны под TASM) */
60
/************************************************************************/
61
/* LeftDistance - расстояние до первого слева бита */
62
/* RightDistance -расстояние до первого справа бита */
63
/* SumIntervalBits - посчитать сумму бит (начало и конец - биты ) */
64
/* SumBits - посчитать сумму бит в строке байт */
65
/* VertSum - посчитать сумму бит в столбце */
66
/* MinMaxLeft - найти min и max расстояние на левом абрисе */
67
/* MinMaxRight - найти min и max расстояние на правом абрисе */
68
/* NumHorizInterval - число интервалов в строке */
69
/* NumVertInterval - число интервалов в столбце */
70
/* FOOT_A - вычислить вертикальную проекцию растра */
71
/* FOOT3 - вычислить число ног ( ожидается 3-ногая буква) */
72
/* FOOT - вычислить число ног */
73
/* Assym_let - оценить вертикальную асимметрию буквы */
74
/* CenterVertInterval - середина интервала в столбце */
75
/************************************************************************/
76
/* ПАРАМЕТРЫ : *********************************************************/
77
/* RASTER - указатель на строку или на начало рабочено растра */
78
/* Wx - ширина Р.Р. */
79
/* NWIDTH - ширина оболочки в Р.Р. или строки */
80
/* NHEIGHT- количество строк в Р.Р. */
81
/* Сolumn - столбец */
82
82
/************************************************************************/
84
84
#include <string.h>
85
85
#include "difdefs.h"
87
#include "diskrtab.h" /* ⠡���� */
87
#include "diskrtab.h" /* таблицы */
89
Word8 BUFFER[256]; /* ���⨪��쭠� ���� */
90
Word8 LOCAL[50]; /* ᯨ᮪ 業� ��� */
91
Word8 LOCAL_W[50]; /* ᯨ᮪ �ਭ ��� */
92
Word8 beg2, end1; /* ��砫� 2-��, ����� 1-�� ��� */
89
uchar BUFFER[256]; /* вертикальная проекция */
90
uchar LOCAL[50]; /* список центров ног */
91
uchar LOCAL_W[50]; /* список ширин ног */
92
uchar beg2, end1; /* начало 2-ой, конец 1-ой ног */
94
94
#define bytlen(bits) (REC_GW_WORD8(bits))
96
Int16 dnri_hook,broken_ii=0;
100
/* LeftDistance - ����ﭨ� �� ��ࢮ�� �� ��� */
101
Int16 LeftDistance(Word8 *RASTER, Int16 NWIDTH)
96
int16_t dnri_hook,broken_ii=0;
100
/* LeftDistance - расстояние до первого слева бита */
101
int16_t LeftDistance(uchar *RASTER, int16_t NWIDTH)
105
105
for(i=0;i<NWIDTH && (*RASTER)==0;i++,RASTER++);
125
125
return( (i<<3)+last_pos[*RASTER] );
128
/* SumIntervalBits - ������� �㬬� ��� (��砫� � ����� - ���� ) */
129
Int16 SumIntervalBits( Word8 *RASTER, Int16 n1, Int16 n2)
128
/* SumIntervalBits - посчитать сумму бит (начало и конец - биты ) */
129
int16_t SumIntervalBits( uchar *RASTER, int16_t n1, int16_t n2)
135
if( i==l ) /* ��砫� � ����� � ����� ���� */
135
if( i==l ) /* начало и конец в одном байте */
136
136
return( 3*bit_cnt[ mask_l[n1&7] & RASTER[i] & mask_r[n2&7] ] );
138
138
d = bit_cnt[ RASTER[i] & mask_l[n1&7] ];
139
139
d += bit_cnt[ RASTER[l] & mask_r[n2&7] ];
140
if( l==i+1 ) /* �� 㬥�⨫��� � 2 ���� */
140
if( l==i+1 ) /* все уместилось в 2 байта */
143
for(i++;i<l;i++)/* ����� 2-� ���� */
143
for(i++;i<l;i++)/* более 2-х байт */
144
144
d += bit_cnt[ RASTER[i] ];
148
/* SumBits - ������� �㬬� ��� � ��ப� ���� */
149
Int16 SumBits( Word8 *RASTER, Int16 NWIDTH)
148
/* SumBits - посчитать сумму бит в строке байт */
149
int16_t SumBits( uchar *RASTER, int16_t NWIDTH)
153
153
for(i=s=0;i<NWIDTH;i++,RASTER++)
154
154
s += bit_cnt[*RASTER];
158
/* VertSum - ������� �㬬� ��� � �⮫�� */
159
Int16 VertSum( Word8 *RASTER, Int16 Wx, Int16 NHEIGHT, Int16 Column)
158
/* VertSum - посчитать сумму бит в столбце */
159
int16_t VertSum( uchar *RASTER, int16_t Wx, int16_t NHEIGHT, int16_t Column)
162
Word8 mask=mask_byte[Column&7];
162
uchar mask=mask_byte[Column&7];
164
164
RASTER += (Column>>3);
173
/* NumHorizInterval - � ���ࢠ��� � ��ப� */
174
Int16 NumHorizInterval( Word8 *RASTER, Int16 NWIDTH)
173
/* NumHorizInterval - число интервалов в строке */
174
int16_t NumHorizInterval( uchar *RASTER, int16_t NWIDTH)
179
179
for( i=d=old=0;i<NWIDTH;i++,RASTER++)
182
182
d += piece_cnt[c];
183
183
if( (c&0x80) && old )
185
old = ((c&0x01)!=0) ; /* ������ ��� �।��饣� ���� */
184
d--; /* продолжение */
185
old = ((c&0x01)!=0) ; /* последний бит предыдущего байта */
191
/* NumVertInterval - � ���ࢠ��� � �⮫�� */
192
Int16 NumVertInterval( Word8 *RASTER, Int16 Wx, Int16 NHEIGHT, Int16 Column)
191
/* NumVertInterval - число интервалов в столбце */
192
int16_t NumVertInterval( uchar *RASTER, int16_t Wx, int16_t NHEIGHT, int16_t Column)
195
Word8 c,old,mask=mask_byte[Column&7];
195
uchar c,old,mask=mask_byte[Column&7];
197
197
RASTER += (Column>>3);
249
/* FOOT - ����� � ��� */
250
Int16 FOOT( Word8 *RASTER, Int16 Wx, Word8 NWIDTH, Word8 NLENGTH,
249
/* FOOT - вычислить число ног */
250
int16_t FOOT( uchar *RASTER, int16_t Wx, uchar NWIDTH, uchar NLENGTH,
254
Word8 c,curr,first,second;
254
uchar c,curr,first,second;
255
255
memset(LOCAL,0,50);
256
256
memset(LOCAL_W,0,50);
257
FOOT_A(RASTER,Wx,NWIDTH,NLENGTH); /* ���� */
257
FOOT_A(RASTER,Wx,NWIDTH,NLENGTH); /* проекция */
260
260
d -= (d>>3); /* 7/8 */
327
l=i; /* начало ноги */
330
LOCAL[k++]=(l+i)>>1; /* ����� ���� */
330
LOCAL[k++]=(l+i)>>1; /* конец ноги */
337
LOCAL[k++]=(l+i)>>1; /* ����� ������ ���� */
337
LOCAL[k++]=(l+i)>>1; /* конец последней ноги */
340
d >>= 1; /* d - � ᪠窮� */
340
d >>= 1; /* d - число скачков */
346
346
for(i=1;i<NWIDTH;i++)
347
347
if( BUFFER[i]==0 && BUFFER[i-1]==1 )
349
end1 = (Word8)i; /* ����� 1-�� ���� */
349
end1 = (uchar)i; /* конец 1-ой ноги */
350
350
for(i=NWIDTH-2;i>=0;i--)
351
351
if( BUFFER[i]==0 && BUFFER[i+1]==1 )
353
beg2 =(Word8) i; /* ��砫� 2-�� ���� */
353
beg2 =(uchar) i; /* начало 2-ой ноги */
358
/* CenterVertInterval - �।��� ���ࢠ�� � �⮫�� */
359
Int16 CenterVertInterval( Word8 *RASTER, Int16 Wx, Int16 NHEIGHT, Int16 Column,
360
Int16 *up, Int16 *down)
358
/* CenterVertInterval - середина интервала в столбце */
359
int16_t CenterVertInterval( uchar *RASTER, int16_t Wx, int16_t NHEIGHT, int16_t Column,
360
int16_t *up, int16_t *down)
362
Word8 mask = mask_byte[Column&7], c, old;
363
Int16 i,num,center,up_center;
362
uchar mask = mask_byte[Column&7], c, old;
363
int16_t i,num,center,up_center;
366
366
RASTER += (Column>>3);
383
case 0 : /* начало */
384
384
*up = NHEIGHT - i;
388
388
*down = NHEIGHT - i;
392
return(0); /* ����� 2 */
392
return(0); /* более 2 */
399
case 0 : /* ���孨� ���ࢠ� */
399
case 0 : /* верхний интервал */
400
400
center = up_center;
401
401
if( *up==-1 ) *up = NHEIGHT-0;
402
402
if( *down==-1 ) *down= NHEIGHT-up_center;
404
case 1 : /* ������ ���ࢠ� */
404
case 1 : /* нижний интервал */
405
405
center += NHEIGHT;
406
406
if( *up==-1 ) *up=NHEIGHT-up_center;
407
407
if( *down==-1 ) *down=NHEIGHT-NHEIGHT;
411
return( (NHEIGHT<<1)-center); /* 㤢������ ����ﭨ� �� ���� ���� */
411
return( (NHEIGHT<<1)-center); /* удвоенное расстояние от низа растра */
414
Int16 MinMaxLeft( Word8 *RASTER, Int16 Wx, Word8 NWIDTH, Word8 NHEIGHT,
415
Int16 *Pmin, Int16 *Pmax)
414
int16_t MinMaxLeft( uchar *RASTER, int16_t Wx, uchar NWIDTH, uchar NHEIGHT,
415
int16_t *Pmin, int16_t *Pmax)
417
Int16 maxr=0,minr=100,r,i;
417
int16_t maxr=0,minr=100,r,i;
419
419
NWIDTH= bytlen(NWIDTH);
420
420
for( i=0;i<NHEIGHT;i++,RASTER+=Wx)
434
/* MinMaxRight - ���� min � max ����ﭨ� �� �ࠢ�� ���� */
435
Int16 MinMaxRight( Word8 *RASTER, Int16 Wx, Word8 NWIDTH, Word8 NHEIGHT,
436
Int16 *Pmin, Int16 *Pmax)
434
/* MinMaxRight - найти min и max расстояние на правом абрисе */
435
int16_t MinMaxRight( uchar *RASTER, int16_t Wx, uchar NWIDTH, uchar NHEIGHT,
436
int16_t *Pmin, int16_t *Pmax)
438
Int16 maxr=0,minr=100,r,i, end;
438
int16_t maxr=0,minr=100,r,i, end;
440
440
r = bytlen(NWIDTH);
441
441
end = (r-((NWIDTH+7)/8))*8;
443
443
for( i=0;i<NHEIGHT;i++,RASTER+=Wx)
445
445
r = RightDistance(RASTER,NWIDTH)-end;
458
/* FOOT3_2 - ����� � ��� ( ��������� 3-����� �㪢�) */
459
/* � ���孥� � ������ ��������� */
460
Int16 FOOT3_2( Word8 *RASTER, Int16 Wx, Word8 NWIDTH, Word8 NLENGTH)
458
/* FOOT3_2 - вычислить число ног ( ожидается 3-ногая буква) */
459
/* в верхней и нижней половинах */
460
int16_t FOOT3_2( uchar *RASTER, int16_t Wx, uchar NWIDTH, uchar NLENGTH)
464
FOOT_A(RASTER,Wx,NWIDTH,(Word8)(NLENGTH/2)); /* ���� */
464
FOOT_A(RASTER,Wx,NWIDTH,(uchar)(NLENGTH/2)); /* проекция */
466
466
for(i=0;i<NWIDTH;i++)
467
BUFFER[i] = (BUFFER[i]>0); /* ����ਧ��� */
467
BUFFER[i] = (BUFFER[i]>0); /* бинаризация */
469
469
for(old=du=i=0;i<NWIDTH;i++)
494
dd >>= 1; /* du - � ᪠窮� ������ */
494
dd >>= 1; /* du - число скачков вверху */
495
495
return(dd==3&&du!=3);
498
/* FOOT3 - ����� � ��� ( ��������� 3-����� �㪢�) */
499
Int16 FOOT3( Word8 *RASTER, Int16 Wx, Word8 START, Word8 NWIDTH, Word8 NLENGTH, Int16 SHIFT)
498
/* FOOT3 - вычислить число ног ( ожидается 3-ногая буква) */
499
int16_t FOOT3( uchar *RASTER, int16_t Wx, uchar START, uchar NWIDTH, uchar NLENGTH, int16_t SHIFT)
503
FOOT_A(RASTER,Wx,NWIDTH,NLENGTH); /* ���� */
503
FOOT_A(RASTER,Wx,NWIDTH,NLENGTH); /* проекция */
506
506
d = (d>>SHIFT); /* 1/4 */
507
507
for(i=0;i<NWIDTH;i++)
508
BUFFER[i] = (BUFFER[i]>=d); /* ����ਧ��� */
508
BUFFER[i] = (BUFFER[i]>=d); /* бинаризация */
510
510
for(old=d=0,i=START;i<NWIDTH;i++)
566
Int16 FOOT_HEI( Word8 *RASTER, Int16 Wx, Word8 NWIDTH, Word8 NLENGTH)
566
int16_t FOOT_HEI( uchar *RASTER, int16_t Wx, uchar NWIDTH, uchar NLENGTH)
569
Word8 c,curr,first,second;
569
uchar c,curr,first,second;
570
570
memset(LOCAL,0,50);
571
571
memset(LOCAL_W,0,50);
572
FOOT_A(RASTER,Wx,NWIDTH,NLENGTH); /* ���� */
572
FOOT_A(RASTER,Wx,NWIDTH,NLENGTH); /* проекция */
575
575
d -= 2; // full heigh