Я хотел бы сравнить снимок экрана одного приложения (может быть веб-страницей) с ранее сделанным снимком экрана, чтобы определить, правильно ли отображается приложение. Мне не нужно точное сравнение совпадений, потому что аспект может немного отличаться (в случае веб-приложения, в зависимости от браузера, некоторые элементы могут находиться в немного другом месте). Это должно дать представление о том, насколько похожи скриншоты.
Есть ли библиотека / инструмент, который это уже делает? Как бы вы это реализовали?
algorithm
language-agnostic
image
image-processing
Антуан Обри
источник
источник
Ответы:
Это полностью зависит от того, насколько умным вы хотите, чтобы алгоритм был.
Например, вот некоторые проблемы:
Самый простой и простой алгоритм, который я видел, - это просто проделать следующие шаги с каждым изображением:
Редактировать алгоритм комбинирования масштабирования является один , что при масштабировании 10 пикселей вниз на один будет делать это с помощью функции , которая принимает цвет всех этих 10 пикселей и объединяет их в одно целое. Может быть выполнено с помощью таких алгоритмов, как усреднение, среднее значение или более сложных, таких как бикубические сплайны.
Затем вычислите среднее расстояние пиксель за пикселем между двумя изображениями.
Чтобы найти возможное совпадение в базе данных, сохраните цвета пикселей в виде отдельных столбцов в базе данных, проиндексируйте их группу (но не все, если вы не используете очень маленькое изображение) и выполните запрос, который использует диапазон для каждого значение пикселя, т.е. каждое изображение, где пиксель в маленьком изображении находится между -5 и +5 изображения, которое вы хотите найти.
Это легко реализовать и довольно быстро запустить, но, конечно, не справится с большинством сложных различий. Для этого вам понадобятся гораздо более продвинутые алгоритмы.
источник
«Классический» способ измерения этого - разбить изображение на некоторое каноническое количество секций (скажем, сетку 10x10), а затем вычислить гистограмму значений RGB внутри каждой ячейки и сравнить соответствующие гистограммы. Этот тип алгоритма предпочтителен как из-за его простоты, так и из-за его инвариантности к масштабированию и (небольшому!) Преобразованию.
источник
Используйте нормализованную гистограмму цвета. (Прочтите раздел о приложениях здесь ), они обычно используются в системах поиска / сопоставления изображений и представляют собой стандартный способ сопоставления изображений, который является очень надежным, относительно быстрым и очень простым в реализации.
По сути, цветовая гистограмма фиксирует цветовое распределение изображения. Затем это можно сравнить с другим изображением, чтобы увидеть, совпадают ли распределения цветов.
Этот тип сопоставления довольно устойчив к масштабированию (после нормализации гистограммы), вращению / смещению / перемещению и т. Д.
Избегайте попиксельных сравнений, так как если изображение немного повернуто / сдвинуто, это может привести к большой разнице.
Гистограммы было бы легко сгенерировать самостоятельно (при условии, что вы можете получить доступ к значениям пикселей), но если вам это не нравится, библиотека OpenCV - отличный ресурс для выполнения такого рода вещей. Вот презентация в PowerPoint, в которой показано, как создать гистограмму с помощью OpenCV.
источник
Разве алгоритмы кодирования видео, такие как MPEG, не вычисляют разницу между каждым кадром видео, чтобы они могли просто кодировать дельту? Вы можете посмотреть, как алгоритмы кодирования видео вычисляют эти различия кадров.
Взгляните на это приложение для поиска изображений с открытым исходным кодом http://www.semanticmetadata.net/lire/ . Он описывает несколько алгоритмов подобия изображений, три из которых относятся к стандарту MPEG-7: ScalableColor, ColorLayout, EdgeHistogram и Auto Color Correlogram.
источник
Вы можете использовать чисто математический подход
O(n^2)
, но он будет полезен, только если вы уверены, что нет смещения или чего-то в этом роде. (Хотя, если у вас есть несколько объектов с однородной окраской, это все равно будет работать очень хорошо.)В любом случае, идея состоит в том, чтобы вычислить нормализованное скалярное произведение двух матриц.
C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2))
.Эта формула на самом деле является «косинусом» угла между матрицами (wierd). Чем больше сходство (скажем
Pij=Qij
), C будет 1, и если они полностью разные, скажем, для каждогоi,j Qij = 1
(избегая деления на ноль)Pij = 255
, то для размераnxn
, чем большеn
будет, тем ближе к нулю мы получить. (По приблизительным подсчетам :)C=1/n^2
.источник
Для этого вам понадобится распознавание образов . Чтобы определить небольшие различия между двумя изображениями, сети Хопфилда работают достаточно хорошо и их довольно легко реализовать. Однако я не знаю каких-либо доступных реализаций.
источник
Рубиновый раствор можно найти здесь
Из ридми:
Phashion - это оболочка Ruby вокруг библиотеки pHash, «перцептивного хеша», которая обнаруживает повторяющиеся и почти повторяющиеся мультимедийные файлы.
источник
Как измерить сходство между двумя изображениями полностью зависит от того, что вы хотите измерить, например: контраст, яркость, модальность, шум ... а затем выбрать наиболее подходящий для вас показатель сходства. Вы можете выбрать MAD (средняя абсолютная разница), MSD (среднеквадратичная разница), которые подходят для измерения яркости ... также доступен CR (коэффициент корреляции), который хорошо отображает корреляцию между двумя изображениями. Вы также можете выбрать меры сходства на основе гистограммы, такие как SDH (стандартное отклонение гистограммы разностного изображения), или меры сходства по многомодальности, такие как MI (взаимная информация) или NMI (нормализованная взаимная информация).
Поскольку эти меры сходства требуют больших затрат времени, рекомендуется уменьшить масштаб изображений, прежде чем применять к ним эти меры.
источник
Мне интересно (и я действительно просто предлагаю идею, чтобы ее сбили), можно ли что-то получить, вычитая одно изображение из другого, а затем сжимая полученное изображение как jpeg или gif и принимая размер файла как мера сходства.
Если бы у вас было два одинаковых изображения, вы бы получили белое поле, которое хорошо сжималось бы. Чем больше различались изображения, тем сложнее их было бы представить и, следовательно, тем менее сжимаемыми.
Вероятно, не идеальный тест и, вероятно, намного медленнее, чем необходимо, но он может работать как быстрая и грязная реализация.
источник
Вы можете посмотреть код инструмента с открытым исходным кодом findimagedupes , хотя он, похоже, был написан на perl, поэтому я не могу сказать, насколько легко будет его разобрать ...
Читая страницу findimagedupes, которая мне понравилась, я вижу, что существует реализация того же алгоритма на C ++ . По-видимому, это будет легче понять.
И, похоже, вы также можете использовать gqview .
источник
Ну, чтобы не отвечать прямо на ваш вопрос, но я видел, как это происходило. Microsoft недавно запустила инструмент под названием PhotoSynth. который делает нечто очень похожее для определения перекрывающихся областей на большом количестве изображений (которые могут иметь разное соотношение сторон).
Интересно, есть ли у них в блоге какие-либо доступные библиотеки или фрагменты кода.
источник
Чтобы расширить заметку Вайбхава, hugin - это «автошивчик» с открытым исходным кодом, который должен иметь некоторое представление о проблеме.
источник
Есть программное обеспечение для поиска изображений на основе содержимого, которое (частично) делает то, что вам нужно. Все ссылки и пояснения связаны с сайтом проекта, а также есть краткое учебное пособие (Kindle): LIRE
источник
Вы можете использовать Siamese Network, чтобы увидеть, похожи ли два изображения или нет, следуя этому руководству . В этом руководстве похожие изображения сгруппированы, а
L2
расстояние можно использовать для измерения сходства двух изображений.источник
Если это то, что вы будете делать время от времени и не нуждаетесь в автоматизации, вы можете сделать это в редакторе изображений, который поддерживает слои, таком как Photoshop или Paint Shop Pro (возможно, GIMP или Paint.Net тоже, но я '' м не уверен насчет них). Откройте оба снимка экрана и поместите один поверх другого. Измените режим наложения слоя на «Разница», и все, что между ними одинаково, станет черным. Вы можете перемещать верхний слой, чтобы минимизировать любые различия в выравнивании.
источник
В Beyond Compare есть попиксельное сравнение изображений, например,
источник
Что ж, действительно базовый метод для использования мог бы пройти через каждый цвет пикселя и сравнить его с соответствующим цветом пикселя на втором изображении, но это, вероятно, очень медленное решение.
источник