Как бы вы преобразовали точки X, Y в Rho, Theta для преобразования hough в C?

Итак, я пытаюсь закодировать преобразование Хафа на C. У меня есть двоичное изображение, и я извлек двоичные значения из изображения. Теперь, чтобы выполнить преобразование, мне нужно преобразовать значения [X, Y] из изображения в [rho, theta], чтобы выполнить параметрическое преобразование формы

rho=xcos(theta)+ysin(theta)

Я не совсем понимаю, как он на самом деле трансформируется, глядя на другие онлайн-коды. Будем признательны за любую помощь, объясняющую алгоритм и то, как должен выполняться накопитель для значений [rho, theta] на основе [X, Y]. Заранее спасибо. :)


person user2045143    schedule 07.06.2013    source источник


Ответы (1)


Ваш вопрос намекает на тот факт, что вы считаете, что вам нужно сопоставить каждую (X, Y) точку интереса на изображении с ОДНИМ вектором (ро, тета) в пространстве Хафа.

Дело в том, что каждой точке изображения соответствует кривая, т.е. НЕСКОЛЬКО векторов в пространстве Хафа. Количество векторов для каждой входной точки зависит от некоторого «произвольного» разрешения, которое вы выбираете. Например, для разрешения в 1 градус вы получите 360 векторов в пространстве Хафа.

Есть два возможных соглашения для векторов (ро, тета): либо вы используете диапазон [0, 359] градусов для тета, и в этом случае ро всегда положительное, либо вы используете [0,179] градусов для тета и позволяете ро быть либо положительным, либо отрицательным. Последний обычно используется во многих реализациях.

Как только вы это поймете, аккумулятор — это не более чем двухмерный массив, который охватывает диапазон пространства (ро, тета) и где каждая ячейка инициализируется 0. Это используется для подсчета количества векторов, общих для различных кривых для разных точек во входных данных.

Таким образом, алгоритм вычисляет все 360 векторов (при условии разрешения тета в 1 градус) для каждой точки интереса на входном изображении. Для каждого из этих векторов после округления ро до ближайшего целого значения (зависит от точности измерения ро, например, 0,5, если у нас есть 2 точки на единицу) он находит соответствующую ячейку в аккумуляторе и увеличивает значение в этой ячейке. .
когда это было сделано для всех точек интереса, алгоритм ищет все ячейки в накопителе, которые имеют значение выше выбранного порога. «Адрес» (ро, тета) этих ячеек представляет собой значения полярных координат для линий (во входном изображении), которые идентифицировал алгоритм Хафа.

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

Очень грубая псевдокодовая "реализация" вышеизложенного

Accumulator_rho_size = Sqrt(2) * max(width_of_image, height_of_image)
                          * precision_factor  // e.g. 2 if we want 0.5 precision
Accumulator_theta_size = 180  // going with rho positive or negative convention
Accumulator = newly allocated array of integers
    with dimension  [Accumulator_rho_size, Accumulator_theta_size]
Fill all cells of Accumulator with 0 value.

For each (x,y) point of interest in the input image
   For theta = 0 to 179
       rho = round(x * cos(theta) + y * sin(theta),
                   value_based_on_precision_factor)
       Accumulator[rho, theta]++

Search in Accumulator the cells with the biggest counter value
(or with a value above a given threshold) // picking threshold can be tricky

The corresponding (rho, theta) "address" of these cells with a high values are
the polar coordinates of the lines discovered in the the original image, defined
by their angle relative to the x axis, and their distance to the origin.

Simple math can be used to compute various points on this line, in particular
the axis intercepts to produce a  y = ax + b equation if so desired.

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

person mjv    schedule 07.06.2013
comment
Спасибо. Лучшего и простого объяснения нельзя было и пожелать. - person user2045143; 10.06.2013