【问题标题】:Autonomous seam detection in Images on matlabmatlab上图像中的自主接缝检测
【发布时间】:2016-12-22 01:37:54
【问题描述】:

我正在尝试检测焊接图像中的接缝以进行自主焊接过程。 我想在原始图像中找到检测到的线(所需图像中的红线)的像素位置。

我使用了下面的代码,最后从图像中去除了噪点,得到了下面的结果。

clc,clear,clf;
im = imread('https://i.stack.imgur.com/UJcKA.png');
imshow(im);title('Original image'); pause(0.5);
sim = edge(im, 'sobel');
imshow(sim);title('after Sobel'); pause(0.5);
mask = im > 5;
se = strel('square', 5);
mask_s = imerode(mask, se);
mask(mask_s) = false;
mask = imdilate(mask, se);
sim(mask) = false;
imshow(sim);title('after mask');pause(0.5);
sim= medfilt2(sim);
imshow(sim);title('after noise removal')

不幸的是,图像中没有任何东西可以完美地找到接缝。

任何帮助将不胜感激。

Download原图。

【问题讨论】:

  • 为什么您的目标对象只有
  • 你提前知道接缝的大概形状吗?或者每张图像只有一个接缝?或任何其他有用的限制条件?
  • @Cecilia 每张图片只有一个接缝。
  • @asys +1 进行演示!

标签: matlab image-processing computational-geometry image-segmentation


【解决方案1】:

您需要使您的过滤器对噪音更加稳健。这可以通过给予更大的支持来完成:

filter = [ones(2,9);zeros(1,9);-ones(2,9)];
msk = imerode(im > 0, ones(11));  % only object pixels, discarding BG
fim =imfilter(im,filter); 
robust = bwmorph((fim>0.75).*msk,'skel',inf); % get only strong pixels

健壮的面具看起来像:

如您所见,接缝线被很好地检测到了,我们只需要将它选为最大的连通分量:

st = regionprops(bwlabel(robust,8), 'Area', 'PixelList');
[ma mxi] = max([st.Area]); % select the region with the largest area

现在我们可以将多边形(2 度)拟合到外观:

pp=polyfit(st(mxi).PixelList(:,1), st(mxi).PixelList(:,2), 2);

它在图像上:

imshow(im, 'border','tight');hold on;
xx=1:size(im,2);plot(xx,polyval(pp,xx)+2,'r');

注意+2 Y 偏移量由于过滤器宽度。


PS,
您可能会发现 this thread 相关。

【讨论】:

    【解决方案2】:

    Shai 给出了一个很好的答案,但我想添加更多关于为什么您的噪声过滤不起作用的上下文。

    为什么中值过滤不起作用

    Wikipedia 建议中值滤波在保留边缘的同时去除噪声,这就是您可能选择使用它的原因。但是,在您的情况下,它几乎肯定不会起作用,原因如下:

    中值过滤在图像上滑动一个窗口。在每个区域中,它用周围窗口的中值替换中心像素。 medfilt2 默认使用 3x3 窗口。让我们看看你的线路附近的一个 3x3 块,

    [212 157] 周围的 3x3 块看起来像这样

     [0 0 0
      1 1 1
      0 0 0]
    

    中间值为0!所以即使我们在一个线段的中间,像素也会被过滤掉。

    中值滤波的替代方案

    Shai 的去噪方法会找到最大的连接像素组,而忽略较小的像素组。如果您还想从图像中删除这些小对象,Matlab 提供了一个过滤器bwareaopen,它可以从二进制图像中删除小对象。

    例如,如果你替换你的行

    sim= medfilt2(sim);
    

    sim= bwareaopen(sim, 4);
    

    结果好多了

    替代边缘检测器

    最后一点,Shai 使用水平渐变滤镜来查找图像中的水平边缘。它很好用,因为你的边缘是水平的。如果您的边缘并不总是水平的,您可能需要使用另一种边缘检测方法。在您的原始代码中,您使用 Sobel,但 Matlab 提供了许多选项,如果您调整它们的阈值,所有这些选项的性能都会更好。例如,在下图中,我使用四个不同的边缘检测器突出显示了您的代码(通过 bwareaopen 修改)选择的像素。

    【讨论】:

    • 很好的解释。需要注意的是,值得注意的是 edge 检测和 ridge 检测之间的区别。在查看原始图像时,接缝是edge,在应用边缘检测过滤器后,边缘像素在边缘图中形成ridge。因此,虽然对原始图像应用中值滤波器可能会降低噪声并增强边缘,但对边缘图应用中值滤波器会消除 ,并使边缘检测变得更加困难。
    猜你喜欢
    • 2020-07-24
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多