Matlab 中的图像变形

3

我希望在MATLAB中使用数学形态学函数来找到can.png图像的边界。输入图像如下:

enter image description here

我想得到一个像这样的边界:

enter image description here

我尝试使用不同的组合和参数,使用strel、imerode、imdilate等函数,但结果并不好(远离期望)

以下是我的一段尝试代码:

a = imread ('can.png');
b = im2bw(a);

SE = strel('rectangle', [10 50 ]) ;
i2 = imdilate(b,SE);

figure(1); imshow(i2);

p = ones(4);
c = b - imerode(b,p);

figure(2); imshow(c);

输出结果如下:

enter image description here

请问有人可以帮我吗?如何创建预期的图像(黑色背景,罐子边缘细线,请)?非常感谢。

1
这个图像是以何种方式进行变形的?请将您的问题标题更改为更好地反映您想要的内容。 - mmgp
2个回答

5
对其形态梯度进行二值化,然后使用基本结构元素进行膨胀处理,填充空洞,最后获取其边界(鉴于当前图像,此过程不难)。这不需要任何神奇的任意阈值。 enter image description here enter image description here

“Binarize on its morphological gradient” 是什么意思?在SE中(使用strel),我们还需要确定使用哪种结构以及其大小。 - user1917485
@user1917485 形态梯度通常是在膨胀-腐蚀上定义的,使用基本的方形元素。将其二值化意味着简单地在结果上运行otsu算法以获取二值化阈值:im2bw(mgrad, graythresh(mgrad))。如果您确实需要Matlab语法,则SE始终等于strel(square, 3) - mmgp
img = imread('can.png'); mgrad = imdilate(img, se) - imerode(img, se); 现在你可以对形态梯度进行二值化处理。如果罐子被白色像素填充,那就很好了,只剩下一个微不足道的步骤了。它也使用形态学,你想自己思考一下还是我直接给出? - mmgp
假设您将imfill的结果保存在二进制罐中,并命名为bcan。如果您执行bcan - imerode(bcan, se),会发生什么? - mmgp
好的,这样更好了:),非常感谢您的指导和讨论。 - user1917485
显示剩余2条评论

4
im = imread('can.png');

% turn image to BW
imb = (im < 220);

% fill the holes in the image
imf = imfill(imb, 'holes');

% find the edge
ed = edge(imf);

生成的图像:

在此输入图片描述


1
感谢您提供的代码。结果非常完美。不过,我想通过使用strel、imerode和imdilate在MATLAB中学习数学形态学函数。 - user1917485

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接