Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как я могу измерить сходство между двумя изображениями?
Я хотел бы сравнить скриншот одного приложения (может быть веб-страница) с ранее сделанным скриншотом, чтобы определить, правильно ли приложение отображает себя. Я не хочу точного сравнения соответствия, потому что аспект может быть немного другим (в случае веб-приложения, в зависимости от браузера, какой-то элемент может находиться в немного другом месте). Это должно дать меру того, насколько похожи скриншоты.
Есть ли библиотека / инструмент, который уже делает это? Как бы вы это реализовали?
Это полностью зависит от того, насколько умным вы хотите, чтобы алгоритм был.
Например, вот некоторые вопросы:
- обрезанные изображения в сравнении с несрезанным изображением
- изображения с добавленным текстом и без него
- зеркальное отражение
Самый простой и простой алгоритм , который я видел для этого, состоит в том, чтобы просто сделать следующие шаги для каждого изображения:
- масштабируйте до чего-то небольшого, например 64x64 или 32x32, игнорируйте соотношение сторон, используйте комбинирующий алгоритм масштабирования вместо ближайшего пикселя
- масштабируйте цветовые диапазоны так, чтобы самый темный был черным, а самый светлый-белым
- поверните и переверните изображение так, чтобы самый светлый цвет был слева вверху, а затем справа вверху-следующий темный, слева внизу-следующий темный (насколько это возможно, конечно)
Редактировать алгоритм комбинированного масштабирования - это тот, который при масштабировании 10 пикселей до одного будет делать это с помощью функции, которая берет цвет всех этих 10 пикселей и объединяет их в один. Это можно сделать с помощью таких алгоритмов, как усреднение, среднее значение или более сложные, такие как бикубические сплайны.
Затем вычислите среднее расстояние pixel-by-pixel между двумя изображениями.
Чтобы найти возможное совпадение в базе данных, сохраните цвета пикселей в виде отдельных столбцов в базе данных, проиндексируйте их кучу (но не все, если вы не используете очень маленькое изображение) и выполните запрос, который использует диапазон для каждого значения пикселя, т. е. каждое изображение, где пиксель в маленьком изображении находится между -5 и +5 от изображения, которое вы хотите посмотреть вверх.
Это легко реализовать и довольно быстро запустить, но, конечно, не будет обрабатывать самые продвинутые различия. Для этого нужны гораздо более совершенные алгоритмы.
Способ измерения 'classic' состоит в том, чтобы разбить изображение на некоторое каноническое число секций (скажем, сетку 10x10), а затем вычислить гистограмму значений RGB внутри каждой ячейки и сравнить соответствующие гистограммы. Этот тип алгоритма предпочтителен как из-за его простоты, так и из-за его инвариантности к масштабированию и (небольшой!) перевод.
Используйте нормализованную цветовую гистограмму. (Прочитайте раздел о приложениях здесь ), они обычно используются в системах поиска/сопоставления изображений и являются стандартным способом сопоставления изображений, который очень надежен, относительно быстр и очень прост в реализации.
По существу, цветовая гистограмма будет захватывать цветовое распределение изображения. Затем это можно сравнить с другим изображением, чтобы увидеть, совпадают ли распределения цветов.
Этот тип соответствия довольно устойчив к масштабированию (как только гистограмма нормализуется), и rotation/shifting/movement и т. д.
Избегайте pixel-by-pixel сравнений, так как если изображение слегка повернуто/сдвинуто, это может привести к большой разнице в сообщениях.
Гистограммы было бы легко создавать самостоятельно (предполагая, что вы можете получить доступ к значениям пикселей), но если вам этого не хочется, библиотека OpenCV -отличный ресурс для выполнения такого рода вещей. Вот презентация powerpoint, которая показывает, как создать гистограмму с помощью OpenCV.
Разве алгоритмы кодирования видео, такие как MPEG, не вычисляют разницу между каждым кадром видео, чтобы они могли просто кодировать дельту? Вы можете посмотреть, как алгоритмы кодирования видео вычисляют эти различия кадров.
Посмотрите на это приложение для поиска изображений с открытым исходным кодом http://www.semanticmetadata.net/lire/ . Он описывает несколько алгоритмов подобия изображений, три из которых относятся к стандарту MPEG-7: ScalableColor, ColorLayout, EdgeHistogram и Автоцветовая корреляция.
Вы можете использовать чисто математический подход 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).
Для этого вам понадобится распознавание образов. Чтобы определить небольшие различия между двумя изображениями, сети Хопфилда работают довольно хорошо и довольно просты в реализации. Однако я не знаю никаких доступных реализаций.
Решение ruby можно найти здесь
Из readme:
Phashion - это оболочка Ruby вокруг библиотеки pHash, "perceptual hash", которая обнаруживает дубликаты и почти дубликаты мультимедийных файлов
Как измерить сходство между двумя изображениями полностью зависит от того, что вы хотели бы измерить, например: контраст, яркость, модальность, шум... а затем выберите наиболее подходящую для вас меру сходства. Вы можете выбрать из MAD (среднее абсолютное различие), MSD (среднее квадратическое различие), которые хороши для измерения brightness...there, также доступен CR (коэффициент корреляции), который хорош для представления корреляции между двумя изображениями. Вы также можете выбрать один из показателей сходства на основе гистограммы, таких как SDH (стандартное отклонение гистограммы разностного изображения) или многомодальные показатели сходства, такие как MI (взаимная информация) или NMI (нормализованная взаимная информация).
Поскольку эти меры сходства стоят много времени, рекомендуется уменьшить масштаб изображений, прежде чем применять к ним эти меры.
Я задаюсь вопросом (и я действительно просто отбрасываю эту идею, чтобы быть сбитым), может ли что-то быть получено путем вычитания одного изображения из другого, а затем сжатия полученного изображения в виде jpeg gif и принятия размера файла в качестве меры сходства.
Если бы у вас было два одинаковых изображения, вы бы получили белую коробку, которая очень хорошо сжималась. Чем больше различались образы, тем сложнее было бы их представлять, а следовательно, и менее сжимаемо.
Вероятно, это не идеальный тест и, вероятно, гораздо медленнее, чем необходимо, но он может работать как быстрая и грязная реализация.
Вы можете посмотреть на код инструмента с открытым исходным кодом findimagedupes, хотя он, по-видимому, был написан в perl, поэтому я не могу сказать, насколько легко его будет разобрать...
Читая страницу findimagedupes, которая мне понравилась, я вижу, что есть реализация C++ того же алгоритма . Вероятно, это будет легче понять.
И похоже, что вы также можете использовать gqview .
Ну, не хочу отвечать прямо на ваш вопрос, но я видел, как это произошло. Недавно Microsoft запустила инструмент под названием PhotoSynth , который делает нечто очень похожее для определения перекрывающихся областей в большом количестве изображений (которые могут иметь различные пропорции).
Интересно, есть ли у них в блоге какие-нибудь доступные библиотеки или фрагменты кода.
Если это то, что вы будете делать время от времени и не нуждаетесь в автоматизации, вы можете сделать это в редакторе изображений, который поддерживает слои, такие как Photoshop или Paint Shop Pro (вероятно, GIMP или Paint.Net тоже, но я не уверен в них). Откройте оба снимка экрана и положите один слой поверх другого. Измените режим смешивания слоев на Difference, и все, что одинаково между ними, станет черным. Вы можете перемещать верхний слой по кругу, чтобы свести к минимуму любые различия в выравнивании.
Вы можете использовать Siamese Network, чтобы увидеть, похожи ли эти два изображения или нет, следуя этому руководству . Из этого туториала вы узнаете, как объединить похожие изображения, а расстояние L2 можно использовать для измерения сходства двух изображений.