Как найти аккумуляторную матрицу для линии в изображении? - PullRequest
0 голосов
/ 29 июня 2018

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

numRowsInBW = size(BW,1);
numColsInBW = size(BW,2);

%length of the diagonal of image
D = sqrt((numRowsInBW - 1)^2 + (numColsInBW - 1)^2);
%number of rows in the accumulator array
nrho = 2*(ceil(D/rhoStep)) + 1;
%number of cols in the accumulator array
ntheta = length(theta);

H = zeros(nrho,ntheta);

%this means the particular pixle is white 
%i.e the edge pixle
[allrows allcols] = find(BW == 1);

for i = (1 : size(allrows))
    y = allrows(i);
    x = allcols(i);
    for th = (1 : 180)
        d = floor(x*cos(th) - y*sin(th));
        H(d+floor(nrho/2),th) += 1;
    end
end

Я применяю это для простого изображения enter image description here Я получаю этот результат enter image description here

Но это ожидается enter image description here

Я не могу найти ошибку. Пожалуйста, помогите мне. Спасибо заранее.

1 Ответ

0 голосов
/ 29 июня 2018

Есть несколько проблем с вашим кодом. Основная проблема здесь:

ntheta = length(theta);
% ...
for i = (1 : size(allrows))
    % ...
    for th = (1 : 180)
        d = floor(x*cos(th) - y*sin(th));
        % ...

th кажется углом в градусах. cos(th) бессмысленно. Вместо этого используйте cosd и sind.

Другая проблема заключается в том, что th выполняет итерации от 1 до 180, но нет гарантии, что ntheta равно 180. Поэтому вместо этого выполните цикл следующим образом:

for i = 1 : size(allrows)
    % ...
    for j = 1 : numel(theta)
        th = theta(j);
        % ...

и используйте th в качестве угла и j в качестве индекса в H.

Наконец, учитывая ваше изображение и ожидаемый результат, вы должны сначала применить некоторые функции обнаружения краев (например, Canny). Может быть, вы уже сделали это?

...