我正在尝试为自动焊接过程检测焊接图像中的接缝。 我想在原始图像中找到检测到的线(所需图像中的红线)的像素位置。
我使用了下面的代码,最后去除了图像中的噪声,得到了下面的结果。
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')
不幸的是,图像中没有任何东西可以完美地找到接缝。
如有任何帮助,我们将不胜感激。
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
健壮的面具看起来像:
如您所见,接缝线检测得很好,我们只需要将其选为最大的连通分量即可:
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 偏移量。
附言,
你可能会发现 this thread相关。
关于matlab - matlab 图像中的自主接缝检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41221966/