clc,clear,clf
Im=im2double(imread('Im.png'));
imshow(Im);title('Original Image')
pause(.5)
imshow(edge(Im));title('after Sobel')
pause(.5)
imshow(Im-edge(Im));title('Im-edge(Im)')
,结果是
但有两个明显的问题:
edge
默认Sobel
的输出包含一些内部形状。从binary
一个中减去gray scale
张图片!edge
的输出为binary
)
任何帮助都将不胜感激。
Download原始图片。
答案 0 :(得分:1)
我能想到这样做的一种方法是使图像达到阈值,这样你就拥有了一个坚固的白色物体,稍稍缩小了物体。然后,使用略微减小的对象索引到主对象蒙版并删除此区域。此外,稍微增加中间结果的面积以确保您移除边界的外边缘。这将最终产生一个挖空的遮罩,该遮罩设计用于在一定的公差范围内移除物体的边界,同时保留图像的其余部分。此掩码中的任何值都可用于删除边界。
为了重现性,我已将您的图像上传到Stack Imgur,这样我们就不必依赖第三方网站下载您的图片了:
这种缩小和成长的“一点点”你将不得不玩。我选择了5个像素,因为这似乎有效。为了缩小和增长,分别使用imerode
和imdilate
进行侵蚀和扩张,我使用了一个5 x 5像素正方形的结构元素。
% Read from Stack Imgur directly
im = imread('https://i.stack.imgur.com/UJcKA.png');
% Perform Sobel Edge detection
sim = edge(im, 'sobel');
% Find the mask of the object
mask = im > 5;
% Shrink the object
se = strel('square', 5);
mask_s = imerode(mask, se);
% Remove the inner boundary of the object
mask(mask_s) = false;
% Slightly enlarge now to ensure outer boundary is removed
mask = imdilate(mask, se);
% Create new image by removing the boundaries of the
% edge image
sim(mask) = false;
% Show the result
figure; imshow(sim);
我们现在得到这张图片:
您必须使用Sobel阈值,因为我实际上不知道您用什么来获得所需的图像。我只想说默认阈值没有给出预期结果显示的结果。