Распознавание образов.
Считываем число с индекса цитирования CY (Яндекс).
Продолжаем разговор на тему распознавания образов. В статье описывается метод, с помощью которого можно получить числовое значение индекса цитирования Яндекса (Yandex CY), используя сканирование картинки.
Среда программирования: Borland Delphi 5.
Пример распознавания цифр
Результат работы алгоритма: 450110400275230060407509400
Алгоритм построен на следующих принципах:


Чтобы поместить картинку из gif-файла счетчика, нужно воспользоваться, например, компонентом RxGIFAnimator, находящимся в составе библиотеки RX-Lib.
Пример связывания Bitmap и RxGIFAnimator:
Image1.Picture.Bitmap.Assign(RxGIFAnimator1.Image);
Образ цифр находится в следующей структуре:
num : array [0..9, 0..4, 0..14] of integer; // массив образов xAlpha : integer; // величина размытия (для приблизительного вычисления)
Каждая цифра характеризуется 10 точками.


Процедура формирования шаблонов цифр:
Procedure CreateTemplate; var i, j, k : integer; begin // разница в цветовой палитре xAlpha := 5; // заполняем массив образов прозрачным цветом for i := 0 to 9 do for j := 0 to 4 do for k := 0 to 14 do num[i,j,k] := 0; // ести в ячейке 1, то это метка цифры. // если -1 - то наоборот - должно быть пусто. // 0 num[0, 3, 0]:= 1; num[0, 1, 3] := 1; num[0, 4, 5] := 1; num[0, 0, 6]:= 1; num[0, 0, 9]:= 1; num[0, 4, 11]:= 1; num[0, 2, 14]:= 1; num[0, 3, 1]:=-1; num[0, 2, 8]:= -1; num[0, 3, 12]:=-1; // 1 num[1, 3, 0] := 1; num[1, 2, 2] := 1; num[1, 3, 5] := 1; num[1, 2, 9]:= 1; num[1, 3, 12]:= 1; num[1, 1, 14]:= 1; num[1, 4, 14]:= 1; num[1, 0, 9]:= -1; num[1, 0, 10]:=-1; num[1, 0, 11]:=-1; // 2 num[2, 2, 0]:= 1; num[2, 0, 2] := 1; num[2, 1, 4] := 1; num[2, 4, 4]:= 1; num[2, 2, 8]:= 1; num[2, 0, 12]:= 1; num[2, 4, 14]:= 1; num[2, 2, 2]:=-1; num[2, 0, 7] :=-1; num[2, 4, 8] :=-1; // 3 num[3, 1, 0]:= 1; num[3, 0, 2]:= 1; num[3, 3, 2]:= 1; num[3, 1, 7]:= 1; num[3, 2, 7]:= 1; num[3, 4, 9]:= 1; num[3, 0, 1]:= 1; num[3, 2, 3]:=-1; num[3, 0, 7]:=-1; num[3, 0, 8]:=-1; // 4 num[4, 3, 1] := 1; num[4, 4, 2] := 1; num[4, 3, 6] := 1; num[4, 0, 10]:= 1; num[4, 4, 10]:= 1; num[4, 2, 11]:= 1; num[4, 3, 14]:= 1; num[4, 0, 1] :=-1; num[4, 2, 10]:=-1; num[4, 1, 14]:=-1; // 5 num[5, 1, 0]:= 1; num[5, 2, 1] := 1; num[5, 3, 1] := 1; num[5, 0, 6]:= 1; num[5, 3, 7]:= 1; num[5, 3, 10]:= 1; num[5, 1, 14]:= 1; num[5, 3, 3]:=-1; num[5, 0, 8] :=-1; num[5, 1, 13]:=-1; // 6 num[6, 1, 0] := 1; num[6, 0, 2] := 1; num[6, 3, 3] := 1; num[6, 4, 9]:= 1; num[6, 0, 10]:= 1; num[6, 0, 13]:= 1; num[6, 3, 13]:= 1; num[6, 2, 4] :=-1; num[6, 2, 10]:=-1; num[6, 4, 14]:=-1; // 7 num[7, 0, 0]:= 1; num[7, 2, 0] := 1; num[7, 1, 1] := 1; num[7, 3, 1]:= 1; num[7, 3, 4]:= 1; num[7, 2, 10]:= 1; num[7, 1, 11]:= 1; num[7, 1, 2]:=-1; num[7, 0, 9] :=-1; num[7, 3, 14]:=-1; // 8 num[8, 2, 0]:= 1; num[8, 0, 2] := 1; num[8, 3, 4] := 1; num[8, 2, 7]:= 1; num[8, 0, 9]:= 1; num[8, 4, 11]:= 1; num[8, 2, 14]:= 1; num[8, 2, 4]:=-1; num[8, 4, 7] :=-1; num[8, 2, 11]:=-1; // 9 num[9, 2, 0]:= 1; num[9, 0, 2] := 1; num[9, 4, 2] := 1; num[9, 0, 7]:= 1; num[9, 1, 8]:= 1; num[9, 4, 8] := 1; num[9, 1, 12]:= 1; num[9, 2, 1]:=-1; num[9, 0, 10]:=-1; num[9, 2, 13]:=-1; end;
Алгоритм распознавания цифр для счетчика индекса цитирования Яндекса не зависит от того, какое смещение по вертикали имеют цифры относительно друг друга и всего изображения.
Процедура получает на вход размер изображения, указатель на само изображение и возвращает строку, в которой находится последовательность распознанных цифр.
Procedure GetCY(xWidth, xHeight : integer; xBMP: TBitMap; var xNum : string); var i,j,k,x,y : integer; myColor : TColor; Count_On, Count_Off: integer; begin // распознавание цифр на картинке. // оптимизация для Yandex xNum := ''; i := 0; while i < (xWidth - 5) do begin j := 0; while j < (xHeight - 15) do begin k := 0; while k <=9 do begin Count_On := 0; Count_Off := 0; for x := 0 to 4 do for y := 0 to 14 do begin if (num[k,x,y] > 0) then begin myColor := xBMP.Canvas.Pixels[i+x,y+j]; if (GetRValue(MyColor)<xAlpha) and (GetGValue(MyColor)<xAlpha) and (GetBValue(MyColor)<xAlpha) then inc(Count_On) end; if (num[k,x,y] < 0) then begin myColor := xBMP.Canvas.Pixels[i+x,y+j]; if (GetRValue(MyColor)>xAlpha) and (GetGValue(MyColor)>xAlpha) and (GetBValue(MyColor)>xAlpha) then inc(Count_Off) end; end; if (Count_On = 7) and (Count_Off = 3) then begin xNum := xNum+IntToStr(k); k := 10; j := xHeight; i := i + 4; end; k := k + 1; end; j := j+1; end; i := i+1; end; end;
Использование алгоритма:
var s : string; begin GetCY ( Image1.Picture.Bitmap.Width, Image1.Picture.Bitmap.Height, Image1.Picture.Bitmap, s); ShowMessage := s; end;
Используя этот алгоритм, можно с успехом распознавать счетчики Яндекса, переводя их в текстовый вид.
Дополнительная информация на тему "распознавание образов":
Prolog — это язык логического программирования. Он является декларативным языком: вся стуктура программы представлена в виде правил и фактов. На нем можно строить экспертные системы, генерирующие ответы вида true (истина) или false (ложь). Пролог хорошо подходит для автоматического перебора вариантов решений с возвратами. Язык не требует написания большого объемного кода и позволяет получать отличные результаты.
Интересные материалы на сайте:
Несложные примеры программирования на PHP.
Описание самодельного механизма блокировки, а также контроль доступа к файлам операционной системы средствами языка программирования PHP.
Несколько слов о том, как можно ускорить работу php-скриптов, не меняя логики работы алгоритмов в целом.
Пример получения различной информации, полезной для программиста в построении движков сайта.