Как наиболее эффективно сравнить сходство двух изображений (на которых изображены здания) - PullRequest
0 голосов
/ 19 июня 2020

У меня проблема со сравнением изображений.

Чтобы быть более точным, у меня есть тестовое изображение (здание, снятое снаружи, может быть дом, квартира, большое здание c publi), и мне нужно сравнить его со 100000 других изображений зданий в моей БД.

Есть ли эффективный метод для вывода изображений X (которые наиболее похожи, если не одинаковы) наиболее точным из возможных на сегодняшний день способом?

Ряд ответов StackOverflow направили меня больше в сторону сопоставления функций OpenCV, но, к сожалению, мне не удалось добиться прогресса (плохая точность и, следовательно, препятствия с точки зрения способа ее улучшения).

Например , это тестовое изображение, которое я хотел бы сравнить (Белый дом - Юг). test_image

и это изображения в моей БД pic1_DB pic2_DB pic3_DB pic4_DB pic5_DB

Желаемый / идеальный результат был бы таким: «Тестовое изображение - это то же здание, что и на Pic1, Pic3, Pic4 и Pic5».

И тестовое изображение значительно отличается от Pic2.

Всем спасибо.

Ответы [ 2 ]

1 голос
/ 19 июня 2020

matchTemplate не будет работать в этом случае, так как они требуют точного соответствия размера и точки обзора.

Метод на основе возможностей Opencv может работать. Вы можете сначала попробовать метод на основе SIFT. Но общее предположение состоит в том, что вращение, перемещение, изменение перспективы ограничены. Это означает, что для соседней пары iamge нельзя сделать 1 снимок с расстояния 20 м, а другой снимок - с расстояния 10 км. Предположения сделаны так, чтобы функция могла быть связана. enter image description here

Метод, основанный на глубоком обучении, может хорошо работать при наличии достаточного количества наборов данных. для справки возьмите POS Enet. Он может соответствовать одному и тому же зданию с разных точек обзора и правильно связывать их. enter image description here

У каждого метода есть свои плюсы и минусы. Вы должны решить, какой метод вы можете себе позволить использовать

С уважением

Dr. Юань Шэнхай

0 голосов
/ 19 июня 2020

Для пиксельного сходства вы можете использовать res = cv2.matchTemplate(img1, img2, cv2.TM_CCOEFF_NORMED) \\ similarity = res[0][0], который принимает стандартный коэффициент корреляции для оценки простоты (сначала убедитесь, что два введенных изображения имеют одинаковый размер).

Для цветности c подобия, вы можете рассчитать гистограмму каждого изображения по cv2.calHist, а затем измерить сходство между каждой гистограммой с помощью метри c по вашему выбору.

Для интуитивного сходства, я боюсь, вам придется использовать машинное обучение или метод глубокого обучения, поскольку понятие «подобное» здесь довольно расплывчатое.

...