Как сравнить две картинки??

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Как сравнить две картинки??

Сообщение Fedorfx » 12.02.2005 (Сб) 19:29

Есть 2 картинки одинакового размера.
Как определить - одно и тоже избражение на них или нет?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.02.2005 (Сб) 22:36

Могу предложить API-шку RtlCompareMemory.
Изображение

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 13.02.2005 (Вс) 19:11

Как вариант - сделать хэш обеих картинок, например MD5 и сравнить. Если отличие хоть в одном бите, то хэши не совпадут.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.02.2005 (Вс) 20:13

...то хеши, скорее всего, не совпадут. А могут и совпасть ;-)
Изображение

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 13.02.2005 (Вс) 21:45

tyomitch писал(а):...то хеши, скорее всего, не совпадут. А могут и совпасть ;-)


Нет, не могут :).
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.02.2005 (Вс) 22:29

Хэш постоянной длины, такой как MD5, не может быть однозначным. Значит, для какой-то пары различных входных данных он даст одинаковый результат.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.02.2005 (Вс) 22:32

Предлагаю другой вариант.
Картинки уменьшаются до 25% от первоначального размера, количество цветов уменьшается до 256 и сравниваются (побитно) полученные миниатюры.
Lasciate ogni speranza, voi ch'entrate.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 13.02.2005 (Вс) 22:39

Но равенство миниатюр ведь не означает идентичность исходных образов? :(

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 13.02.2005 (Вс) 22:49

Идентичность не означает, но схожесть определит. По уму, там надо цветовой баланс делать еще, отбраковывать незначительные погрешности и т.п.
Lasciate ogni speranza, voi ch'entrate.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Re: Как сравнить две картинки??

Сообщение Amed » 13.02.2005 (Вс) 22:56

Fedorfx писал(а):...как определить - одно и тоже избражение на них или нет?


А схожесть ли надо определить? Не спорю, для первоначального анализа вполне сойдёт этот быстрый способ сравнения.
Кстати, почему уменьшать именно до 25%? Просто предположение "с потолка"?

Кстати говоря, Fedorfx, что мешает сравнить исходные картинки побитно (хотя бы GetPixel)? Низкое быстродействие? Оно /быстродействие/ не оговорено в постановке вопроса?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.02.2005 (Пн) 0:19

alibek писал(а):Идентичность не означает, но схожесть определит. По уму, там надо цветовой баланс делать еще, отбраковывать незначительные погрешности и т.п.

А чем твой хэш существенно отличается от MD5? Тот определит "схожесть", и твой - тоже "схожесть".

2Amed: вместо попиксельного сравнения можно сравнивать картинки целиком, АПИ-шкой RtlCompareMemory, которую я упомянул в первом ответе. Стопудово будет быстрее, чем через GetPixel.
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.02.2005 (Пн) 0:32

tyomitch, ни в коем разе не сомневаюсь, что GetPixel - один из наихудших в плане быстродействия методов. Он - первое, что пришло на ум.

Кстати, RtlCompareMemory, если не ошибаюсь, только в W2k/XP, так что накладывается некоторое ограничение на функциональность :(

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 14.02.2005 (Пн) 0:35

Во как. В воскресенье и все у компов :-)
По поводу быстродействия. Есть экран - например 1280-1024
Нужно найти в ней другую картику например 100-100
Вот и посчитай - сколько нужно точек сравнить чтобы выяснить есть эта кртинка на экране или нет.( вроде 10903200000)
не хило получается.
а если еще и в реалтайме то вообще плохонько.

Конечно не все так плохо и экран меньше и поисковик меньше но хочется сделать красиво а не просто точки сравнивать.:-)

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.02.2005 (Пн) 0:44

Выяснить... Скажем, можно сделать так:

По краям большой картинки (которую нужно найти) вырезать четыре квадратных области и искать их на большой картинке. Если "углы" совпадают, то можно и просканировать разок всё, что в центре.

Идея понятна? Иллюстрировать нагляднее?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 14.02.2005 (Пн) 0:46

Fedorfx писал(а):Во как. В воскресенье и все у компов :-)


Уже понедельник, Фёдор :D

Иллюстрация тут: http://amed.nm.ru/test.JPG

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.02.2005 (Пн) 2:10

Amed писал(а):tyomitch, ни в коем разе не сомневаюсь, что GetPixel - один из наихудших в плане быстродействия методов. Он - первое, что пришло на ум.

Кстати, RtlCompareMemory, если не ошибаюсь, только в W2k/XP, так что накладывается некоторое ограничение на функциональность :(

Необходимость тащить за собой 20Мб рантайма тоже накладывает некоторые ограничения на функциональность... Ладно, из уважения к Win98 GSerg-а не буду развивать тему :-)
Изображение

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 14.02.2005 (Пн) 9:48

Почему бы не попробывать с помощью OCX. два рабочих стола сравнивает мгновенно.

Только сравнение точное, т.е. без приближений и без вхождений.
Вложения
Сравнение изображений.rar
(314.18 Кб) Скачиваний: 144
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 14.02.2005 (Пн) 10:20

Почему бы не попробывать с помощью OCX. два рабочих стола сравнивает мгновенно.

А можно поподробнее?

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 14.02.2005 (Пн) 10:49

так пример, во общем-то,...., выше.
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 14.02.2005 (Пн) 11:03

tyomitch писал(а):А чем твой хэш существенно отличается от MD5? Тот определит "схожесть", и твой - тоже "схожесть".

MD5 схожесть не определит. При отличии хотя бы на один бит хэш будет совершенно другой. Просто есть вероятность, что хэши разных картинок совпадут, но эта вероятность невелика даже для 1024x768x32.
Lasciate ogni speranza, voi ch'entrate.

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 14.02.2005 (Пн) 13:09

kif писал(а):так пример, во общем-то,...., выше.


Я чегото сегдня туплю( у меня вчера 2 гранаты пинбольных в руках взорвались) но я не понимаю что имеется ввиду?

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 14.02.2005 (Пн) 13:40

Немного прокомментирую...
Для опознания простых картинок, академические методы вроде перцептрона или вейвлетов вряд ли пригодятся. Гораздо вероятнее, что приличнее всего будет работать решение, сделанное "на коленках", в соответствии со здравым смыслом." Главное - попытаться понять, почему лично вам, человеку, две картинки кажутся похожими - и честно это запрограммировать.
Идентичность картинок можно определить простым наложением (XOR). Для того чтобы картинки были идентичными они, естественно, должны быть одинакового размера.
Проблемы начинаются при нахождении "похожести" картинок.
Объекты должны "примерно совместиться", а количество "несовместимвшихся" объектов должно быть небольшим. Конкретика зависит от природы картинок. Вполне может помочь сильное гауссово (или просто линейное) разглаживание обоих картинок с последующим вычислением среднего попиксельного модуля разности. (Это для полутововых; для цветных картинок можно таким же способом отдельно сравнить яркость, насыщенность и цветовой тон, придавая главным образом значение яркости.)
Для более точного сравнения нужна векторизация и сравнение "на близость" координат x,y опорных точек, вместо сравнения яркостей на одинаковых x,y.
А чтобы попроще и побыстрее могу предложить привести картинки к одному размеру и цветности и сравнивать небольшое число (20~50) случайно выбраных маленьких участков (5х5~20х20) наложением. Вероятность того что при достаточно точном совпадении этих участков картинки разные довольно мала.
Ну а хэш - это либо 100% идентичность, либо как говорит Тёмыч - пальцем в небо (теоритически это возможно :) )

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 14.02.2005 (Пн) 23:23

Во куда занесло.
Мне не нужна похожесть. Мне нужна точность до пикселя.
Если можно пример XOR ( надеюсь не попиксельно :-) )
и я так и не понял что имелось ввиду про OCX .

Nick Bober
Новичок
Новичок
 
Сообщения: 38
Зарегистрирован: 29.10.2003 (Ср) 17:13
Откуда: Kiev

Сообщение Nick Bober » 17.02.2005 (Чт) 12:21

Примера к сожалению нет (особенно на ВБ). В своё время я делал это на АСМе. Идея такая: имеем две области памяти которые надо точно сравнить;
1 - Берем из каждой 4 байта (для 32-разрядных систем - Int32) и сравниваем.
2. Если равны перемещаем указатель на 4 байта вперед и шаг 1, если нет - выход.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.02.2005 (Чт) 12:46

Короче :)
Зацениваем функцию GetDIBits. С её помощью элементарно легко получаем картинку в виде массива Long (местный Integer :)). Сравниваем! Поэлементно :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 17.02.2005 (Чт) 13:06

Поэлементно Я идиот! Убейте меня, кто-нибудь!?
т.е. реализовывать цикл все равно придется своими ручками?
Я не ленивый - просто изобретать велосипед надоело. Столько уже наизобретал, что самому противно иногда.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.02.2005 (Чт) 13:10

А если вызвать функцию сравнения памяти, она чем будет заниматься, по-твоему? :)

Ещё можно извратиться таким вот способом...
Берём и одна картинку bitblt на другую с флагом NOT (или AND? В общем, какой-то флаг надо выбрать :)). В итоге, если картинки равны, то мы получаем ровное белое (или чёрное?) поле. И тогда первый же встреченный отличающийся пиксель говорит, что они не равны... гы :) Интересно, так получится или нет? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 17.02.2005 (Чт) 17:12

Ну я надеялся на что то похожее BitBlt
Кстати - она что тоже в цикле память копирует?
Мне казалось что проц имеет команды для работы с блоками памяти.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.02.2005 (Пт) 13:02

Имеет :)
Только блоки размером в 4 байта :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.02.2005 (Пт) 14:35

GSerg, имхо врёшь - а как же MMX, 3Dnow!, SSE/SSE2/SSE3 и другие страшные слова? Кто-то из них позволяет по 128 бит за такт пересылать...
Изображение

След.

Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 92

    TopList