OpenCV: найти похожий объект с сопоставлением контуров - PullRequest
0 голосов
/ 09 марта 2020

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

Я уже пробовал ORB, простое сопоставление с шаблоном, обнаружение краев Canny. И я не могу использовать нейронные сети.

Теперь я пытаюсь с таким алгоритмом:

  1. Бинаризовать шаблон изображения, чтобы получить формы

  2. Сдвиньте окно поверх другого двоичного изображения со скользящим окном и вычислите matchShape с шаблоном в каждом окне

  3. Найти лучшее совпадение

Как видите, этот метод дает мне странный результат

Двоичный шаблон

img.

Форма на другом двоичном изображении, например:

img

Я рассчитал matchShapes в разных частях этого изображения и лучший результат ~ 0.05 Я получил в этой части:

jpg

, что явно не похоже на исходную форму.

Код для скользящего окна:

import cv2

OFFSET = 5
SCALE_RATIO = [0.5, 1]

def get_scaled_list(img_path, template):
    matcher_list = []

    img = cv2.imread(img_path)
    #JUST BINARIZATION AND RESIZING
    img = preprocess(resize_image(img))

    height, width = img.shape

    # building size of scale window
    for scaler in SCALE_RATIO:
        x_point = 0
        y_point = 0

        x1_point = int(width * scaler)
        y1_point = x1_point

        if x1_point > height:
            y1_point = height

        while y1_point <= height:
            while x1_point <= width:
                img1 = img[y_point:y1_point, x_point:x1_point]

                #Comparing template and part of image
                diff = cv2.matchShapes(template, img1, cv2.CONTOURS_MATCH_I1, 0)

                data_tuple = (img_path, x_point, y_point, int(width * scaler), diff)
                matcher_list.append(data_tuple)

                x_point += OFFSET
                x1_point += OFFSET

            x_point = 0
            x1_point = int(width * scaler)

            y_point += OFFSET
            y1_point += OFFSET
    return matcher_list

Как выполнить правильное сопоставление формы и почему здесь наилучший результат?

1 Ответ

0 голосов
/ 10 марта 2020

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


Трудно добиться того, чего вы пытаетесь достичь, потому что у вас есть только информация о ребрах, а ребра сложны, разбиты на несколько независимых дуг и с соединениями.

Вы можете найти много решений, когда у вас есть одна замкнутая кривая (например, поиск "elasti c контурное соответствие"), но не для вашего случая. Это может быть случай «приблизительного соответствия графика эластичности c».

Другие возможные подходы - это специальные функции расстояния, такие как фаска или расстояния Хаусдорфа, но вы все равно можете застрять из-за несоответствия размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...