Поддерживает ли OpenCV сравнение двух изображений, возвращая некоторое значение (возможно, процент), которое указывает, насколько похожи эти изображения? Например, 100% будет возвращено, если одно и то же изображение будет передано дважды, 0% будет возвращено, если изображения будут полностью разными.
Я уже читал много похожих тем здесь, в StackOverflow. Я также немного погуглил. К сожалению, я не смог найти удовлетворительного ответа.
image
opencv
comparison
similarity
Борис
источник
источник
Ответы:
Это огромная тема, на которую можно найти ответы от трех строк кода до целых исследовательских журналов.
Я выделю наиболее распространенные такие приемы и их результаты.
Сравнение гистограмм
Один из самых простых и быстрых способов. Предложено несколько десятилетий назад как средство поиска сходства изображений. Идея состоит в том, что в лесу будет много зеленого, а на человеческом лице - розового или чего-то еще. Итак, если вы сравните два изображения с лесами, вы увидите некоторое сходство между гистограммами, потому что на обоих много зеленого.
Соответствие шаблонов
Хороший пример здесь matchTemplate поиска подходящего совпадения . Он сворачивает поисковое изображение с тем, по которому выполняется поиск. Обычно он используется, чтобы найти меньшие части изображения в большом.
Соответствие функций
Считается одним из самых эффективных способов поиска изображений. Некоторые функции извлекаются из изображения таким образом, чтобы гарантировать повторное распознавание тех же функций даже при повороте, масштабировании или перекосе. Элементы, извлеченные таким образом, могут быть сопоставлены с другими наборами функций изображения. Считается, что другое изображение с высокой долей признаков, совпадающих с первым, изображает ту же сцену.
Определение гомографии между двумя наборами точек позволит вам также найти относительную разницу в угле съемки между исходными изображениями или степень перекрытия.
На сайте вопросов и ответов OpenCV я говорю о разнице между дескрипторами функций, которые отлично подходят при сравнении целых изображений и дескрипторов текстур, которые используются для идентификации таких объектов, как лица людей или автомобили на изображении.
источник
absdiff
codota.com/code/java/methods/org.opencv.core.Core/absdiff Установление порогового значения результата создает маску, которая позволяет выделить области, которые менялись от сцены к сцене.Если для сопоставления одинаковых изображений (одинаковый размер / ориентация)
Источник
источник
Раствора Сэма должно хватить. Я использовал комбинацию разницы гистограмм и сопоставления шаблонов, потому что ни один метод не работал у меня в 100% случаев. Однако я придал меньшее значение методу гистограммы. Вот как я реализовал простой скрипт на Python.
источник
Немного не по теме, но полезен питонический
numpy
подход. Это надежно и быстро, но сравнивает только пиксели, а не объекты или данные, которые содержит изображение (и для этого требуются изображения того же размера и формы):Очень простой и быстрый способ сделать это без openCV и любой библиотеки для компьютерного зрения - нормировать массивы изображений с помощью
После определения обоих нормированных изображений (или матриц) вы можете просто просуммировать по умножению изображений, которые вы хотите сравнить:
1) Если сравнить похожие картинки, сумма вернется 1:
2) Если они не похожи, вы получите значение от 0 до 1 (процент, если умножить на 100):
Обратите внимание, что если у вас есть цветные изображения, вы должны сделать это во всех трех измерениях или просто сравнить версию в оттенках серого. Мне часто приходится сравнивать огромное количество изображений с произвольным содержанием, и это действительно быстрый способ сделать это.
источник