1

Я изучаю влияние различных параметров на частоту ошибок углового детектора Harris с использованием openCV. Входными параметрами являются размер окна, размер ядра оператора sobel и значение параметра k. Я обнаружил, что когда я увеличиваю размер окна, похоже, увеличивается количество ответов на угол. Например, если каждое окно, содержащее угол, помечено точкой, появляется, как представляется, более высокая плотность точек вокруг определенных углов, когда я использую окно 7x7, а не окно 2x2. Изменение размера окна также увеличивает число углов, которые были правильно идентифицированы.Что влияет размер окна на результаты детектора угла harris в openCV

Мой кодирования заключается в следующем, что я получил от this примера

import cv2 
 
import numpy as np 
 

 
filename = 'resized_image.jpg' 
 
img = cv2.imread(filename) 
 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
 

 
gray = np.float32(gray) 
 
dst = cv2.cornerHarris(gray,7,3,0.015) 
 

 
#result is dilated for marking the corners, not important 
 
dst = cv2.dilate(dst,None) 
 

 
# Threshold for an optimal value, it may vary depending on the image. 
 
img[dst>0.05*dst.max()]=[0,0,255] 
 
cv2.imwrite('corners3.jpg', img) 
 
cv2.imshow('dst',img) 
 
if cv2.waitKey(0) & 0xff == 27: 
 
    cv2.destroyAllWindows()

Может кто-то пожалуйста, объясните, аффект увеличения размера окна по результатам углового детектора Харриса. В частности, почему количество ответов на угол увеличивается с увеличением размера окна. Я понимаю, что эта функция вычисляет градиенты окна и выполняет сглаживание с использованием оператора sobel, если это вообще влияет на результаты. Извините, если это очевидный вопрос, но я новичок в компьютерном видении.

+0

Это странно ... Можете ли вы показать соответствующие части кода ? – sansuiso

ответ

2

Что вы подразумеваете под «ответами за угол»? Нормально видеть множественные кластеры пиков в отклике детектора в общей близости от местоположения «истинного» угла. Это происходит потому, что функция ответа является чем-то гладким для естественных изображений - ведь она вычисляет произведения производных, что увеличивает любые «случайные» колебания в исходных изображениях. Все фильтры Харриса - это найти места, где эта негладкая функция сильно пиковая, но пики могут быть близки друг к другу, даже если ваша интуиция об изображении говорит вам, что они не должны.

Одним из очевидных способов противодействия этой проблеме является вычисление «сглаженных производных» (т. Е. Gx * I, а не Ix, где G - небольшое гауссовское ядро ​​и т. Д.), Но это имеет побочный эффект, что некоторые «слабые «углы могут быть сглажены.

Независимо от того, используют ли сглаженные производные или нет, простой алгоритм, используемый для противодействия этой проблеме и получения ожидаемого числа N «чистых» углов, состоит в том, чтобы выбрать из ответа самые сильные пики k * N, отсортированные путем уменьшения чувствительности детектора (с k, скажем, в диапазоне от 5 до 10), а затем:

  1. Выберите следующий пик вниз по списку.
  2. Посмотрите на значение отклика датчика Харриса H (x, y) в его местоположении (x, y).
  3. Если H (x, y)> 0, добавьте его в выходной чистый список углов, а затем установите 0 всех значений H (u, v) в малой окрестности m x m (x, y).
  4. Else skip this peak.
  5. Перейти 1, если размер выходного списка меньше N, и есть какие-либо пики слева.

Ширина m района подавления «кластера» должна выражать ваши предыдущие сведения о том, как далеко друг от друга «настоящие» углы должны быть друг от друга. Этот метод, очевидно, предполагает, что «лучшим» углом кластера является тот, у которого самый сильный ответ фильтра Харриса.

Кстати, если вы находитесь в именах (или отправляете их в Google), это обычно называется «подавлением нелокальных максимумов».

BTW-2: См this answer подробную информацию о нахождении всех локальных максимумов реакции H, которые затем будут отсортированы по значению отклика и т.д.