Определить разницу между двумя почти одинаковыми фотографиями - PullRequest
6 голосов
/ 05 мая 2009

Это довольно широкий вопрос; Какие инструменты / библиотеки существуют, чтобы делать две фотографии, которые не идентичны, но чрезвычайно похожи, и выявлять конкретные различия между ними?

В качестве примера можно было бы сфотографировать мою кушетку в пятницу после того, как моя подруга закончила уборку и перед длинными выходными, когда друзья закончили, пили и играли в рок-группе. Два дня спустя я делаю второе фото дивана; освещение одинаковое, диван не сдвинулся ни на миллиметр, и я использую штатив в фиксированном месте.

Какие инструменты я могу использовать для создания различий в изображениях или в третьем тепловом изображении различий? Есть ли инструменты для .NET?

Ответы [ 7 ]

5 голосов
/ 05 мая 2009

Это во многом зависит от формата изображения и сжатия. Но, в конце концов, вы, вероятно, берете два растра и сравниваете их попиксельно.

Взгляните на Утилита восприятия различий в изображениях .

2 голосов
/ 06 мая 2009

Я написал это бесплатное приложение .NET, используя инструментарий моей компании (DotImage). У него очень простой алгоритм, но код с открытым исходным кодом, если вы хотите поиграть с ним - вы можете адаптировать алгоритм к классам .NET Image, если не хотите покупать копию DotImage.

http://www.atalasoft.com/cs/blogs/31appsin31days/archive/2008/05/13/image-difference-utility.aspx

2 голосов
/ 05 мая 2009

Начнем с богатой библиотеки обработки изображений, такой как IM . Вы можете взаимодействовать с его операторами в интерактивном режиме с помощью инструмента IMlab , вызывать его напрямую из C или C ++ или использовать действительно приличную привязку Lua для извлечения из Lua. Он поддерживает широкий спектр операций с растровыми изображениями, а также расширяемую библиотеку форматов файлов.

Даже если вы ничего не перемещали преднамеренно, вы можете использовать алгоритм, такой как SIFT , чтобы получить хорошее выравнивание субпиксельного качества между кадрами. Если вы не хотите, чтобы рассматривал камеру как фиксированную, а также обнаруживал движение дивана.

2 голосов
/ 05 мая 2009

Самый очевидный способ увидеть каждую крошечную, обычно почти незаметную разницу - это XOR пиксельных данных. Если освещение даже немного отличается, это может быть слишком много. Различение (вычитание) данных пикселей может быть больше, чем вы ищете, в зависимости от того, насколько тонкими являются различия.

1 голос
/ 06 мая 2009

Ознакомьтесь с статьей Эндрю Кириллова на CodeProject. Он написал приложение на C #, используя библиотеку компьютерного зрения AForge.NET для обнаружения движения. На веб-сайте AForge.NET есть обсуждение двух разностей кадров для обнаружения движения.

1 голос
/ 05 мая 2009

Это интересный вопрос. Я не могу отослать вас к каким-либо конкретным библиотекам, но процесс, о котором вы спрашиваете, в основном минимальный случай компенсации движения. Именно так MPEG (MP4, DIVX и т. Д.) Видео так хорошо сжимает видео; Вы можете посмотреть в MPEG некоторую информацию о том, как реализованы эти алгоритмы компенсации движения.

Еще одна вещь, которую нужно иметь в виду; Сжатие JPEG - это блочное сжатие; большая часть выгоды, которую MPEG приносит от вещей, состоит в том, чтобы фактически сделать сравнение блоков. Если большая часть вашего изображения (скажем, фон) одинакова от одного изображения к другому, эти блоки не изменятся. Это быстрый способ уменьшить объем данных, которые необходимо сравнить.

0 голосов
/ 16 декабря 2009

просто используйте классы изображений .net, создайте новое растровое изображение () x 2 и посмотрите значения R & G & B каждого пикселя, вы также можете посмотреть значения A (альфа / прозрачность), если хотите при определении разницы.

также примечание: использование метода getPixel (y, x) может быть очень медленным, есть другой способ получить все изображение (менее элегантное) и для каждого, проходящего через него самостоятельно, если я помню, что оно вызывалось как getBitmap что-то похожее, посмотрите в классах обработки изображений / растровых изображений и прочитайте несколько статей, они действительно все, что вам нужно, и их не так сложно использовать, не переходите к сторонним разработчикам, если это не нужно.

...