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 属性过于严格,无法找到较小的线段。我使用的方法是:
使用您当前的代码获取检测到的线所在的角度(我刚刚做了 [lines.theta]
,发现 theta 将等于 -84
)
再次使用您的代码,但仅包含该角度,同时放宽 houghpeaks
属性以允许检测更多行。
您会检测到更多重叠的线条,我们将通过根据它们的系数设置相似度阈值来丢弃这些线条。
这是实现
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
我正在尝试检测下图中的所有线条:
使用下面的代码我可以检测到几乎所有的行:
%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 属性过于严格,无法找到较小的线段。我使用的方法是:
使用您当前的代码获取检测到的线所在的角度(我刚刚做了
[lines.theta]
,发现 theta 将等于-84
)再次使用您的代码,但仅包含该角度,同时放宽
houghpeaks
属性以允许检测更多行。您会检测到更多重叠的线条,我们将通过根据它们的系数设置相似度阈值来丢弃这些线条。
这是实现
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