Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстро сравнить Bitmap, как 
V
    Опции темы
Darksquall
  Дата 24.8.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

Репутация: нет
Всего: 4



Как быстро сравнить 2 Bitmapa? хочеться быстрее чем попиксельно и scanline.
Мне нужно всего лишь узнать, отличаеться ли первый битмап от 2го (причем кол.во бит на пиксел, разрешение и размер у них одинаковые.) Может как то можно размером битмапа или хеш функцию подскажете?


--------------------
PM WWW ICQ   Вверх
Alexeis
Дата 24.8.2006, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Darksquall @  24.8.2006,  16:38 Найти цитируемый пост)
или хеш функцию подскажете?

Мне кажется, что для расчета хеша придется немало потрудится (в смысле процессорного времени). Это удобно когда много картинок надо сравнить с одной, тогда не нужно иметь в памяти сразу две картинки. Расчитал ХЕШ, сравнил, и вперед.
Я бы скорее сделал так, прочитал поле заголовка указывающее на начала растра в файле и скопировал бы растр целиком в буфер. Аналогично для второй картинки.
И выполнил CompareMem(); функция быстрая, как раз для этого и предназначеная.

Это сообщение отредактировал(а) alexeis1 - 24.8.2006, 16:49


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Darksquall
Дата 24.8.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

Репутация: нет
Всего: 4



Да хорошая штука, вот такая вот функция получилась, работает и все быстро, спасибо за подсказку.

Код

function CompareBitmaps(bm1,bm2:Tbitmap):boolean;
var
ms1, ms2: TMemoryStream;
begin
  ms1 := TMemoryStream.Create;
  try
    bm1.SaveToStream(ms1);
    ms1.Position:=0;
    ms2 := TMemoryStream.Create;
    try
      bm2.SaveToStream(ms2);
      ms2.Position:=0;
      if ms1.Size = ms2.Size then
        Result := CompareMem(ms1.Memory, ms2.memory, ms1.Size);
    finally
      ms2.Free;
    end;
  finally
    ms1.Free;
  end;
end;



--------------------
PM WWW ICQ   Вверх
Alexeis
Дата 24.8.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Darksquall @  24.8.2006,  16:38 Найти цитируемый пост)
причем кол.во бит на пиксел, разрешение и размер у них одинаковые.

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

Это сообщение отредактировал(а) alexeis1 - 24.8.2006, 17:47


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
creas0ft
Дата 24.8.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 5.8.2006
Где: Саранск

Репутация: нет
Всего: 2



А у меня в догонку такой вопрос.
Есть картинка с паттерном и несколько шаблонов.
Как быстрее кроме попиксельно сравнить?!
Причем паттерн по размерам может быть менее эталона....
Максимальное совпадение учитывается.
--------------------
Форум программистов уклонистов в сторону сео-шмео
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 24.8.2006, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(creas0ft @  24.8.2006,  18:53 Найти цитируемый пост)
паттерн 

Паттерн это бинарная битовая карта?

Цитата(creas0ft @  24.8.2006,  18:53 Найти цитируемый пост)
Максимальное совпадение учитывается.

Что здесь имеется ввиду я не понял smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
creas0ft
Дата 24.8.2006, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 5.8.2006
Где: Саранск

Репутация: нет
Всего: 2



Исходная картинка битовая.

Остальные картинки тоже битовые...

То есть имеем скажем картинку вида

000010000
000111000
001111110

И картинки паттернов
000000000
111111111
001110000

111111111
000000000
001110000

000010000
000111100
000111110


Делаем сравнения с искомой, и та что более совпадает и есть искомая (процентное отношение совпавших точек больше).

Это сообщение отредактировал(а) creas0ft - 24.8.2006, 20:00
--------------------
Форум программистов уклонистов в сторону сео-шмео
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 24.8.2006, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(creas0ft @  24.8.2006,  18:53 Найти цитируемый пост)
Как быстрее кроме попиксельно сравнить?!

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romikgy
Дата 24.8.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



предложу , такой вариант сравнения,
берем оба массива, и делаем xor друг с другом, допустим в 3 массив, после пробегаемся по 3 массиву (в котором результат) и определяем сколько бит в байте ненулевых, их считаем, на выходе делим получившееся число на общее число битов в массиве, если получится 0 значит 100% совпадение, если 1 то 0% совпадения


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 24.8.2006, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Romikgy @  24.8.2006,  21:07 Найти цитируемый пост)
определяем сколько бит в байте ненулевых,
Вот это как раз и самое интересное!



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romikgy
Дата 24.8.2006, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



самое простейшее 8 сдвигов и сравнений


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Alexeis
Дата 24.8.2006, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Romikgy @  24.8.2006,  23:00 Найти цитируемый пост)
самое простейшее 8 сдвигов и сравнений 
 Как вариант 8 XOR c маской 8 и сравнений. Но все это медленно и не оптимально. Куда быстрее наждый бит разместить в байт. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Romikgy
Дата 25.8.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146



имхо более оптимально , сделать XOR байта , и создать массив из 256 элементов, с уже посчитаными весами, и далее просто вводить значение результата ксора как индекс этого массива, и будет очень быстро smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
RomanEEP
Дата 29.8.2006, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 1
Всего: 8



По поводу сравнения Bitmap-ов - я думаю достаточно сравнить все пиксели, те
1) Смотрим размер одного пиксела
Код

case Bitmap1.PixelFormat of
pf8bit: PixSize := 1;
pf24bit: PixSize := 3;
pf32bit: PixSize := 4;
end;

2)Вычисляем размер всей битовой карты
Код

Size := PixSize * Bitmap1.Width * Bitmap1.Height

3)И сравниваем
Код

if CompareMem(Bitmap1.Scanline[0],Bitmap2.Scanline[0],Size) then
  ...
else
  ...
 

PM MAIL   Вверх
Alexeis
Дата 29.8.2006, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



RomanEEP, 
Цитата(creas0ft @  24.8.2006,  19:59 Найти цитируемый пост)
Делаем сравнения с искомой, и та что более совпадает и есть искомая (процентное отношение совпавших точек больше).

Это вариант сравнения на совпадение - не совпадение, а нужно сравнение с определением степени похожести.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0572 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.