Как выровнять два изображения на основе общей функции с помощью matchTemplate

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

Изображения не идеальны, поэтому я ищу какой-то способ, который выровнят на основе «наилучшего» соответствия (большинство совпадений). Первоначально я попытался выровнять изображения с помощью сочетания функций через SIFT, но совпадения функций часто были неправильными / слишком мало.

Вот код, который я использовал для поиска шаблона :

template = cv2.imread('template.png', 0) template = template - cv2.erode(template, None) image1 = cv2.imread('Image to align1.png') image2 = cv2.imread('Image to align2.png') image = image2 img2 = image[:,:,2] img2 = img2 - cv2.erode(img2, None) ccnorm = cv2.matchTemplate(img2, template, cv2.TM_CCORR_NORMED) print(ccnorm.max()) loc = np.where(ccnorm == ccnorm.max()) print(loc) threshold = 0.1 th, tw = template.shape[:2] for pt in zip(*loc[::-1]): if ccnorm[pt[::-1]] < threshold: continue cv2.rectangle(image, pt, (pt[0] + tw, pt[1] + th), (0, 0, 255), 2) 

Вот согласованные функции, 1 и 2 . Заранее спасибо.

One Solution collect form web for “Как выровнять два изображения на основе общей функции с помощью matchTemplate”

Ваш выбор в библиотеке OpenCV заключается в использовании любого количества методов для выбора нескольких точек и создания преобразования между этими точками изображения с помощью функции getAffineTransform или getPerspectiveTransform . Обратите внимание: функции, подобные этим, принимают точки в качестве аргументов, а не значения яркости (изображения). Вы захотите найти точки интереса к первому изображению (скажем, эти пятна маркера); и вы захотите найти те же самые точки во втором изображении и передать эти пиксельные местоположения функции, такой как getAffineTransform или getPerspectiveTransform . Затем, как только у вас есть эта матрица преобразования, вы можете использовать warpAffine или warpPerspective чтобы warpPerspective второе изображение в координаты первого (или наоборот).

Аффинные преобразования включают в себя перевод, вращение, масштабирование и сдвиг. Перспективные преобразования включают в себя все, от аффинных преобразований, а также искажение перспективы в направлениях x и y . Для getAffineTransform вам нужно отправить три пары точек из первого изображения, и там, где эти три одинаковых пикселя расположены во втором изображении. Для getPerspectiveTransform вы отправите четыре пиксельных пары из каждого изображения. Если вы хотите использовать все свои точки маркера, вы можете использовать findHomography а это позволит вам разместить более четырех очков, и он рассчитает оптимальную гомографию между всеми вашими точками.

Когда вы используете функцию обнаружения и сопоставления для выравнивания изображений, она использует эти функции в фоновом режиме. Разница в том, что он находит функции для вас. Но если это не работает, просто используйте ручные методы, чтобы найти понравившиеся вам функции, а затем используйте эти методы для этих элементов. Например, вы можете найти расположение шаблонов, как у вас уже есть, и определить это как область интереса (ROI), а затем разбить маркерные точки на более мелкие кусочки шаблона и найти эти места внутри своей рентабельности инвестиций. Тогда у вас есть соответствующие пары точек с обоих изображений; вы можете ввести свои местоположения в findHomography или просто выбрать три для использования с getAffineTransform или четыре с помощью getPerspectiveTransform и вы получите преобразование изображения, которое вы затем можете применить.


В противном случае вам нужно будет использовать что-то вроде алгоритма оптического потока Lukas-Kanade, который может выполнять прямое сопоставление изображений, если вы не хотите использовать функциональные методы, но они невероятно медленны по сравнению с выбором нескольких точек функции и поиском гомографий таким образом, если вы используете весь образ. Однако, если вам нужно сделать это только для нескольких изображений, это не такая уж огромная сделка. Чтобы быть более точным и сходиться гораздо быстрее, это поможет, если вы можете предоставить ему начальную гомографию, которая, по крайней мере, переводит ее примерно в правильное положение (например, вы обнаруживаете свое обнаружение функции, видите, что функция примерно равна (x', y') пикселей во втором изображении из первого и создайте гомографию с этим переводом).

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

Python - лучший язык программирования в мире.