连接图像中的边缘Matlab

lkaoscv7  于 2023-03-30  发布在  Matlab
关注(0)|答案(1)|浏览(201)

我有以下图片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

xbp102n0

xbp102n01#

[Note我在回答OP的根本问题,而不是实际问的问题。
以下是测量物体周长的方法:
1.分割对象
1.使用regionprops测量“周长”功能。
分割通常是最难的部分。在这种情况下,imbinarize本身可以很好地将对象与背景分离,但由于对象重叠,因此每个结果区域都代表多个对象。将这些对象分离到单独的区域中真的很难。通常会尝试使用分水岭来处理这样的图像。
在任何情况下,寻找物体的边缘在这里都没有用,它不会导致边界长度的精确估计。检测到的边缘通常不会形成连续的封闭轮廓,但即使它们是,下一步估计它们的长度没有偏见并不简单(counting the boundary pixels leads to a very unprecise and biased estimate)。

img = imread('https://i.stack.imgur.com/KcRkZ.jpg');
img = img(:,:,1);

bin = ~imbinarize(img);  % negate so that objects are `true` and background is `false`
props = regionprops(bin, {'Centroid', 'Perimeter'});

imshow(bin)
for ii = 1:numel(props)
   text(props(ii).Centroid(1), ...
        props(ii).Centroid(2), ...
        string(props(ii).Perimeter), ...
        'color', 'r');
end

尽管如此,如果你真的需要计算边界像素(我重复一遍,这是一个非常糟糕的周长估计),你可以使用侵 eclipse 来得到二进制对象的轮廓(edge应该只应用于灰度图像)。这可以保证为每个对象生成一个闭合的轮廓:

edge = bin & ~imerode(bin, strel('diamond', 1));
props = regionprops(edge, {'Centroid', 'Area'});

imshow(bin)
for ii = 1:numel(props)
   text(props(ii).Centroid(1), ...
        props(ii).Centroid(2), ...
        string(props(ii). Area), ...
        'color', 'r');
end

此代码生成两个额外的数字:在图像bin中的对象中存在两个孔,并且单独报告这些孔的周长,因为它们形成单独的连接分量。

相关问题