如何找到图像中线的累加器矩阵?
How to find accumulator matrix for line in an image?
我是CV和IP领域的新手。我正在编写用于查找 line.I 的 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
我正在将其应用于简单图像
我得到这个结果
但这是意料之中的事
我无法提前找到 mistake.Please 帮助 me.Thanks。
您的代码存在几个问题。主要问题在这里:
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)。也许你已经这样做了?
我是CV和IP领域的新手。我正在编写用于查找 line.I 的 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
我正在将其应用于简单图像
但这是意料之中的事
我无法提前找到 mistake.Please 帮助 me.Thanks。
您的代码存在几个问题。主要问题在这里:
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)。也许你已经这样做了?