www.gcmsite.ru

Новости Программы PHP-скрипты Статьи Числа
Услуги Резюме Игры Автомобили Поиск

СИСТЕМНОЕ И ВЕБ-ПРОГРАММИРОВАНИЕ
компьютерная техника, игры

Распознавание образов.
Считываем число с индекса цитирования CY (Яндекс).

Продолжаем разговор на тему распознавания образов. В статье описывается метод, с помощью которого можно получить числовое значение индекса цитирования Яндекса (Yandex CY), используя сканирование картинки.

Среда программирования: Borland Delphi 5.

Пример распознавания цифр

Счетчик индекса цитирования CY (Яндекс)

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

Интересные материалы на сайте:

Автор, разработчик: Шаров Евгений   (gcmsite@yandex.ru)
(c) 2000-2020 GCM-Site - системное и веб-программирование
Цитирование материалов сайта возможно только при наличии гиперссылки