2013-03-23 3 views
0

Я пытаюсь понять, как это работает. Я считаю, что я понимаю концепцию:Понимание преобразования Hough для строк

Для всех краевых пикселей найдите все строки, проходящие через него, и для каждой из этих строк значения массива аккумулятора (соответствующие наклону и y-перехвату) на 1. Линии которые пересекают многие граничные точки, будут иметь много голосов в массиве аккумуляторов.

То, что я не понимаю, находится в коде, который я нашел для его реализации. Во-первых, я полагаю, что мы можем предположить, что после применения краевого детектора краевые пиксели имеют ненулевое значение, а не ребра - 0. В коде из моего учебника программа ищет все точки с ZERO VALUE и, для всех проходящих линий увеличивает соответствующие значения аккумулятора на 1. Я думал, что он будет искать линии, проходящие через граничные точки (NON-ZERO), а не пустое пространство? Может ли кто-нибудь объяснить мне эту часть?

Ниже приведен код Matlab, который я нашел в учебнике по обработке изображений. Я не тестировал его, поскольку я работаю с C++. % Сообщений - это мое понимание того, что делает конкретная линия:

function HTline(inputimage) 

[rows,columns] = size(inputimage); 

acc1 = zeros(rows,91); 
acc2 = zeros(columns,91); 

for x = 1:columns 
    for y = 1:rows 
    if(inputimage(x,y)==0     %If pixel=0, i.e., non-edge 
     for m = -45:45      %For a certain range of slope values 
     b = round(y-tan((m*pi)/180)*x); %Calculate y-intercept for slope values 
     if (b<rows & b>0)     %If y-intercept is within the image height 
      acc1(b,m+45+1)=acc1(b,m+45+1)+1; %Increase accumulator values. What? 
     end 
     end 
     for m=45:135       %etc 
     b=round(x-y/tan((m*pi)/180)); 
     if(b<columns & b>0) 
      acc2(b,m-45+1)=acc2(b,m-45+1)+1; 
     end 
     end 
    end 
    end 
end 

ответ

0

Уильям, это зависит от того, как вы определяете, где лежит край. Обычно изображение преобразуется в некоторую двоичную маску, а значения границ хранятся в виде истинности (1 с), а значения без края сохраняются как ложные (0 с), поэтому ваши проблемы кажутся правильными. Возможно, если бы вы могли добавить какой-либо контекст или некоторые перефразировки из вашей книги, то, возможно, они могут дать обоснование, почему они используют false (0s) для значений границ, но любое представление не дает преимущества перед другим; это просто конвенция.

Обратите внимание, что способ преобразования hough - это более старая техника. Большинство современных методов используют «ногу нормальной» параметризации (rho/theta) для учета ситуаций, когда линия вертикальна. Кроме того, некоторые из них будут использовать фильтр sobel для прямого вычисления вектора градиента краевых точек, которые указывают в направлении, перпендикулярном линии. Это позволяет вам прямо вычислить одно значение rho/theta для краевых точек вместо вычисления всех возможностей линий, проходящих через эти точки (как это делается в вашем коде).

Но в любом случае для вашего случая наклон и перехват используются для параметризации линий. Эти значения закодированы, а затем помещаются в аккумулятор, как показано в вашем коде. Для одной граничной точки существует бесконечное количество линий, которые могли бы пройти через нее, но эти линии делаются конечными, используя только биннированные значения наклона и перехвата. В вашем случае вы используете 91 возможных значений для наклона. Точки, которые являются коллинеарными, приведут к тому, что определенные «бункеры» накапливают больше значений, чем другие. Эти локальные пики в аккумуляторе указывают, где линии (или, более конкретно, ребра, если используется краевой детектор) лежат внутри изображения. Хороший пример этого приведен в статье wikipedia для hough transform. Надеюсь, это поможет с вашим вопросом.

+0

К сожалению, хотя книга объясняет концепцию понятным образом, она затем помещает код в фигуру без непосредственной ссылки, за исключением того, что строки обнаруживаются путем принятия максимумов аккумулятора, поэтому это не инверсия черных и белый. Поскольку я студент, я склонен полагать, что я ошибаюсь, но я думаю, что пришло время сделать что-то на C и посмотреть, что произойдет. Спасибо за ваш подробный ответ, я сохраню то, что вы сказали в уме. – William

+0

@William Если вы не уверены, что вам следует попробовать это в Matlab, так как это будет легче протестировать и пробовать. Но если C - ваша вещь, тогда идите вперед. Кроме того, как я уже сказал, помните, что код, который у вас есть, несколько устарел. На самом деле у меня есть код из класса машинного зрения, где я реализовал преобразование hough, основанное на параметризации rho/theta и методе gradient/sobel. Я могу добавить его к моему ответу, если вы заинтересованы. Наконец, если мой ответ ответил на ваш вопрос, это хорошая практика, чтобы принять его. – Justin

+0

Я, вероятно, буду придерживаться C и учиться понемногу в своем собственном темпе, но в любом случае спасибо.Кстати, я понимаю ошибку в моем комментарии выше, может быть, она была фактически инвертирована черно-белой. Извините, забыл принять! – William

Смежные вопросы