我试图在Matlab中删除我的图像边界.
我试过这个
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)')
结果是
但有两个明显的问题:
>默认情况下,Sobel的边缘输出包含一些内部形状.
>从灰度级减去二进制图像!(边缘的输出是二进制)
任何帮助,将不胜感激.
Download原始图像.
最佳答案 我可以想到这样做的一种方法是对图像进行阈值处理,以便您拥有一个坚固的白色物体,将物体缩小一点.然后,使用略微减小的对象索引到主对象蒙版并删除此区域.此外,稍微增加中间结果的面积以确保您移除边界的外边缘.这将最终产生一个挖空的遮罩,该遮罩设计用于在一定的公差范围内移除物体的边界,同时保留图像的其余部分.此掩码中的任何值都可用于删除边界.
为了重现性,我已将您的图像上传到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阈值,因为我实际上不知道您用什么来获得所需的图像.我只想说默认阈值没有给出预期结果显示的结果.