У меня есть набор различных изображений с птицами, но некоторые из них содержат перья, слегка видимые птицы и т. Д. c. Мне нужно найти изображения, где птица хорошо видна, и удалить изображения с перьями, далекими птицами и т. Д. c.
Я уже пробовал ORB, простое сопоставление с шаблоном, обнаружение краев Canny. И я не могу использовать нейронные сети.
Теперь я пытаюсь с таким алгоритмом:
Бинаризовать шаблон изображения, чтобы получить формы
Сдвиньте окно поверх другого двоичного изображения со скользящим окном и вычислите matchShape с шаблоном в каждом окне
- Найти лучшее совпадение
Как видите, этот метод дает мне странный результат
Двоичный шаблон
.
Форма на другом двоичном изображении, например:
Я рассчитал matchShapes
в разных частях этого изображения и лучший результат ~ 0.05
Я получил в этой части:
, что явно не похоже на исходную форму.
Код для скользящего окна:
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
Как выполнить правильное сопоставление формы и почему здесь наилучший результат?