如何找到图像中线条的累加矩阵?

时间:2018-06-29 18:57:58

标签: image-processing computer-vision octave hough-transform

我是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 :(得分:2)

您的代码有几个问题。主要问题在这里:

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

th似乎是以度为单位的角度。 cos(th)是没有意义的。而是使用cosdsind

另一个问题是th从1迭代到180,但是不能保证ntheta是180。因此,请如下循环:

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

并使用th作为角度,并使用j作为H的索引。

最后,在给定图像和预期输出的情况下,您应该首先应用一些边缘检测(例如,Canny)。也许您已经这样做了?