【问题标题】:How to detect smooth curves in matlab如何在matlab中检测平滑曲线
【发布时间】:2023-04-08 23:59:02
【问题描述】:

我正在尝试检测图像中的弯曲传送带。我使用以下代码使用霍夫变换来检测它的边缘

%# load image, and process it
I = imread('ggp\2.jpg');
g = rgb2gray(I);
bw = edge(g,'Canny');

[H,T,R] = hough(bw);

P  = houghpeaks(H,500,'threshold',ceil(0.4*max(H(:))));

% I apply houghlines on the grayscale picture, otherwise it doesn't detect 
% the straight lines shown in the picture
lines = houghlines(g,T,R,P,'FillGap',5,'MinLength',50);
figure, imshow(g), hold on

for k = 1:length(lines)

    xy = [lines(k).point1; lines(k).point2];

    deltaY = xy(2,2) - xy(1,2);
    deltaX = xy(2,1) - xy(1,1);
    angle = atan2(deltaY, deltaX) * 180 / pi;
    if (angle == 0)

        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
end

如图所示,两条直线成功检测到输送机的顶部和底部边缘,但我不知道如何检测它是否弯曲(在图片中它是弯曲的)以及如何计算弯曲度那个。

如下图手动绘制的近似曲线(红色):

我在 matlab 中没有找到用于检测这种平滑曲线的霍夫变换的代码或函数(例如,二次多项式:y= a*x^2)。也欢迎任何其他解决方案。

这是原图:

【问题讨论】:

  • 能否提供原图?
  • @Tapio 我在帖子中添加了图片。
  • 我不明白您要检测图像中的什么曲线。您能否在图像上手动绘制并突出显示您希望找到的曲线?
  • @Shai 我把它画成红色。

标签: matlab image-processing computer-vision edge-detection hough-transform


【解决方案1】:

看着您检测传送带的直线,我假设您可以将处理集中在感兴趣区域(图像中的第 750 到 950 行)周围。
从那时开始:

oimg = imread('http://i.stack.imgur.com/xfXUS.jpg');  %// read the image
gimg = im2double( rgb2gray( oimg( 751:950, :, : ) ) );  %// convert to gray, only the relevant part
fimg = imfilter(gimg, [ones(7,50);zeros(1,50);-ones(7,50)] );  %// find horizontal edge

仅选择区域中心周围的强水平边缘像素

[row, col] = find(abs(fimg)>50); 
sel = row>50 & row < 150 & col > 750 & col < 3250;
row=row(sel);
col=col(sel);

将二阶多项式和一条线拟合到这些边缘点

[P, S, mu] = polyfit(col,row,2);
[L, lS, lmu] = polyfit(col, row, 1);

绘制估计曲线

xx=1:4000;
figure;imshow(oimg,'border','tight');
hold on;
plot(xx,polyval(P,xx,[],mu)+750,'LineWidth',1.5,'Color','r');
plot(xx,polyval(L,xx,[],lmu)+750,':g', 'LineWidth', 1.5);

结果是

您可以直观地了解 2 度拟合 P 如何更好地拟合传送带的边界。看第一个系数

>> P(1)
ans =
1.4574

您看到曲线的x^2 的系数不可忽略,使得曲线明显不是一条直线。

【讨论】:

  • 非常感谢!它有效,如果我没有收到其他答案,我会接受你的。
  • 您使用了 imfilter 和 15 x 50 矩阵,类似于 prewitt 3 x 3 矩阵。你能说说为什么在这种情况下我不能使用fspecial('prewitt') 进行水平边缘检测吗?但是我在测试时,它不起作用。
  • 15×50 不是 3×3。过滤器背后的基本原理是相同的:检测水平边缘,但使用 3×3 时,您会得到非常局部的结果,受图像中小边缘的影响。为了只检测非常明显和大的水平边缘,滤波器对 50 像素宽的区域进行平滑处理以清楚地检测边缘。您可以尝试将过滤器大小更改为 5×50 或 5×100,看看它如何影响检测的准确性。
  • 查看生成的fimg:您会看到过滤器越宽,您拥有的噪音就越少,而对于 3×3 过滤器,您实际上可以检测到很多小和图像中不明显的水平边缘。 @艾哈迈德
  • 对不起,我还有一个问题,为什么你用im2double,不能在灰度图像上应用滤镜?
猜你喜欢
  • 2012-10-10
  • 2023-03-04
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2021-05-25
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多