У меня есть два разных изображения:
а также
шириной 100 пикселей или 400 пикселей
Как вы можете видеть, они явно "одинаковы" с человеческой точки зрения. Теперь я хочу программно обнаружить, что они одинаковы. Я использую магию изображений через рубиновый камень, который называется rmagick
так:
img1 = Magick::Image.from_blob(File.read("image_1.jpeg")).first
img2 = Magick::Image.from_blob(File.read("image_2.jpeg")).first
if img1.difference(img2).first < 4000.0 # I have found this to be a good threshold, but does not work for cropped images
puts "they are the same!!!"
end
Хотя это хорошо работает для изображений с одинаковым соотношением / кадрированием, это не идеальный вариант, когда они имеют несколько иное кадрирование и размер был изменен до одинаковой ширины.
Есть ли способ сделать это для изображений с различной обрезкой? Меня интересует решение, в котором я могу сказать что-то вроде: одно изображение содержится внутри другого и покрывает где-то около 90%.
PS. Я могу получить изображения в более высоком разрешении, если это помогает (например, двойное)
источник
compare
инструмент командной строки ImageMagick имеет-subimage-search
переключатель.Ответы:
Вы можете взглянуть на соответствие функций. Идея состоит в том, чтобы найти функции на двух изображениях и сопоставить их. Этот метод обычно используется для поиска шаблона (скажем, логотипа) в другом изображении. По сути, особенность может быть описана как вещи, которые люди могут найти интересными на изображении, такие как углы или открытые пространства. Существует много типов методов обнаружения признаков, однако я рекомендую использовать масштабно-инвариантное преобразование признаков (SIFT) в качестве алгоритма обнаружения признаков. SIFT инвариантен к трансляции изображения, масштабированию, вращению, частично инвариантен к изменениям освещения и устойчив к локальным геометрическим искажениям. Похоже, это соответствует вашей спецификации, где изображения могут иметь немного разные отношения.
Учитывая ваши два предоставленных изображения, вот попытка сопоставить функции, используя функцию соответствия FLANN . Чтобы определить, совпадают ли эти два изображения, мы можем основать его на некотором заранее определенном пороговом значении, которое отслеживает число совпадений, которые проходят тест на соотношение, описанный в « Отличительных особенностях изображения от масштабно-инвариантных ключевых точек» Дэвида Дж. Лоу . Простое объяснение теста состоит в том, что тест отношения проверяет, являются ли совпадения неоднозначными и должны быть удалены, вы можете рассматривать это как метод удаления выбросов. Мы можем подсчитать количество совпадений, прошедших этот тест, чтобы определить, совпадают ли два изображения. Вот результаты соответствия функции:
Точки представляют все обнаруженные совпадения, в то время как зеленые линии представляют «хорошие совпадения», которые проходят тест на соотношение. Если вы не используете тест отношения, то все точки будут нарисованы. Таким образом, вы можете использовать этот фильтр в качестве порога, чтобы сохранить только наиболее подходящие функции.
Я реализовал это на Python, я не очень знаком с Rails. Надеюсь это поможет. Удачи!
Код
источник
Поскольку ImageMagick - это очень старый, продвинутый и многофункциональный инструмент, было бы сложно создать интерфейс, охватывающий большинство функций. Как ни круто, rmagick не делает (и не делает много попыток, предпринятых Python), не подходит близко, чтобы охватить все функции.
Я полагаю, что для многих случаев использования будет достаточно безопасно и намного проще просто выполнить метод командной строки и прочитать его. В рубине это будет выглядеть так;
Я расскажу о важных вещах, а затем расскажу о дополнительных заметках.
Команда использует магическое сравнение, чтобы проверить, является ли второе изображение (
small
) подизображением первого (large
). Эта функция не проверяет, что small строго меньше, чем large (как по высоте, так и по ширине). Число, которое я указал для сходства, составляет 0,2 (ошибка 20%), а значение для предоставленных вами изображений составляет около 0,15. Вы можете настроить это! Я считаю, что изображения со строгим подмножеством получают менее 0,01.stderr
иstdout
не "необходимо", но вы должны.источник
Получите гистограмму обоих изображений и сравните их. Это очень хорошо подойдет для обрезки и масштабирования, если только из-за этого не произойдет слишком резких изменений.
Это лучше, чем текущий подход, когда вы напрямую вычитаете изображения. Но такого подхода пока мало.
источник
Обычно сопоставление с шаблоном имеет хороший результат в таких ситуациях. Сопоставление с шаблоном - это метод поиска областей изображения, которые совпадают (похожи) на изображение шаблона (второе изображение). Этот алгоритм дает оценку наилучшей позиции в исходном изображении (второе).
В opencv, используя метод TM_CCOEFF_NORMED , дает оценку от 0 до 1. Если оценка равна 1, это означает, что изображение шаблона точно является частью (Rect) исходного изображения, но если у вас есть небольшое изменение в освещении или перспективе между два изображения, оценка будет ниже, чем 1.
Теперь, рассмотрев пороговое значение для оценки сходства, вы можете узнать, являются ли они одинаковыми или нет. Этот порог может быть получен путем проб и ошибок на нескольких образцах изображений. Я попробовал ваши изображения и получил оценку 0,823863 . Вот код (opencv C ++) и общая область между двумя изображениями, полученные путем сопоставления:
источник
Рассмотрим метод find_s Similar_region . Используйте меньшее из двух изображений в качестве целевого изображения. Попробуйте различные значения атрибутов fuzz на изображении и на целевом изображении.
источник