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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2010, 17:23   #1
Astron
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 48
По умолчанию Сравнение картинок

Препложим есть картинка, а у меня в папке есть ну скажем милион картинок есть ли быстрый и оперативный способ сравнить эту картинку с милионом других картинок.

Милион абстракная циферка) И как вобще производться сравнение картинок
Astron вне форума Ответить с цитированием
Старый 20.03.2010, 11:29   #2
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

для сравнения обычно считают среднеквадратичное отклонение (MSE)


т.е. алгоритм реализации следующий:
1) берем очередной файл
2) проверяем размер и битность и если они разные то пункт 1
3) считаем MSE

для картинок сжатых без потерь при соответствии MSE=0
для картинок с потерями (jpeg и подобные) MSE нужно сравнивать с неким порогом допустимого отклонения
x128 вне форума Ответить с цитированием
Старый 20.03.2010, 21:41   #3
Astron
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 48
По умолчанию

и какова скорость такого метода? если скажем размер картинок будет одинаков)
Astron вне форума Ответить с цитированием
Старый 20.03.2010, 22:54   #4
Volt
Форумчанин
 
Аватар для Volt
 
Регистрация: 07.12.2008
Сообщений: 244
По умолчанию

Код:
var
  a, b: TMemoryStream;
begin
  a:=TMemoryStream.create;
  b:=TMemoryStream.create;
  a.LoadFromFile('первый файл');
  b.LoadFromFile('файл второй');
  if comparemem(a.Memory, b.Memory, a.size) then 
  showmessage('файлы одинаковы')
  else
  showmessage('файлы не одинаковы')
  a.free;
  b.free;
end;
|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅]

Последний раз редактировалось Volt; 20.03.2010 в 23:01.
Volt вне форума Ответить с цитированием
Старый 21.03.2010, 08:57   #5
Tolik_P
Пользователь
 
Регистрация: 14.11.2009
Сообщений: 11
По умолчанию

Volt, этот метод подойдет только для поиска одинаковых файлов. У меня вот задача найти похожее изображение из 10 предложенных. Дело в том, что к искомому изображению применен фильтр, который "смазал" и развернул изображение.
Пробовал суммировать отдельно все значения R, G, B каждой точки и потом через систему сравнивал с другими рисунками таким же методом. При нахождении минимального шага, рисунок считался ответом. Но таким методом распознает только в 50% случаев.

Подскажите, каким методом можно еще найти "схожесть" картинок.

Последний раз редактировалось Tolik_P; 21.03.2010 в 09:42.
Tolik_P вне форума Ответить с цитированием
Старый 21.03.2010, 12:34   #6
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Цитата:
Сообщение от Astron Посмотреть сообщение
и какова скорость такого метода? если скажем размер картинок будет одинаков)
при грамотной реализации скорость будет довольно большая.
Цитата:
Дело в том, что к искомому изображению применен фильтр, который "смазал" и развернул изображение.
смазывание не проблема, а вот поворот сложнее, если он не большой, то MSE подойдет, нужно только порог ошибки подобрать.
x128 вне форума Ответить с цитированием
Старый 21.03.2010, 13:09   #7
Tolik_P
Пользователь
 
Регистрация: 14.11.2009
Сообщений: 11
По умолчанию

x128, а можно маленький пример как использовать MSE ? Я смотрел функцию StdDev, но думаю что простое ее применение ничего не даст.
Вот к примеру мне нужно найти 2 этих изображения

из этих

(немогу вставить больше 5 рисунков.)
http://s001.radikal.ru/i194/1003/c1/c9344fba8ba0.jpg
http://s003.radikal.ru/i203/1003/88/bbd92c0f3a4b.jpg
http://s06.radikal.ru/i179/1003/70/50f119953470.jpg

Каким методом лучше всего тут искать?
Я понимаю что надо сделать все рисунки более схожими и только тогда начинать искать. Сделать фон одинаковым (или добавить к рисункам выбора такой же фон как и у искомых, или убрать у искомых и сделать везде черный), но всеравно, этот метод что я использую угадывает в среднем в 60%

Последний раз редактировалось Tolik_P; 21.03.2010 в 13:17.
Tolik_P вне форума Ответить с цитированием
Старый 22.03.2010, 10:12   #8
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

хм... это не совсем "сравнение картинок", это больше похоже на "распознавание образов", абсолютно разные задачи. В твоем случае обычным сравнением проблему не решить. Возможно есть другие решения твоей задачи?
Откуда взялись эти наборы картинок и для чего нужен этот поиск?
x128 вне форума Ответить с цитированием
Старый 22.03.2010, 12:50   #9
Tolik_P
Пользователь
 
Регистрация: 14.11.2009
Сообщений: 11
По умолчанию

x128, это капча. Нужно выбрать 2 картинки из 8 предложенных.
Tolik_P вне форума Ответить с цитированием
Старый 22.03.2010, 18:17   #10
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Если бы капчу так просто было обойти программно, то в ней бы отпал весь смысл... На этих картинках можно попробовать отойти от фона анализируя хроматические компоненты, т.к. фон серый. По крайней мере можно отсеять однозначно не верные результаты, а в оставшихся кандидатах искать другие характеристики которые помогут получить максимально точный результат. Как вариант можно проверить пикселы по интенсивности и объему.
x128 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
наложение картинок wolf950 HTML и CSS 6 28.08.2011 15:08
Сравнение картинок Crucian Общие вопросы Delphi 8 01.11.2010 05:13
Сохранение картинок. Marsik Помощь студентам 0 15.10.2009 14:40
Распознавание картинок! Lemo Помощь студентам 10 13.03.2009 12:10
Сравнение картинок bloood Общие вопросы C/C++ 1 30.03.2007 15:54