我有以下图片x1c 0d1x
因为我想找到边缘,所以我使用'edge'函数(A是上面的图像)BW = edge(A,'sobel');我得到了下面的图像
但是当我缩放时,我发现并不是所有的边都连接起来了。我该怎么做才能连接所有的边呢?我试过使用b = bwmorph(BW,'bridge'),但是它不能连接所有的边。
我现在的代码:
A = im2double(imread('image.png'));
BW = imbinarize(A);
BW = edge(BW, 'sobel');
imshow(BW)
PS:问题描述是aks找到孤立的成员。孤立的成员(在这个例子中)是边长等于403 +- 18的成员。这个特定情况的解决方案是1个成员,但我得到了0。
链接到图像-〉https://ibb.co/ZMV08xC
1条答案
按热度按时间xbp102n01#
[Note我在回答OP的根本问题,而不是实际问的问题。
以下是测量物体周长的方法:
1.分割对象
1.使用
regionprops
测量“周长”功能。分割通常是最难的部分。在这种情况下,
imbinarize
本身可以很好地将对象与背景分离,但由于对象重叠,因此每个结果区域都代表多个对象。将这些对象分离到单独的区域中真的很难。通常会尝试使用分水岭来处理这样的图像。在任何情况下,寻找物体的边缘在这里都没有用,它不会导致边界长度的精确估计。检测到的边缘通常不会形成连续的封闭轮廓,但即使它们是,下一步估计它们的长度没有偏见并不简单(counting the boundary pixels leads to a very unprecise and biased estimate)。
尽管如此,如果你真的需要计算边界像素(我重复一遍,这是一个非常糟糕的周长估计),你可以使用侵 eclipse 来得到二进制对象的轮廓(
edge
应该只应用于灰度图像)。这可以保证为每个对象生成一个闭合的轮廓:此代码生成两个额外的数字:在图像
bin
中的对象中存在两个孔,并且单独报告这些孔的周长,因为它们形成单独的连接分量。