您需要使您的滤波器对噪声更加鲁棒。这可以通过给予它更大的支持来完成:
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
现在我们可以将多边形(第二度)拟合到外观:
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,
你可能会发现这个线程 https://stackoverflow.com/a/39191920/1714410相关的。