Надежное нахождение локального максимума участка изображения с точностью до субпикселя - PullRequest
1 голос
/ 14 апреля 2020

Я разрабатываю алгоритм SLAM в C, и я реализовал метод поиска углов FAST, который дает мне несколько сильных ключевых точек на изображении. Следующий шаг - получить центр ключевых точек с точностью до субпикселя, поэтому я извлекаю патч 3х3 вокруг каждого из них и подгоняю наименьшие квадраты к двумерному квадратику c:

quad

Где f (x, y) - это угловая мера значимости каждого пикселя, аналогичная оценке FAST, предложенной на оригинальной бумаге , но измененной, чтобы также обеспечить меру значимости в не угловых пикселях.

И наименьших квадратов:

z

z2

b

X

bhat

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

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

Пример:
Угловой выступ и контур подогнанного квадрата c:

enter image description here

Значимость ( синего цвета) и поместите (красный цвет) в качестве трехмерных сеток:

enter image description here

Numeri c значения этого примера (упорядочение по основным строкам):

[336, 522, 483, 423, 539, 153, 221, 412, 234]

И полученный подпиксельный центр (2.6, -17.1) неверен.

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

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Очевидный ответ - отклонить блоки 3х3 (или 5х5, что бы вы ни использовали), чей дискретный максимум находится не в центре. Другими словами, использовать квадратичное c приближение только для уточнения местоположения максимума, который должен находиться внутри прямоугольника.

В более общем случае в таких случаях первый вопрос, который следует задать, это не «Как сделать Я ограничиваю свою процедуру подгонки модели, чтобы найти решение для этого краевого случая? », А скорее« Применяется ли моя модель к этому краевому случаю? » и «Стоит ли вообще заниматься этим крайним случаем, или я могу просто проигнорировать его?»

1 голос
/ 15 апреля 2020

Я попробовал свой собственный код, чтобы подогнать двумерную квадратичную функцию c к значениям 3x3, используя устойчивый алгоритм решения наименьших квадратов, а также нашел максимум за пределами области. Патч данных 3x3 не соответствует квадратичной функции c, и поэтому подгонка бесполезна.

Подгонка двумерного квадратичного c к окрестности 3x3 требует некоторой степени плавности в данных, которые вы Похоже, в вашем выводе FAST нет.

Есть много других способов найти субпиксельное положение максимума. Один из тех, что мне нравятся, потому что он более стабилен и менее требователен к вычислениям, это подгонка «отделимой» квадратичной c функции. Короче говоря, вы подгоняете квадратичную функцию c к трем значениям вокруг локального максимума в одном измерении, а затем - в другом измерении. Вместо того, чтобы решать 6 параметров с 9 значениями, это решает 3 параметра с 3 значениями, дважды. Решение гарантированно стабильно до тех пор, пока центральный пиксель больше или равен всем пикселям в окрестности с 4 подключениями.

z1 = [f(-1,0), f(0,0), f(1,0)]^T

    [1,-1,0]
X = [0,0,0]
    [1,1,0]

solve: X b1 = z1

и

z2 = [f(0,-1), f(0,0), f(0,1)]^T

    [1,-1,0]
X = [0,0,0]
    [1,1,0]

solve: X b2 = z2

Теперь вы получите x координата центроида от b1 и координата y от b2.

...