Преобразование Хафа в MATLAB без использования функции Хафа

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

Любая помощь в понимании этого и de-Houghing приветствуется. Спасибо

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

    theImage = flipud(theImage);

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

EDIT: норма — это просто синоним евклидова расстояния: sqrt(width^2 + height^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

person waspinator    schedule 28.03.2012    source источник
comment
Лучший вопрос для DSP.SE.   -  person Phonon    schedule 29.03.2012
comment
@Фонон Почему? Речь идет о деталях реализации конкретного алгоритма.   -  person reve_etrange    schedule 29.03.2012


Ответы (1)


Преобразование Хафа – это метод "голосования", при котором каждая точка изображения голосует за существование определенной линии (не линии сегмента) на изображении. Голосование осуществляется в пространстве параметров для линии: представление векторов нормалей в полярных координатах.

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

По вашим конкретным вопросам:

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

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

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

Примеры методов см. в коде и документации. houghpeaks MATLAB и houghlines.

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

person reve_etrange    schedule 28.03.2012
comment
Спасибо. Почему мы хотим, чтобы начало координат находилось в правом нижнем углу? Как мне прочитать этот вывод . Тета будет 1 или 1,5? будет ли Rho 6,858 или выше? или это среднее значение этих значений? Что было бы хорошим способом поиска всех «горячих точек» в преобразовании Хафа? Как лучше нарисовать найденные линии? Из википедии я вижу, что y = mx + b, где m = -(cos(theta)/sin(theta)) и b = r/sin(theta). Могу ли я просто нарисовать линию на основе этих параметров? Спасибо - person waspinator; 29.03.2012
comment
Похоже, что реализация Matlabs может определять начало и конец строк. Для моих целей не требуется, но интересно. Мне нужны только основы. Мне еще многое предстоит сделать, прежде чем я пойму это достаточно, но вы очень помогли. Спасибо. Прежде чем я оставлю этот вопрос, не могли бы вы просто пояснить, почему мы хотим, чтобы начало координат находилось в правом нижнем углу, а не в левом? - person waspinator; 29.03.2012
comment
Чтобы угадать конечные точки отрезков линии, вы должны использовать другую информацию с изображения. MATLAB, кажется, находит самую удаленную пару пикселей, которые вносят вклад в бин, и рассматривает их как конечные точки. - person reve_etrange; 30.03.2012