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


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

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

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

    theImage = flipud(theImage);

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

EDIT: norm - это просто синоним евклидова расстояния: 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, созданного с помощью функции identity (eye)

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
1 5

1 ответ:

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

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

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

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

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

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

Например методы смотрите код и документацию MATLAB houghpeaks и еще houghlines функции.

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