Распознавание образов.
Считываем число с индекса цитирования CY (Яндекс).
Продолжаем разговор на тему распознавания образов. В статье описывается метод, с помощью которого можно получить числовое значение индекса цитирования Яндекса (Yandex CY), используя сканирование картинки.
Среда программирования: Borland Delphi 5.
Пример распознавания цифр
Результат работы алгоритма: 450110400275230060407509400
Алгоритм построен на следующих принципах:
-
Цифры в числах, отображаемых на счетчике цитирования, имеют одинаковое написание.
Изображение счетчика находится в объекте Bitmap : Tbitmap;
Чтобы поместить картинку из 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 точками.
-
7 точек, строго закрашенных цветом цифры
3 точки, строго не закрашенные цветом цифры
Процедура формирования шаблонов цифр:
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;
Используя этот алгоритм, можно с успехом распознавать счетчики Яндекса, переводя их в текстовый вид.
Дополнительная информация на тему "распознавание образов":
Apache — это кросплатформаенное программное обеспечение, относящееся к классу http-серверов. Поддерживается множеством операционных систем: Windows, Linux, MacOS и т.д. Одним из ключевых факторов в вопросе использования данного web-сервера является гибкость настройки и надежность выполнения операций. Apache включает в себя множество дополнительных модулей, позволяющих работать с различными базами данных, контролировать аутентификацию пользователей и т.д.
Интересные материалы на сайте:
Интересные алгоритмы проверки файлов на сжимаемость. Подойдут, например, для разработки собственного файлового архиватора.
Статья актуальна для Windows XP. Учимся менять приоритеты процессам, чтобы ускорить нужные или замедлить ненужные процессы.
Простой анализатор числового значения индекса цитирования от Яндекс.
Описание методов и функций, позволяющих рисовать на рабочем столе компьютера. Алгоритмы используются в программе для создания анимированных виртуальных открыток.