ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Безопасность и Уязвимости > Уязвимости
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Ис нова об распознавании картинок
  #1  
Старый 18.01.2007, 21:53
Аватар для Mirovan
Mirovan
Познающий
Регистрация: 10.04.2005
Сообщений: 49
Провел на форуме:
108176

Репутация: 12
Отправить сообщение для Mirovan с помощью ICQ
По умолчанию Ис нова об распознавании картинок

Тема была затронута не раз. Но всё же.

Есть изображение: на странице http://l2top.ru/?voteme=1139&rating=full , требуется (как сбственно вы и догадались) распознать эту картинку.

При взгляде на это изображение срузу понятно что нет никакой защиты от распознавания - фон достаточно отличается от цвета цифр, цифры всегда имеют иди и тот же шрифт , размер и располагаются строго по центру.

Какой алгоритм здесь подойдет - распознавание по байтам или распознавание по шаблону (если кто знает четкий алгоритм скажите) ?
 
Ответить с цитированием

  #2  
Старый 18.01.2007, 22:19
Аватар для Mirovan
Mirovan
Познающий
Регистрация: 10.04.2005
Сообщений: 49
Провел на форуме:
108176

Репутация: 12
Отправить сообщение для Mirovan с помощью ICQ
По умолчанию

Начал писать код на пасе (делфи), возникла проблемка:

загружаю картинку со страницы http://l2top.ru/?voteme=1139&rating=full , сохраняю файлик как ЖПГ, открываю в mspaint, сохраняю как монохромный, плучается здорово !

Попытался реализовать аналогичное на делфи - не катит, получается все равно 24 бита:

function JPEG2BMP(const JPGFile, BMPFile: string): boolean;
var
JPG: TJPEGImage;
BMP: TBitmap;
begin
JPG:= TJPEGImage.Create;
BMP:= TBitmap.Create;
try
JPG.LoadFromFile(JPGFile);
BMP.PixelFormat:= pf1bit;
BMP.Assign(JPG);
BMP.SaveToFile(BMPFile);
finally
FreeAndNil(JPG);
FreeAndNil(BMP);
Result:= FileExists(BMPFile);
end;
end;
 
Ответить с цитированием

  #3  
Старый 18.01.2007, 23:16
Аватар для zl0ba
zl0ba
Banned
Регистрация: 10.10.2006
Сообщений: 596
Провел на форуме:
2132613

Репутация: 1365


По умолчанию

Наверно не в той ветке создал эту тему. С формулируй вопрос правильней!
 
Ответить с цитированием

  #4  
Старый 19.01.2007, 00:03
Аватар для ZaCo
ZaCo
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме:
4610226

Репутация: 1332


По умолчанию

тут достаточно определить цвет цифр, а так цифры всегда стоят на одних и тех же местах просто берем точку с нужной координатой. но тут возможно наложении на нее шума, поэтому берем область одной из цифр размерами 5х5 и находим тот цвет который встречается чаще - это и будет искомый. делаем с этого всего битовую матрицу - 1-пиксель принадлежит цифре, 0 - не принадлежит. сравниваем количество точек при совмещении. все.
 
Ответить с цитированием

  #5  
Старый 19.01.2007, 16:03
Аватар для Mirovan
Mirovan
Познающий
Регистрация: 10.04.2005
Сообщений: 49
Провел на форуме:
108176

Репутация: 12
Отправить сообщение для Mirovan с помощью ICQ
По умолчанию

Может быть проще сравнивать по заранее готовому шаблону ? Именно так я и хочу сделать, т.е. у меня имеются 10 файлов с готовыми шаблонами цифр - от 0 до 9, такого же размера как и на примере картинки и четко черно-белого цвета, далее просто дело прямых рук написания кода для сравнения, с этим у меня проблем, думаю не будет.

Но вот проблемка в преобразовании цветной картинки JPeG в черно-белую BMP (код см. выше), не могу понять почему не работат, думаю что компонент делфи как то кривовато работает, может есть другой способ?
 
Ответить с цитированием

  #6  
Старый 19.01.2007, 19:08
Аватар для Mirovan
Mirovan
Познающий
Регистрация: 10.04.2005
Сообщений: 49
Провел на форуме:
108176

Репутация: 12
Отправить сообщение для Mirovan с помощью ICQ
По умолчанию

Вобщем с изобрадением я разобрался, вот код:


function setBWColor(c: TColor): TColor;
begin
if c > (255*255*255)/2
then c := clWhite
else c := clBlack;
Result := c;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
h, w: Integer;
begin
for w := 0 to Image1.Width-1 do
for h := 0 to Image1.Height-1 do
Image1.Canvas.Pixels[w,h] := setBWColor(Image1.Canvas.Pixels[w,h]);
end;


В результате из BMP-шной картинки получается монохромное изображение. Теперь задача его раскодировать
 
Ответить с цитированием

  #7  
Старый 19.01.2007, 20:13
Аватар для Abra
Abra
Постоянный
Регистрация: 17.09.2005
Сообщений: 375
Провел на форуме:
993362

Репутация: 175
По умолчанию

Цитата:
Теперь задача его раскодировать
))))))))))))
непредвиденное обстоятельство, да?))
 
Ответить с цитированием

  #8  
Старый 19.01.2007, 20:48
Аватар для Mirovan
Mirovan
Познающий
Регистрация: 10.04.2005
Сообщений: 49
Провел на форуме:
108176

Репутация: 12
Отправить сообщение для Mirovan с помощью ICQ
По умолчанию

Ну, вобщем приложение готово, работает по шаблону, всё очень просто

вот код

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, jpeg, ExtDlgs;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    OpenPictureDialog1: TOpenPictureDialog;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TMas = array[1..210, 1..65] of Boolean;

var
  Form1: TForm1;
  Mas: TMas;
  dir: String;

implementation

{$R *.dfm}

function JPEG2BMP(const JPGFile, BMPFile: string): boolean;
// Ôóíêöèÿ äëÿ êîíâåðòèðîâàíèÿ JPEG ôàéëà â <BMP>
// JPGFile - èìÿ îòêðûâàåìîãî ôàéëà
// BMPFile - èìÿ <ñîõðàíÿåìîãî> ôàéëà
var
  JPG: TJPEGImage;
  BMP: TBitmap;
begin
  JPG := TJPEGImage.Create;
  BMP := TBitmap.Create;
  try
    JPG.LoadFromFile(JPGFile);
    BMP.PixelFormat:= pf1bit;
    BMP.Assign(JPG);
    BMP.SaveToFile(BMPFile);
  finally
    FreeAndNil(JPG);
    FreeAndNil(BMP);
    Result := FileExists(BMPFile);
  end;
end;


function setBWColor(c: TColor): TColor;
begin
  if c > (255*255*255)/2
    then c := clWhite
    else c := clBlack;
  Result := c;
end;


function encodeImg(Mas: TMas): String;
type
  Tfiles = array[0..9] of String;
var
  f: Tfiles;
  i, j, k: Integer;
  shablon: array[1..32, 1..12] of Boolean;
  BMP: TBitmap;
  max, equal: Integer;
  temp, st: String;
begin
  for i := 0 to 9 do
    f[i] := dir + '/shablon/' + IntToStr(i) + '.bmp';

  BMP := TBitmap.Create;

  st := '';

  max := 0;
// 1 öèôðà
  for k := 0 to 9 do
    begin
      BMP.LoadFromFile(f[k]);
      for i := 1 to 32 do
        for j := 1 to 12 do
          if (BMP.Canvas.Pixels[i-1,j-1] = clWhite)
            then shablon[i,j] := true
            else shablon[i,j] := false;

      equal := 0;
      for i := 1 to 32 do
        for j := 1 to 12 do
          begin
            if shablon[i,j] = Mas[i+27,j+16] then equal := equal + 1;
          end;
      if (equal > max) then
        begin
          max := equal;
          temp := IntToStr(k);
        end;
    end;
  st := st + temp;

  max := 0;
// 2 öèôðà
  for k := 0 to 9 do
    begin
      BMP.LoadFromFile(f[k]);
      for i := 1 to 32 do
        for j := 1 to 12 do
          if (BMP.Canvas.Pixels[i-1,j-1] = clWhite)
            then shablon[i,j] := true
            else shablon[i,j] := false;

      equal := 0;
      for i := 1 to 32 do
        for j := 1 to 12 do
          begin
            if shablon[i,j] = Mas[i+54,j+16] then equal := equal + 1;
          end;
      if (equal > max) then
        begin
          max := equal;
          temp := IntToStr(k);
        end;
    end;
  st := st + temp;

  max := 0;
// 3 öèôðà
  for k := 0 to 9 do
    begin
      BMP.LoadFromFile(f[k]);
      for i := 1 to 32 do
        for j := 1 to 12 do
          if (BMP.Canvas.Pixels[i-1,j-1] = clWhite)
            then shablon[i,j] := true
            else shablon[i,j] := false;

      equal := 0;
      for i := 1 to 32 do
        for j := 1 to 12 do
          begin
            if shablon[i,j] = Mas[i+81,j+16] then equal := equal + 1;
          end;
      if (equal > max) then
        begin
          max := equal;
          temp := IntToStr(k);
        end;
    end;
  st := st + temp;

  max := 0;
// 4 öèôðà
  for k := 0 to 9 do
    begin
      BMP.LoadFromFile(f[k]);
      for i := 1 to 32 do
        for j := 1 to 12 do
          if (BMP.Canvas.Pixels[i-1,j-1] = clWhite)
            then shablon[i,j] := true
            else shablon[i,j] := false;

      equal := 0;
      for i := 1 to 32 do
        for j := 1 to 12 do
          begin
            if shablon[i,j] = Mas[i+108,j+16] then equal := equal + 1;
          end;
      if (equal > max) then
        begin
          max := equal;
          temp := IntToStr(k);
        end;
    end;
  st := st + temp;



  max := 0;
// 5 öèôðà
  for k := 0 to 9 do
    begin
      BMP.LoadFromFile(f[k]);
      for i := 1 to 32 do
        for j := 1 to 12 do
          if (BMP.Canvas.Pixels[i-1,j-1] = clWhite)
            then shablon[i,j] := true
            else shablon[i,j] := false;

      equal := 0;
      for i := 1 to 32 do
        for j := 1 to 12 do
          begin
            if shablon[i,j] = Mas[i+135,j+16] then equal := equal + 1;
          end;
      if (equal > max) then
        begin
          max := equal;
          temp := IntToStr(k);
        end;
    end;
  st := st + temp;



  max := 0;
// 6 öèôðà
  for k := 0 to 9 do
    begin
      BMP.LoadFromFile(f[k]);
      for i := 1 to 32 do
        for j := 1 to 12 do
          if (BMP.Canvas.Pixels[i-1,j-1] = clWhite)
            then shablon[i,j] := true
            else shablon[i,j] := false;

      equal := 0;
      for i := 1 to 32 do
        for j := 1 to 12 do
          begin
            if shablon[i,j] = Mas[i+162,j+16] then equal := equal + 1;
          end;
      if (equal > max) then
        begin
          max := equal;
          temp := IntToStr(k);
        end;
    end;
  st := st + temp;

  Result := st;

end;


procedure TForm1.Button1Click(Sender: TObject);
var
  h, w: Integer;
  Mas: TMas;
begin
  OpenPictureDialog1.Execute;
  JPEG2BMP(OpenPictureDialog1.FileName, dir+'/temp/temp.bmp');
  Image1.Picture.LoadFromFile(dir+'temp/temp.bmp');
  for w := 0 to Image1.Width-1 do
    for h := 0 to Image1.Height-1 do
      begin
        Image1.Canvas.Pixels[w,h] := setBWColor(Image1.Canvas.Pixels[w,h]);
        if (Image1.Canvas.Pixels[w,h] = clWhite)
          then Mas[w+1, h+1] := true   //áåëûé
          else Mas[w+1, h+1] := false; //÷åðíûé
      end;
  Edit1.Text := encodeImg(Mas);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  dir := ExtractFilePath(ParamStr(0));
end;

end.

p.s. работает только для картинки по адресу http://l2top.ru/?voteme=1139&rating=full , но на этой основе можно забадяжить своё
 
Ответить с цитированием

  #9  
Старый 19.01.2007, 20:50
Аватар для Mirovan
Mirovan
Познающий
Регистрация: 10.04.2005
Сообщений: 49
Провел на форуме:
108176

Репутация: 12
Отправить сообщение для Mirovan с помощью ICQ
По умолчанию

Цитата:
Сообщение от Abra  
))))))))))))
непредвиденное обстоятельство, да?))
Уже нет
 
Ответить с цитированием

  #10  
Старый 19.01.2007, 21:12
Аватар для nerezus
nerezus
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме:
6490435

Репутация: 2290


Отправить сообщение для nerezus с помощью ICQ
По умолчанию

А такая красивая функция encodeImg(), аж прямо ужас
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Генераторы картинок NIGHT_WOLF Болталка 1 09.11.2006 17:52
Freeinet, пару слов и много картинок.. (sorry модемщики).. c411k Авторские статьи 3 02.08.2006 02:34
Регер девяток, без картинок! QUAD Разное - Покупка, продажа, обмен 5 12.02.2006 16:16
Просмоторщик картинок - IrfanView Егорыч+++ Soft - Windows 0 27.07.2005 14:34



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ