В задачах компьютерного зрения при анализе изображений зачастую бывает необходимо выделять в изображении различные кривые (прямые, окружности и т.д.)[1]. Для решения данной задачи существует целое семейство методов, основанных на преобразовании Хафа. Теоретические возможности этого преобразования позволяют не ограничиваться плоскостью и дискретными кривыми, его можно применять для поиска кривых в облаке точек на плоскости или в многомерном пространстве. Однако практическое применение преобразования Хафа затрудняется высокой сложностью алгоритма как по времени так и по памяти, поэтому большинство модификаций метода направлено на его ускорение.
Пусть дано облако точек в пространстве Rm:
X = {x1, : , xn}
и семейство параметрически заданных кривых:
F(φ, x) = 0
где F - некоторая функция, φ - вектор параметров семейства кривых, x - координаты точек из Rm. Каждое значение φ определяет одну кривую, а все множество значений φ образует фазовое пространство Φ кривых данного семейства.
В силу конечного объема памяти и дискретного машинного представления мы не можем рассматривать каждое значение φ в отдельности, поэтому фазовое пространство Φ разбивается на ячейки, для чего вводится регулярная сетка с заданным шагом дискретизации. Каждой ячейке ставится в соответствие счетчик. Набор всех счетчиков называется аккумулятором. Любая ячейка задаёт множество кривых, а значение счетчика ячейки определяется количеством точек из облака X, лежащих хотя бы на одной из этих кривых. Тогда если все точки из X лежали на одной кривой с параметром φ0, то в соответствующей ячейке значение счетчика будет максимально.[1]
Базовый алгоритм выделения кривых состоит из следующих шагов:
На этом этапе предстоит выбрать шаг дискретизации для каждого параметра кривой. От этого выбора будет зависеть сложность (~ скорость) и эффективность алгоритма.
Зачастую это самый долгий шаг алгоритма, поскольку заполнение производится путем полного перебора. Сложность алгоритма напрямую зависит от первого шага и составляет O(N*M), где N - кол-во точек, M - кол-во ячеек аккумулятора.
В матрице аккумулятора ищется счетчик с максимальным значением.
Каждая ячейка аккумулятора есть значение фазового пространства, а значит, она задает некоторую (искомую) кривую. Но поскольку значение на шаге 1 стало дискретным, может потребоваться уточнение кривой каким-либо иным методом по уже найденным точкам кривой.
Для точек выделенной кривой считается временный аккумулятор и поточечно вычитается из основного.
На шаге 1 мы выбираем сетку дискретизации. В связи с этим выбором возможны следующие проблемы:
- Сетка выбрана слишком мелкой. Тогда, если в исходном облаке точек присутствовал шум, то даже точки одной кривой будут попадать в разные ячейки сетки, а значит, потенциальный максимум аккумулятора (соответствующий этой кривой) будет <размыт> и его будет сложнее или вообще невозможно найти.
- Сетка выбрана слишком крупной. Тогда существует вероятность того, что в одну ячейку попадут точки, лежащие на разных кривых.
- При любой сетке дискретизации, если точки облака X образуют кривую с параметром φ0, лежащим на границе ячейки, то из-за шума точки этой кривой будут попадать в соседние ячейки и будет наблюдаться размытие пика в аккумуляторе. Это вообще фундаментальная проблема дискретизации.
Заполнение аккумулятора на шаге 2 является самой трудоёмкой частью алгоритма, сложность которой зависит от: размерности фазового пространства и сетки дискретизации. Чем больше размерность Φ и меньше сетка, тем больше ячеек в аккумуляторе. Значит, тем больше требуется памяти и времени для его хранения и заполнения. Именно поэтому на практике чаще всего фазовое пространство представляет собой плоскость, а преобразование Хафа применяется в основном для поиска прямых на плоскости (изображениях).
В связи с вышеперечисленными проблемами были разработаны некоторые модификации стандартного алгоритма (Standard Hough Transform, SHT).
Эта модификация разрабатывалась для быстрого поиска прямых линий на изображении [4]. В таком случае у нас имеется плоское бинарное изображение (на нём точки интереса одного цвета, а точки фона другого). Поскольку производится поиск прямых линий, то размерность фазового пространства равна 2.
Идея метода состоит в изменении шага 2(заполнение аккумулятора):
Первый шаг модификации необходим для сокращения числа переборов.
Если точек в участке мало и сетка дискретизации фазового пространства тоже мала, количество записей в аккумуляторе получается меньше.
Это еще одна модификации для поиска линий на бинарном изображении [1, 4, 7].
Идея метода:
На каждом уровне рассматриваются 4 соседних фрагмента. Линии, выделенные на каждом из фрагментов, объединяются на основании преобразования Хафа для объединения фрагментов. Если линии не удалось слиться ни с одной линией из соседних фрагментов, она удаляется из рассмотрения.
В результате сложность алгоритма снижается за счет подразбиения изображения (можно использовать более грубую сетку в фазовом пространстве и количество точек существенно меньше).
Недостаток в том, что одна длинная линия может быть в результате представлена несколькими близкими линиями, поскольку разные концы отрезка могут быть неколлинеарными при близком рассмотрении, т.е. на низких уровнях иерархического слияния.
Эта модификация позволяет использовать меньше места для хранения аккумулятора и быстрее выделять кривые. На протяжении всего процесса поиска используется аккумулятор заранее выбранного маленького размера (например, 9х9 или 3х3х3х3 в многомерном случае) [2, 3, 4, 7].
Алгоритм выглядит следующим образом:
На каждой итерации размер ячейки уменьшается. Цикл идет до достижения заранее заданного размера ячейки.
Как и в стандартном варианте, но значительно меньше сложность за счет маленького размера аккумулятора.
Таким образом, мы уменьшаем шаг дискретизации, но только в области интереса (ячейке с максимальным счетчиком).
Главными достоинствами являются:
- меньшая сложность по времени и по памяти
- практическое решение проблемы дискретизации, поскольку сетка дискретизации не регулярная и на каждой итерации уточняется.
Главный недостаток:
Если исходное облако точек X образует несколько кривых из заданного семейства, то для выделения каждой необходимо повторить весь алгоритм сначала (предварительно выкинув из рассмотрения точки уже выделенных кривых)
В этой [1, 4, 5, 6, 7] модификации алгоритма рассматривается только доля α точек из X, при этом результат с некоторой вероятностью получается такой же, как и у стандартного алгоритма. Доля точек выбирается случайно с равномерной вероятностью.
Показано, что существует αthreshold такое, что при α > αthreshold ошибок (относительно стандартного алгоритма) происходит очень мало, а при α < αthreshold их количество резко возрастает. По этому рекомендуется выбирать α примерно равное αthreshold, которое находится в диапазоне 5% - 15% от всего количества точек.
Очевидное достоинство модификации заключается в сокращении перебора на шаге 2.
И так же очевиден недостаток - недетерменированность результата относительно входных данных.
Пусть имеется облако точек X и большое количество точек образуют искомую кривую. Тогда в соответствующей ячейке фазового пространства значение счетчика будет иметь большое значение. Идея этой модификации заключается в том, что бы выделять кривые (шаг 4) при достижении счетчиком порогового значения, не заполняя аккумулятор полностью (шаг 2) [5]. Для вышеописанной кривой значение соответствующего счетчика довольно быстро наберет пороговое значение.
Алгоритм формулируется следующим образом:
Внутри некоторого коридора (определяемого ячейкой с максимальным значением счетчика) производится поиск кривой с максимальной длинной.
Достоинством этого метода так же является то, что он постоянно пополняет результат, т.е. его выполнение можно оборвать при достижении остаточного количества результатов или по истечении некоторого времени.
Эта модификация своей идеей схожа с идеей Комбинаторного преобразования Хафа [1, 4, 6, 7]. Если параметры φ кривой F(φ, x) = 0 можно однозначно восстановить по К точкам, то алгоритм заполнения аккумулятора формулируется следующим образом (шаг 2):
Перед поиском следующей кривой, необходимо удалить из рассмотрения все точки предыдущих кривых, поскольку алгоритм носит случайный характер.
Анализ аккумулятора бывает часто затруднен следующими проблемами:
- размытие пиков
- 3-х мерная поверхность значений аккумулятора очень редко бывает гладкой
Причинами являются дискретизация и шум.
Для их решения можно применяются следующие методы
Это очень простое и элегантное решение призвано бороться с проблемами дискретизации, а именно граничной проблемой (когда точки одно кривой могут попасть в разные ячейки аккумулятора). Для этого при заполнении аккумулятора (шаг 2), увеличивают счетчик не только той ячейки, в которую попала точка, но так же увеличивают счетчики соседних ячеек [1].
Это тоже довольно простой метод поиска максимумов, но при этом он более устойчивый, нежели простой анализ локальных максимумов или градиентный подъем (спуск) [8].
Суть алгоритма в том, что он оперирует не понятием значения в точке, а понятием плотности региона. Здесь плотность региона - это среднее арифметическое точек региона, т.е. отношение суммы значений в каждой точке региона к количеству точек.
Поскольку сравниваемые матрицы одного размера, плотность считать не обязательно - суммы значений будет вполне достаточно. К тому же матрицы пересекаются (большей своей частью), это позволяет сильно оптимизировать алгоритм.
Здесь будет рассмотрен частный случай применения этого метода - наиболее простой (более общая формулировка метода описана в [9, 10]).
Пусть нам дана матрица значений (например, аккумулятор). Для применения алгоритма нам необходимо так же задать радиус окна (оно представляет собой окружность) и начальную точку - центр окна.
,
, ![]()
Существует дополнение к алгоритму, для проверки найденного максимума. После окончания основного алгоритма, окно сдвигается во всевозможных направлениях, на небольшое расстояние. Если из каждого такого положения алгоритм, опять сойдется к уже найденному максимуму, значит это стабильный максимум.
Комментарии
К сожалению,
К сожалению, работающие с преобразованием Хафа не понимают следующего: во всех вышеуказанных методах постановка задачи несовместима с компьютерным (растровым) представлением данных и дает огромную вычислительную сложность (как минимум o(n^3)), причем на изображениях сомнительного качества (принудительно бинаризованных). Не знаю, я один такой умный или все остальные глупые, но в обзоре это не нашло отражения: если на преобразование Хафа для прямых линий ввести некоторые ограничения, его вычислительная сложность совпадает со сложностью быстрого преобразования Фурье (O(n^2*log(n))), даже быстрее, ибо не надо вычислять никаких синусов, все операции элементарные арифметические. Данные прекрасно ложатся в растровое представление, позволяют легко делать поиск, никаких размытий... Можно адаптировать для поиска кривых. Я реализовал этот алгоритм, все работает на ура
Отправить комментарий