Houghlines 未到达图像边缘

Houghlines not reaching edge of image

我正在尝试检测下图中的所有线条:

使用下面的代码我可以检测到几乎所有的行:

%Find the line detected
I = imread('img3.png');
J = histeq(I);
BW = edge(J,'canny');
[H,T,R] = hough(BW);
P = houghpeaks(H,30,'Threshold',0.7*max(H(:)),'nhoodsize',[5 5]);
lines = houghlines(BW,T,R,P );
figure, imshow(I, []), hold on, max_len = 0;
for k = 1:length(lines)
 xy = [lines(k).point1; lines(k).point2];
 plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
 plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
 plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
 len = norm(lines(k).point1 - lines(k).point2);
 if ( len > max_len)
 max_len = len;
 xy_long = xy;
 end
end
% highlight the longest line segment
plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','red');

这给出了下图

然而,正如您所见,线条并没有一直延伸到图像的边缘。我试过缩小 nhood 的大小,但这意味着对某些线进行双重检测,并且线没有延伸到边缘。 也有可能检测到最顶线和最底线吗?我知道这些线不会有那么多选票,因为它们更短,我已经修改了阈值,但最终得到了虚假的对角线,仍然没有检测到顶线和底线。

还有我如何在未知图像上设置 Houghlines 参数。这很简单,能够(粗略地)估计我希望看到的行数,然后在该数字附近进行调整。

提前致谢

问题源于 houghpeaks 属性过于严格,无法找到较小的线段。我使用的方法是:

  1. 使用您当前的代码获取检测到的线所在的角度(我刚刚做了 [lines.theta],发现 theta 将等于 -84

  2. 再次使用您的代码,但仅包含该角度,同时放宽 houghpeaks 属性以允许检测更多行。

  3. 您会检测到更多重叠的线条,我们将通过根据它们的系数设置相似度阈值来丢弃这些线条。

这是实现

angleList = -84; 
[H,T,R] = hough(BW, 'Theta', angleList);
P = houghpeaks(H,80,'Threshold', 0.1*max(H(:)),'nhoodsize',[1 1]);
lines = houghlines(BW,T,R,P,'FillGap',500,'MinLength',5 );

% just get the eq of the line coef a,b using polyfit (y=a*x+b)
line_coef= @(x) polyfit([lines(x).point1(1) lines(x).point2(1)],...
                        [lines(x).point1(2) lines(x).point2(2)],1);

for n=1:numel(lines)
    p(:,n)=line_coef(n);
end

我们收集哪条线有相似的线,使得 coef 距离低于 thershold

for n=1:numel(lines)-1
     d(:,n) = sum(abs(p(:,n)-p)) <2 ;
end

d是一个对称的二元相关矩阵,我们找到对角线上方的上三角中的所有点,这是在同一行重复的行id#所以我们丢弃它们。

id=find(sum(triu(d,1)));
lines(id)=[];

%... plot the lines using your code