在matlab中用houghlines检测线

信息处理 图像处理 matlab 霍夫变换
2022-02-13 07:03:35

我有这张基本上由斜线组成的图像(几乎水平和平行)

图片

我完全尝试了matlab 文档中的代码来检测这些线(旋转部分除外),但我得到了一个非常奇怪的结果(检测到垂直线,没有一条水平线!): houghlines 的输出

我真的找不到这个输出的解释。我在不同的图像上尝试了相同的代码,没关系。我试图更改所有可能的参数houghlineshoughpeaks但我总是得到垂直线,即使我的图像没有垂直线或任何类似垂直的东西!

我需要检测图像中的平行线或以某种方式获得它们的斜率。如果您认为我的图像有问题或我应该对示例代码进行其他修改。或者,如果您有更好的想法,那就太好了!

3个回答

最大的问题是每条线的像素太少(我将在下面详细解释)。我会考虑拉伸,然后稍微扩大你的原始图像:

file='http://i.stack.imgur.com/LmIJJ.png';
I=imread(file);
I=imcrop(I,[1 206 size(I,2) size(I,1)]);
I=imresize(I,[size(I,1) 256]);
I=imdilate(I,strel('line',1,0));

我假设您在 、 和 上使用 Mathworks 中的hough示例houghlines代码houghpeaks问题是图像中的一个斜率上没有很多像素。你觉得它是一条线,但它实际上是一条由许多不同方向的短线组成的曲线。我认为您需要调整的一个参数是'FillGap'将非常短的段连接起来。我试过:

lines = houghlines(BW,T,R,P,'FillGap',30,'MinLength',15);

我得到的图像:

霍夫峰

霍夫线

仍有很大的改进空间,但至少检测到了大多数行。

请注意,霍夫峰中的 theta 轴表示线的斜率,您也可以从linesT和中检查它们R但是由于图像已经沿着原始数据的第二维拉伸,如果您打算获得那些检测到的线的斜率,您可能需要将它们缩小(通过一些切线变换)。

希望对你有帮助,谢谢。

我的评论中的另一个答案(我宁愿重新回答而不是编辑解决方案 1):

imrotate(I, theta,'loose');  % theta ranges from 0 to 180

然后使用imfilter(I,f);where 您可能有 4 种选择f

f=[-1 -1 -1; 2 2 2;-1 -1 -1]; % horizontal line
f=[-1 2 -1;-1 2 -1;-1 2 -1]; % vertical
f=[-1 -1 2;-1 2 -1;2 -1 -1]; % 45 degree
f=[2 -1 -1;-1 2 -1;-1 -1 2]; % 135 degree

我有类似的问题。我所做的是将图像从上到下裁剪为一系列区域,并使用 houghlines 分别检测每个区域中的线条。有效。希望这会有所帮助。