Сведения о вопросе

FromRussia

10:04, 28th August, 2020

Как я могу измерить сходство между двумя изображениями?

Просмотров: 510   Ответов: 17

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

Есть ли библиотека / инструмент, который уже делает это? Как бы вы это реализовали?



  Сведения об ответе

SSESION

18:22, 9th August, 2020

Это полностью зависит от того, насколько умным вы хотите, чтобы алгоритм был.

Например, вот некоторые вопросы:

  • обрезанные изображения в сравнении с несрезанным изображением
  • изображения с добавленным текстом и без него
  • зеркальное отражение

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

  1. масштабируйте до чего-то небольшого, например 64x64 или 32x32, игнорируйте соотношение сторон, используйте комбинирующий алгоритм масштабирования вместо ближайшего пикселя
  2. масштабируйте цветовые диапазоны так, чтобы самый темный был черным, а самый светлый-белым
  3. поверните и переверните изображение так, чтобы самый светлый цвет был слева вверху, а затем справа вверху-следующий темный, слева внизу-следующий темный (насколько это возможно, конечно)

Редактировать алгоритм комбинированного масштабирования - это тот, который при масштабировании 10 пикселей до одного будет делать это с помощью функции, которая берет цвет всех этих 10 пикселей и объединяет их в один. Это можно сделать с помощью таких алгоритмов, как усреднение, среднее значение или более сложные, такие как бикубические сплайны.

Затем вычислите среднее расстояние pixel-by-pixel между двумя изображениями.

Чтобы найти возможное совпадение в базе данных, сохраните цвета пикселей в виде отдельных столбцов в базе данных, проиндексируйте их кучу (но не все, если вы не используете очень маленькое изображение) и выполните запрос, который использует диапазон для каждого значения пикселя, т. е. каждое изображение, где пиксель в маленьком изображении находится между -5 и +5 от изображения, которое вы хотите посмотреть вверх.

Это легко реализовать и довольно быстро запустить, но, конечно, не будет обрабатывать самые продвинутые различия. Для этого нужны гораздо более совершенные алгоритмы.


  Сведения об ответе

$DOLLAR

08:41, 3rd August, 2020

Способ измерения 'classic' состоит в том, чтобы разбить изображение на некоторое каноническое число секций (скажем, сетку 10x10), а затем вычислить гистограмму значений RGB внутри каждой ячейки и сравнить соответствующие гистограммы. Этот тип алгоритма предпочтителен как из-за его простоты, так и из-за его инвариантности к масштабированию и (небольшой!) перевод.


  Сведения об ответе

darknet

09:57, 27th August, 2020

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

По существу, цветовая гистограмма будет захватывать цветовое распределение изображения. Затем это можно сравнить с другим изображением, чтобы увидеть, совпадают ли распределения цветов.

Этот тип соответствия довольно устойчив к масштабированию (как только гистограмма нормализуется), и rotation/shifting/movement и т. д.

Избегайте pixel-by-pixel сравнений, так как если изображение слегка повернуто/сдвинуто, это может привести к большой разнице в сообщениях.

Гистограммы было бы легко создавать самостоятельно (предполагая, что вы можете получить доступ к значениям пикселей), но если вам этого не хочется, библиотека OpenCV -отличный ресурс для выполнения такого рода вещей. Вот презентация powerpoint, которая показывает, как создать гистограмму с помощью OpenCV.


  Сведения об ответе

PAGE

05:33, 2nd August, 2020

Разве алгоритмы кодирования видео, такие как MPEG, не вычисляют разницу между каждым кадром видео, чтобы они могли просто кодировать дельту? Вы можете посмотреть, как алгоритмы кодирования видео вычисляют эти различия кадров.

Посмотрите на это приложение для поиска изображений с открытым исходным кодом http://www.semanticmetadata.net/lire/ . Он описывает несколько алгоритмов подобия изображений, три из которых относятся к стандарту MPEG-7: ScalableColor, ColorLayout, EdgeHistogram и Автоцветовая корреляция.


  Сведения об ответе

+-*/

17:12, 13th August, 2020

Вы можете использовать чисто математический подход O(n^2), но он будет полезен только в том случае, если вы уверены, что нет никакого смещения или чего-то подобного. (Хотя, если у вас есть несколько объектов с однородной окраской, это все равно будет работать довольно хорошо.)

В любом случае, идея заключается в вычислении нормализованного точечного произведения двух матриц. C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2)) .

Эта формула фактически является "cosine" угла между матрицами (wierd). Чем больше сходство (скажем, Pij=Qij), C будет 1, и если они совершенно разные, скажем , для каждого i,j Qij = 1 (избегая деления на ноль), Pij = 255, то для размера nxn, чем больше будет n , тем ближе к нулю мы получим. (По приблизительным подсчетам: C=1/n^2).


  Сведения об ответе

nYU

05:08, 10th August, 2020

Для этого вам понадобится распознавание образов. Чтобы определить небольшие различия между двумя изображениями, сети Хопфилда работают довольно хорошо и довольно просты в реализации. Однако я не знаю никаких доступных реализаций.


  Сведения об ответе

SKY

15:18, 3rd August, 2020

Решение ruby можно найти здесь

Из readme:

Phashion - это оболочка Ruby вокруг библиотеки pHash, "perceptual hash", которая обнаруживает дубликаты и почти дубликаты мультимедийных файлов


  Сведения об ответе

SSESION

06:18, 17th August, 2020

Как измерить сходство между двумя изображениями полностью зависит от того, что вы хотели бы измерить, например: контраст, яркость, модальность, шум... а затем выберите наиболее подходящую для вас меру сходства. Вы можете выбрать из MAD (среднее абсолютное различие), MSD (среднее квадратическое различие), которые хороши для измерения brightness...there, также доступен CR (коэффициент корреляции), который хорош для представления корреляции между двумя изображениями. Вы также можете выбрать один из показателей сходства на основе гистограммы, таких как SDH (стандартное отклонение гистограммы разностного изображения) или многомодальные показатели сходства, такие как MI (взаимная информация) или NMI (нормализованная взаимная информация).

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


  Сведения об ответе

FAriza

21:44, 9th August, 2020

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

Если бы у вас было два одинаковых изображения, вы бы получили белую коробку, которая очень хорошо сжималась. Чем больше различались образы, тем сложнее было бы их представлять, а следовательно, и менее сжимаемо.

Вероятно, это не идеальный тест и, вероятно, гораздо медленнее, чем необходимо, но он может работать как быстрая и грязная реализация.


  Сведения об ответе

DINO

04:34, 7th August, 2020

Вы можете посмотреть на код инструмента с открытым исходным кодом findimagedupes, хотя он, по-видимому, был написан в perl, поэтому я не могу сказать, насколько легко его будет разобрать...

Читая страницу findimagedupes, которая мне понравилась, я вижу, что есть реализация C++ того же алгоритма . Вероятно, это будет легче понять.

И похоже, что вы также можете использовать gqview .


  Сведения об ответе

park

23:20, 23rd August, 2020

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

Интересно, есть ли у них в блоге какие-нибудь доступные библиотеки или фрагменты кода.


  Сведения об ответе

lesha

07:25, 9th August, 2020

чтобы расширить замечание Вайбхава, Хугин - это открытый источник 'autostitcher', который должен иметь некоторое представление о проблеме.


  Сведения об ответе

SKY

06:14, 19th August, 2020

Существует программное обеспечение для поиска изображений на основе контента, которое делает (частично) то, что вам нужно. Все ссылки и объяснения связаны с сайтом проекта, а также есть краткий учебник (Kindle): LIRE


  Сведения об ответе

pumpa

17:06, 8th August, 2020

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


  Сведения об ответе

ASER

07:51, 15th August, 2020

Если это то, что вы будете делать время от времени и не нуждаетесь в автоматизации, вы можете сделать это в редакторе изображений, который поддерживает слои, такие как Photoshop или Paint Shop Pro (вероятно, GIMP или Paint.Net тоже, но я не уверен в них). Откройте оба снимка экрана и положите один слой поверх другого. Измените режим смешивания слоев на Difference, и все, что одинаково между ними, станет черным. Вы можете перемещать верхний слой по кругу, чтобы свести к минимуму любые различия в выравнивании.


  Сведения об ответе

FAriza

07:31, 18th August, 2020

Вы можете использовать Siamese Network, чтобы увидеть, похожи ли эти два изображения или нет, следуя этому руководству . Из этого туториала вы узнаете, как объединить похожие изображения, а расстояние L2 можно использовать для измерения сходства двух изображений.


  Сведения об ответе

LAST

17:53, 29th August, 2020

Ни с чем не сравнить и сравнение pixel-by-pixel изображений, например,,

enter image description here


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться