假设有一个黑色背景和白线的二进制图像"绘制"在它上面,即它们没有被烧到图像上。例如:
我只需要保留与图片中至少其他一条线平行的线条。如果不完全平行,至少足够平行(可能是一个可以控制并行度的变量将有助于此)。换句话说,如果我选择一条特定的线并且它有一条或多条与它平行的线,我保留它,否则我丢弃它。我需要对图像中的所有行都这样做。
我遇到,但我无法理解如何使用这些垃圾箱来检查方向并确定平行线。或者有更好的方法来解决这个问题吗?
此外,由于线条不是图像的一部分而只是在其上绘制,因此我没有图像可以输入霍夫变换功能。我可以直接使用绘图功能的输出作为输入吗?这是我写的用于绘制白线的代码:
Location1
是一个m-by-2矩阵,包含绘制线条的坐标。
figure; imshow(blackImage);
hold on ;
for i=1:size(Location1,1)-1
h = plot([Location1(i,1) Location1(i+1,1)], [Location1(i,2) Location1(i+1,2)]) ;
set(h,'linewidth', .1, 'color', 'b') ;
end
任何帮助都将不胜感激。
答案 0 :(得分:2)
鉴于此
for i=1:size(Location1,1)-1
% one line = Location1(i,:) to Location1(i+1,:)
end
然后
theta = atan2(diff(Location1(:,2)),diff(Location1(:,1)));
但是由于线条是平行的,即使它们的theta
方向相反,你想要将所有角度映射到半个圆圈:
theta = mod(theta,pi/2);
现在theta
的范围是[-π/ 2,π/ 2]。
找到类似的角度:
[s,i] = sort(theta);
k = find(diff(s)<0.01); % diff(s) is always positive because s is sorted
i = i([k,k+1]);
theta(i) % <-- sets of similar angles
% Location1(i,:),Location1(i+1,:) <- corresponding lines