Надежный поиск локального максимума участка изображения с субпиксельной точностью

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

quad

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

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

z

z2

  б

X

bhat

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

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

Пример:
Выступ угла и контур подобранного квадратичного:

введите здесь описание изображения

Заметность (синий) и подгонка (красный) в виде 3D-сеток:

введите здесь описание изображения

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

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

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

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


person Bobisnotyouruncle    schedule 14.04.2020    source источник
comment
Дважды проверьте свои вычисления, совпадение сомнительно.   -  person Yves Daoust    schedule 15.04.2020
comment
Привет @YvesDaoust, спасибо за ответ. Я проверил соответствие синтетическим данным, и, похоже, оно работает так, как ожидалось. Может есть еще идеи?   -  person Bobisnotyouruncle    schedule 15.04.2020
comment
Можете ли вы предоставить девять значений?   -  person Yves Daoust    schedule 15.04.2020
comment
Является ли подгонка неправильной, потому что ваша обратная матрица нестабильна? Вы пытались решить уравнение, используя разложение по сингулярным числам?   -  person Cris Luengo    schedule 15.04.2020
comment
@YvesDaoust Значения [336, 522, 483, 423, 539, 153, 221, 412, 234] (основной ряд, но я думаю, это не имеет значения).   -  person Bobisnotyouruncle    schedule 15.04.2020
comment
@CrisLuengo Я не пробовал с SVD, потому что изначально был уверен в подгонке, но я пробовал с псевдоинверсией Мура-Пенроуза с теми же результатами. Я не уверен, что это подтверждает это, хотя   -  person Bobisnotyouruncle    schedule 15.04.2020


Ответы (2)


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

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

Есть много других способов найти субпиксельное положение максимума. Один, который мне нравится, потому что он более стабилен и требует меньше вычислений, — это подгонка «отделимой» квадратичной функции. Короче говоря, вы подгоняете квадратичную функцию к трем значениям вокруг локального максимума в одном измерении, а затем к другому в другом измерении. Вместо решения 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.

person Cris Luengo    schedule 15.04.2020
comment
Это, безусловно, хорошая идея. Тем не менее, таким образом отбрасывается информация, присутствующая в четырех неиспользуемых пикселях окна, и я не уверен, каковы будут последствия этого. По вашему мнению, будет ли лучше повторить этот процесс для диагоналей и получить центр как среднее значение двух точек? Спасибо - person Bobisnotyouruncle; 15.04.2020
comment
@Bobisnotyouruncle: Вы, безусловно, можете попробовать это. Помните, что для диагоналей расстояния между пикселями равны sqrt(2), а не 1. И поскольку эти расстояния больше, вы можете подумать о взвешенном среднем, где результат по диагоналям весит немного меньше, чем результат по главным осям. - person Cris Luengo; 15.04.2020
comment
@Bobisnotyouruncle: Хотя, если субпиксельная точность важна, вы можете рассмотреть угловой детектор, который дает плавный вывод. FAST использует все виды уродливых ядер фильтрации, которые вызывают негладкий вывод. Использование надлежащей фильтрации по Гауссу для производных приводит к плавному выводу, при котором интерполяция действительно имеет смысл, и где каждый фрагмент 3x3 может быть правильно смоделирован с помощью 2D-квадратичного уравнения. - person Cris Luengo; 15.04.2020
comment
Спасибо, попробую. Причиной использования FAST являются крайние ограничения вычислительной мощности, и я подумал, что метод подпикселя должен быть основан на показателе значимости FAST, поскольку это мера, которая будет выше для центрального пикселя окрестности. - person Bobisnotyouruncle; 15.04.2020

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

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

person Francesco Callari    schedule 15.04.2020
comment
Я понимаю вашу точку зрения, но я считаю, что мне следует разработать решение, которое обрабатывает такие случаи, поскольку локальные максимумы находятся в области 3x3. Например, решение, которое также имеет в качестве стоимости расстояние (x0,y0) от (1,1), пришло мне на ум, но, к сожалению, я не могу позволить себе (в вычислительном отношении) алгоритмы оптимизации. Должен быть трюк, который ускользает от меня .. Спасибо за ваш ответ - person Bobisnotyouruncle; 15.04.2020