Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2010, 13:17   #1
battlefrogg
 
Регистрация: 05.05.2010
Сообщений: 8
По умолчанию Delphi - сравнение изображений

Задание: сравнить изображение с эталоном и вывести степень сходства.
Есть идеи, но не могу их реализовать - с Дельфи плохо знаком.
Понимаю, что сначала нужно определить границы объекта - не знаю как сделать. Потом нужно поместить этот объект в прямоугольник 100х100 - как сжать рисунок знаю - Canvas.StretchDraw( Bounds(0,0,100,100), bmp) - но теперь не знаю как начать сравнивать. Немного почитал статьи на эту тему, говорят, что надо делить изображение на 10 частей и смотреть сколько пикселей черных в данной части, а затем сравнивать с эталоном.
battlefrogg вне форума Ответить с цитированием
Старый 07.07.2010, 19:21   #2
fbus
Форумчанин
 
Аватар для fbus
 
Регистрация: 23.10.2008
Сообщений: 460
По умолчанию

просто берешь i и j
Код:
for i:=1 to canvas1.width do
for j:=1 to canvas1.height do
if canvas1.pixels[i,j] = canvas2.pixels[i,j] then inc(n);

showmessage ('количество сходных пикселей = '+inttostr(n));
как-то так. потом переведи сходство в % (от общего кол-ва пикселей)
fbus вне форума Ответить с цитированием
Старый 07.07.2010, 19:44   #3
ChEaTeR-abc
Заблокирован
 
Регистрация: 30.06.2010
Сообщений: 104
По умолчанию

По поводу сжатия изображений:
Canvas.StretchDraw( Bounds(0,0,100,100), bmp) - что здесь означает bmp?Выдает ошибку Undeclared identifier: 'bmp'
ChEaTeR-abc вне форума Ответить с цитированием
Старый 07.07.2010, 19:50   #4
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

Используйте стандартный алгоритм распознания:
- Отсекаете однородные части (слева, справа, сверху, снизу), остается сравниваемый объект;
- Делите объект на квадраты (3х3, 4х4,...) по достаточной необходимости;
- Считаете сумму точек цвета рисунка в каждом полученном квадрате;
- Сравниваете полученные результаты.
Алгоритм достаточно надёжен.
Виталий Желтяков вне форума Ответить с цитированием
Старый 08.07.2010, 04:31   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
что здесь означает bmp?
Рискну предположить, что это
Код:
var
 bmp: TBitmap;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 08.07.2010, 10:25   #6
battlefrogg
 
Регистрация: 05.05.2010
Сообщений: 8
По умолчанию

Накалякал, пока только так.

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  FName: string;
  i, j: integer;
  n: longint;
begin
  if OpenPictureDialog1.Execute then FName:= OpenPictureDialog1.FileName;
  bmp:= TBitmap.Create;
  bmp.LoadFromFile(FName);
  Canvas.StretchDraw(Bounds(0,0,100,100), bmp);
  for i:=0 to 100 do
  for j:=0 to 100 do
  if Form1.Canvas.pixels[i,j] = Form1.Canvas.pixels[i+100,j] then inc(n);
  showmessage ('количество сходных пикселей = '+inttostr(n));
end;

procedure TForm1.Button2Click(Sender: TObject);
var  FName: string;
begin
  if OpenPictureDialog1.Execute then FName:= OpenPictureDialog1.FileName;
  bmp2:= TBitmap.Create;
  bmp2.LoadFromFile(FName);
  Canvas.StretchDraw(Bounds(100,0,100,100), bmp2);
end;

Последний раз редактировалось battlefrogg; 08.07.2010 в 10:29.
battlefrogg вне форума Ответить с цитированием
Старый 17.07.2010, 18:47   #7
battlefrogg
 
Регистрация: 05.05.2010
Сообщений: 8
По умолчанию

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    OpenPictureDialog1: TOpenPictureDialog;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  bmp: TBitmap;
  x, y: byte;
  ar: array [1..5, 1..5] of byte;

implementation

{$R *.dfm}

function Rect(x, y: byte): longint;
var
  i, j: integer;
begin
  for i := x*20 to x*20 + 20 do
  for j := y*20 to y*20 + 20 do
  if Form1.Canvas.pixels[i,j] <> clWhite then Inc(Result);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenPictureDialog1.Execute;
  bmp := TBitmap.Create;
  bmp.LoadFromFile(form1.OpenPictureDialog1.FileName);
  Canvas.StretchDraw(Bounds(1,1,100,100), bmp);
  for x := 0 to 4 do
  for y := 0 to 4 do
  begin
    ar[x, y] := Rect(x, y);
    Memo1.lines.add(inttostr(ar[x, y]));
  end;
end;
end.
Почему зацикливается?
battlefrogg вне форума Ответить с цитированием
Старый 17.07.2010, 18:58   #8
Korben5E
Форумчанин
 
Аватар для Korben5E
 
Регистрация: 13.07.2010
Сообщений: 346
По умолчанию

уменьшай каждое изображение до 1 пикселя и сравнивай...

(шутка )
Non est culpa vin, sed culpa bibentis
Korben5E вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кодирование изображений Constellation Свободное общение 2 11.02.2010 13:00
Работа с файлами в Турбо Паскале и Delphi. Сравнение!!!! viksa Помощь студентам 5 21.05.2009 21:32
обработка изображений в Delphi Астер Мультимедиа в Delphi 0 26.04.2009 12:33
Сравнение изображений DeDoK Общие вопросы Delphi 1 11.10.2008 21:16
delphi вывод 3д изображений ben95 Помощь студентам 1 29.03.2008 13:22