Дает ли сопоставление шаблонов с использованием фильтра Гаусса (пирамида) плохие результаты?

#python #opencv #computer-vision

#python #opencv #компьютерное зрение

Вопрос:

Я пытаюсь выполнить сопоставление шаблонов с использованием представления пирамиды, но получаю плохие результаты. Я не уверен, связаны ли плохие результаты с проблемой с моим алгоритмом / кодом или потому, что это просто результат.

Далее следует код, но я в основном взял изображение, преобразовал его в оттенки серого, обрезал изображение, чтобы получить шаблон, масштабировал шаблон, реализовал метод скользящего окна для сопоставления каждого из изображений пирамиды (масштабированного изображения) с изображением запроса, используя показатели корреляции нулевого среднего, SSD и NCC, и определил ошибку локализации

 # Load the images
image1 = cv2.imread("image1.jpg")

# Convert the images to grayscale
gray_image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)

# Crop the image
y_1 = 100
x_1 = 100
w_1 = 15
h_1 = 15
template_image1 = gray_image1[y_1:y_1   h_1, x_1:x_1   w_1].copy()

# Scale the template image
template_image1_5 = cv2.resize(template_image1, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)
template_image1_1 = cv2.resize(template_image1, None, fx=1.0, fy=1.0, interpolation=cv2.INTER_CUBIC)
template_image1_2 = cv2.resize(template_image1, None, fx=2.0, fy=2.0, interpolation=cv2.INTER_CUBIC)

# Store the scaled template and their associated scaling factors in a dictionary
scaled_templates_image1 = {'0.5': template_image1_5, '1.0': template_image1_1, '2.0': template_image1_2}

# Put the three different methods (Zero-mean correlation, SSD, and NCC) in a list
methods = ['cv2.TM_CCORR', 'cv2.TM_SQDIFF', 'cv2.TM_CCORR_NORMED']

for meth in methods:
    method = eval(meth)

    # Apply template matching
    for scale, scaled_template_image1 in scaled_templates_image1.items():
        gray_image1_copy = gray_image1.copy()

        result = cv2.matchTemplate(gray_image1_copy, scaled_template_image1, method)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

        # If the method is TM_SQDIFF, then take the minimum
        if method in [cv2.TM_SQDIFF]:
            top_left = min_loc
        else:
            top_left = max_loc
        bottom_right = (top_left[0]   w_3, top_left[1]   h_3)

        cv2.rectangle(gray_image1_copy, top_left, bottom_right, 255, 2)

        print(meth, top_left, bottom_right)

        euclidean_distance = np.linalg.norm(np.subtract((x_1, y_1), top_left))
        print("The localization error for the "   scale   " scale using "   meth   " method is: "  
              np.str(euclidean_distance))

        plt.subplot(121), plt.imshow(result, cmap='gray')
        plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
        plt.subplot(122), plt.imshow(gray_image1_copy, cmap='gray')
        plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
        plt.suptitle("The "   scale   " scale using "   meth   " method")

        plt.show()
  

Ошибки локализации повсюду. Без масштабирования ошибки локализации для SSD и NCC равны 0.0, в то время как ошибка локализации для корреляции с нулевым средним выше 100 (ожидаемая). При применении масштабирования почти все ошибки локализации превышают 100. Я ошибаюсь или мне просто следует ожидать таких результатов? Возможно, я неправильно понимаю концепцию и / или проблему. Приветствуется любая помощь.

Комментарии:

1. Вы смотрели на шаблон и изображение в каждом из масштабов, чтобы увидеть, имеют ли они смысл?

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