Распознавание образов.
Считываем число с индекса цитирования 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 включает в себя множество дополнительных модулей, позволяющих работать с различными базами данных, контролировать аутентификацию пользователей и т.д.
Интересные материалы на сайте:
Программа актуально против средств защиты, ограничивающих скачивание файлов из расшаренных ресурсов других компьютеров в локальной сети.
Рисуем прямо на рабочем столе поверх всех окон. Любое изображение, на что способна фантазия. как сохранить промежуточную версию нельзя, то рисунок будет уникальным, неповторимым.
Из большого текста формируется набор ключевых слов, которые должны содержаться на правильной странице правильного веб-сайта.
Теоретические навыки при создании простейшего сайта с нуля.