Image 在Matlab中从边缘粗糙的图像中获得平滑的Hough线?

Image 在Matlab中从边缘粗糙的图像中获得平滑的Hough线?,image,matlab,hough-transform,Image,Matlab,Hough Transform,我在此链接中有图像: 第一个图像是我的原始图像,第二个图像应用以下代码后将原始图像与图像进行比较: I=imread('sample.png'); I = rgb2gray(I); E = edge(I, 'canny'); Edil = imdilate(E, strel('disk', 2)); Idil = imgaussfilt(double(Edil), 2); %2nd image in link, left one Idil = imgaussfilt(double(Edil),

我在此链接中有图像:

第一个图像是我的原始图像,第二个图像应用以下代码后将原始图像与图像进行比较:

I=imread('sample.png');
I = rgb2gray(I);
E = edge(I, 'canny');
Edil = imdilate(E, strel('disk', 2));
Idil = imgaussfilt(double(Edil), 2); %2nd image in link, left one
Idil = imgaussfilt(double(Edil), 8); %2nd image in link, right one
第三幅图像是使用
Hough
的结果:

BW=Idil;
[H,T,R] = hough(BW,'Theta',89:0.3:89.9);
P  = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
x = T(P(:,2)); y = R(P(:,1));
% Find lines and plot them
lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);
figure, imshow(Ib), 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 beginnings and ends of lines
  plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
  plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
end
然而,这张图片并不是我所期望的。我希望它能产生类似链接中第四或第五张图片的线条

我怎样才能改进这一点,从而得到我喜欢的Hough线

编辑:当我为
houghpeaks
修改
numpaks
参数时,我得到了我期望的行数


然而,难道没有一种方法Matlab可以自动检测边缘的数量吗?因为我有一组与我提供的示例图像略有不同的图像,并且它们中的大多数彼此的边缘数不相同

请不要对图像应用Canny边缘检测器。您正在检测边缘图像中的线条,这将为输入图像中的每条边缘提供一条线条。如果输入图像包含要检测的线条,请直接对其应用Hough


或者,您可以过滤输入图像,使线条更细,从而产生更好的Hough变换。查找
bwmorph
'thin'
选项。

不要对图像应用Canny边缘检测器。您正在检测边缘图像中的线条,这将为输入图像中的每条边缘提供一条线条。如果输入图像包含要检测的线条,请直接对其应用Hough


或者,您可以过滤输入图像,使线条更细,从而产生更好的Hough变换。查找
bwmorph
'thin'
选项。

这是我根据您的建议得到的:-第一张没有Canny边缘的图像,第二张使用
bwmorph
thin
。这些结果仍然是不可取的。接下来,您需要改进检测局部最大值的方法(对不起,没有研究houghpeaks的工作原理),不要指望设计用于检测直线的系统会检测到蠕动线。我的意思是,如果您每次在输入中退出蠕动线时都切断线,你永远无法在整条生产线中安装它。没有一条直线延伸到图像中,并位于你的蠕动线内。我想要的直线不需要精确地位于蠕动线内。我只想要直线近似值。如果有办法拟合包含每条边的薄矩形(或其他多边形对象)长方体,而不是拟合边的直线,也可以。这可以在Matlab中实现吗?有很多方法可以检测线条。这在很大程度上取决于您的应用程序,最合适的应用程序是什么。链接的图像是代表性的,还是简化的?因为像这样的二进制或接近二进制的图像处理起来非常简单。如何做到这一点是非常适合在评论框,给你一个好的解决方案将需要更多的时间从我以及。开始寻找连接组件分析。这是我根据您的建议得到的:-第一张没有Canny边缘的图像,第二张使用
bwmorph
thin
。这些结果仍然是不可取的。接下来,您需要改进检测局部最大值的方法(对不起,没有研究houghpeaks的工作原理),不要指望设计用于检测直线的系统会检测到蠕动线。我的意思是,如果您每次在输入中退出蠕动线时都切断线,你永远无法在整条生产线中安装它。没有一条直线延伸到图像中,并位于你的蠕动线内。我想要的直线不需要精确地位于蠕动线内。我只想要直线近似值。如果有办法拟合包含每条边的薄矩形(或其他多边形对象)长方体,而不是拟合边的直线,也可以。这可以在Matlab中实现吗?有很多方法可以检测线条。这在很大程度上取决于您的应用程序,最合适的应用程序是什么。链接的图像是代表性的,还是简化的?因为像这样的二进制或接近二进制的图像处理起来非常简单。如何做到这一点是非常适合在评论框,给你一个好的解决方案将需要更多的时间从我以及。寻找连接组件分析以开始。