2009-05-05 3 views
6

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

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

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

ответ

1

Посмотрите на статью article Андрея Кириллова на CodeProject. Он написал приложение C#, используя библиотеку видения компьютера AForge.NET, чтобы обнаружить движение. На сайте AForge.NET есть discussion двух разностей кадров для обнаружения движения.

5

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

Посмотрите на Perceptual Image Difference Utility.

+0

Спасибо за ссылку, я определенно буду играть с этим, чтобы увидеть, является ли это хорошей точкой перепрыжки за то, что я делаю. – STW

1

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

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

+0

Это то, что я никогда не рассматривал, но отличный момент. – STW

+0

Вы даже можете собрать короткий клип из копии предыдущего изображения и скопировать изображение после него. Сжатие, что с MPEG, и проанализировать результат .... ;-) – RBerteig

2

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

+0

Я определенно должен играть с этим; это, вероятно, один из немногих подходов, которые я мог бы разработать с нуля в пределах моего уровня мастерства. – STW

+1

Если вы хотите увидеть некоторые из этих подходов в действии, прежде чем сами их кодировать, взгляните на режимы композиции слоев многослойного растрового графического редактора. Paint.NET - это те, о которых я думаю, но это базовый двоичный пиксель op, поэтому все реализации должны быть одинаковыми. – bsneeze

2

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

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

+0

Это точно так же, как я боялся и надеялся; Я не разработчик C или C++ или Lua, но это выглядит как забавный проект, чтобы мои ноги/туловище/голова/snorkle были влажными. Я, наверное, буду в моей голове, но, полагаю, именно поэтому я упомянул snorkel. – STW

+1

Если вы погружаетесь, вы захотите посмотреть его компакт-диски сопутствующих библиотек и IUP. CD предоставляет общий холст для рисования на растровых изображениях (или экране), а IUP - это портативный интерфейс пользовательского интерфейса. Ссылки находятся на странице IMLab. На сайте www.lua.org есть много справок Lua через официальный список рассылки, а также пользователь для пользовательской вики, или здесь помечен как «lua», чтобы он служил в качестве такого оо-жизненно важного подводного плавания, когда вам это нужно. ;-) – RBerteig

2

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

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

0

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

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

+0

ps: напишите мне, если вам нужно больше ресурсов/помощь по этому поводу, я провел 2 года своей жизни с этим классом некоторое время назад :) –

Смежные вопросы