matlab - matlab 图像中的自主接缝检测

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

我正在尝试为自动焊接过程检测焊接图像中的接缝。 enter image description here 我想在原始图像中找到检测到的线(所需图像中的红线)的像素位置。

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

clc,clear,clf;
im = imread('/image/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')

enter image description here

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

如有任何帮助,我们将不胜感激。

Download原始图像。

最佳答案

您需要使您的过滤器对噪声更加鲁棒。这可以通过给它更大的支持来实现:

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

健壮的面具看起来像:

enter image description here

如您所见,接缝线检测得很好,我们只需要将其选为最大的连通分量即可:

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');

enter image description here

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


附言,
你可能会发现 this thread相关。

关于matlab - matlab 图像中的自主接缝检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41221966/

相关文章:

c++ - 在 C++ dll 中保持 MATLAB 引擎打开

MATLAB:如何从图像中裁剪出一个圆圈

java - 科学图像处理 - 用于选择的最小边界区域(imageJ?)

Python:从不规则网格高效地插值到二维规则网格

c++ - 多边形中的内部点

java - SVG/vector 图形对象 boolean 运算(并集、交集、减法)

algorithm - 将点网络的 "paths"连接到 "routes"

matlab - 如何在 MATLAB 中将移动窗口应用于二维矩阵?

java - 指纹图像的图像分割

algorithm - 从顶点初始化半边数据结构