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

时间:2018-01-18 20:17:12

标签: image matlab hough-transform

我在此链接中有图片:https://imgur.com/a/TZPuz?&nc&nc

第一张图片是我的原始图片,第二张图片在应用下面的代码后将原始图片与图片进行比较:

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

第3张图片是使用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

但是,这张图片并不是我的预期。我希望它能产生类似于链接中第4或第5张图像的线条

我怎样才能改善这一点,以便得到我更喜欢的Hough线?

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

然而,Matlab能否自动检测边缘数量?因为我有一堆图像与我提供的样本图像略有不同,并且大多数图像的边缘数量不会相同

1 个答案:

答案 0 :(得分:1)

请勿将Canny边缘检测器应用于图像。您正在检测边缘图像中的线条,这将为输入图像中的每条边线提供一条线。您的输入图像包含您要检测的行,直接将Hough应用于它。

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