在 Matlab 中从具有粗糙边缘的图像中获取平滑的 Hough 线?
Obtaining smooth Hough lines from image with rough edges in Matlab?
我在这个 link 中有图像: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
第三张图片是使用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
但是,这张图片不是我所期望的。我希望它会产生类似于 link
中的第 4 或第 5 个图像的线条
我该如何改进才能得到我喜欢的 Hough 线条?
编辑:当我为 houghpeaks
修改 numpeaks
参数时,我得到了预期的行
但是,Matlab有没有办法自动检测边数呢?因为我有一堆图片和我提供的示例图片有点不同,而且大部分图片之间的边数都不一样
不要将 Canny 边缘检测器应用于您的图像。您正在检测边缘图像中的线条,这将为您输入图像中的每个边缘提供一条线。您的输入图像包含您要检测的线条,直接对其应用 Hough。
您可以选择对输入图像进行过滤,使线条更细,从而产生更好的霍夫变换。寻找 bwmorph
和 'thin'
选项。
我在这个 link 中有图像: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
第三张图片是使用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
但是,这张图片不是我所期望的。我希望它会产生类似于 link
中的第 4 或第 5 个图像的线条我该如何改进才能得到我喜欢的 Hough 线条?
编辑:当我为 houghpeaks
修改 numpeaks
参数时,我得到了预期的行
但是,Matlab有没有办法自动检测边数呢?因为我有一堆图片和我提供的示例图片有点不同,而且大部分图片之间的边数都不一样
不要将 Canny 边缘检测器应用于您的图像。您正在检测边缘图像中的线条,这将为您输入图像中的每个边缘提供一条线。您的输入图像包含您要检测的线条,直接对其应用 Hough。
您可以选择对输入图像进行过滤,使线条更细,从而产生更好的霍夫变换。寻找 bwmorph
和 'thin'
选项。