2012-03-28 3 views
5

Я нашел реализацию преобразования Hough в MATLAB по адресу Rosetta Code, но у меня возникли проблемы с пониманием этого. Также я хотел бы изменить его, чтобы показать исходное изображение и восстановленные строки (de-Houghing).Преобразование hough в MATLAB без использования функции hough

Любая помощь в понимании этого и де-Хэнга оценивается. Thanks

  1. Почему изображение перевернуто?

    theImage = flipud(theImage);

  2. Я не могу обернуть мою голову вокруг функции нормы. Какова его цель, и ее можно избежать?

EDIT: норма просто синоним евклидова расстояния: SQRT (ширина^2 + высота^2)

rhoLimit = norm([width height]);

  1. Может кто-то дать объяснение того, как/почему вычисляются rho, theta и houghSpace?

    rho = (-rhoLimit:1:rhoLimit);   
    theta = (0:thetaSampleFrequency:pi); 
    
    numThetas = numel(theta); 
    houghSpace = zeros(numel(rho),numThetas); 
    
  2. Как бы де-Хау Хаф пространство для воссоздания линий?

Вызов функции с использованием 10x10 образ диагональной линии, созданные с помощью функции идентичности (глаз)

theImage = eye(10) 
thetaSampleFrequency = 0.1 
[rho,theta,houghSpace] = houghTransform(theImage,thetaSampleFrequency) 

фактической функции

function [rho,theta,houghSpace] = houghTransform(theImage,thetaSampleFrequency) 

    %Define the hough space 
    theImage = flipud(theImage); 
    [width,height] = size(theImage); 

    rhoLimit = norm([width height]); 
    rho = (-rhoLimit:1:rhoLimit);   
    theta = (0:thetaSampleFrequency:pi); 

    numThetas = numel(theta); 
    houghSpace = zeros(numel(rho),numThetas); 

    %Find the "edge" pixels 
    [xIndicies,yIndicies] = find(theImage); 

    %Preallocate space for the accumulator array 
    numEdgePixels = numel(xIndicies); 
    accumulator = zeros(numEdgePixels,numThetas); 

    %Preallocate cosine and sine calculations to increase speed. In 
    %addition to precallculating sine and cosine we are also multiplying 
    %them by the proper pixel weights such that the rows will be indexed by 
    %the pixel number and the columns will be indexed by the thetas. 
    %Example: cosine(3,:) is 2*cosine(0 to pi) 
    %   cosine(:,1) is (0 to width of image)*cosine(0) 
    cosine = (0:width-1)'*cos(theta); %Matrix Outerproduct 
    sine = (0:height-1)'*sin(theta); %Matrix Outerproduct 

    accumulator((1:numEdgePixels),:) = cosine(xIndicies,:) + sine(yIndicies,:); 

    %Scan over the thetas and bin the rhos 
    for i = (1:numThetas) 
     houghSpace(:,i) = hist(accumulator(:,i),rho); 
    end 

    pcolor(theta,rho,houghSpace); 
    shading flat; 
    title('Hough Transform'); 
    xlabel('Theta (radians)'); 
    ylabel('Rho (pixels)'); 
    colormap('gray'); 

end 
+0

Лучше вопрос [DSP.SE] (http://dsp.stackexchange.com/). – Phonon

+1

@Phonon Почему? Речь идет о деталях реализации конкретного алгоритма. –

ответ

5

Хока Transform является «голосование «подход, при котором каждая точка изображения избирает голосование по существованию определенной линии (не a строка сегмент). Голосование проводится в пространстве параметров для строки: полярное координатное представление нормальных векторов.

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

Для ваших конкретных вопросов:

  1. изображение переворачивается так начало в нижнем правом углу. Насколько я могу судить, этот шаг не является технически необходимым. Это немного меняет результат из-за проблем с дискретизацией. Другие реализации на Rosetta Code не переворачивают изображение.
  2. rhoLimit содержит максимальный радиус точки изображения в полярных координатах (назовем норму вектора величиной).
  3. rho и theta являются дискретизациями полярной координатной плоскости в соответствии с частотой дискретизации.houghSpace создает матрицу с элементом для каждой возможной комбинации дискретных значений rho/theta.
  4. Преобразование Hough не определяет длины предполагаемых линий; пики в пространстве для голосования просто указывают полярные координаты нормального вектора линии. Вы можете «де-Хью», выбирая пики и рисуя соответствующие линии, или, возможно, рисуя каждую возможную линию и используя количество голосов в качестве веса в оттенках серого. Невозможно воссоздать исходное изображение из преобразования Hough Transform, только строки, идентифицированные трансформацией (и ваша схема определения порога для голосов).

Следуя примеру из вопроса, вы получите следующий график. Размещение линий сетки и курсора данных может быть немного ошибочным (хотя значения переменных в подсказке верны). Так как это изображение области параметров , а не пространство изображения, которое мы выбрали, это определение количества ячеек в каждой переменной. При этой частоте выборки точки изображения совместимы с несколькими возможными линиями; другими словами, наши линии имеют субпиксельное разрешение в том смысле, что они не могут быть нарисованы без перекрытия в изображении 10x10.

Как только мы выбрали пик, соответствующий линии с нормальным (rho,theta) = (6.858,0.9), мы можем нарисовать эту линию на изображении, однако мы выбираем. Автоматическая выбор пика, то есть пороговое значение для поиска высокопрофессиональных линий, - это его собственная проблема - вы можете задать другой вопрос о теме в DSP или об определенном алгоритме здесь.

Например, методы см. Код и documentation функций MATLAB houghpeaks и houghlines.

enter image description here

+0

Спасибо. Почему мы хотим, чтобы происхождение было в нижнем правом углу? Как бы я прочитал этот [вывод] (http://i.imgur.com/LuVLI.png). Будет ли Тета 1 или 1,5? будет ли Rho 6,885 или выше? или это среднее значение этих значений? Что было бы хорошим способом поиска всех «горячих точек» в преобразовании Хафа? Каким будет лучший способ нарисовать линии? Из wikipeida видно, что y = mx + b, где m = - (cos (theta)/sin (theta)) и b = r/sin (theta). Я бы просто нарисовал линию на основе этих параметров? Спасибо – waspinator

+0

Похоже, что реализация matlabs может обнаружить начало и конец строк. Не требуется для моих целей, но интересно. Мне просто нужны основы. Мне до сих пор остается много, прежде чем я пойму это достаточно, но вы очень помогли. Спасибо. Прежде чем оставить этот вопрос, вы могли бы просто уточнить, почему мы хотим, чтобы происхождение было в нижнем правом углу вместо левого? – waspinator

+0

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

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