Main Content

bwboundaries

跟踪二值图像中的对象边界

说明

示例

B = bwboundaries(BW) 跟踪二值图像 BW 中对象的外边界以及这些对象内部孔洞的边界。bwboundaries 还跟踪父对象完全包围的子对象的外边界和孔洞边界。该函数返回由边界像素位置组成的元胞数组 B

下图说明了这些分量。

Parent objects in a binary image are white blobs that can have holes. Children objects appear as islands within the holes.

B = bwboundaries(BW,conn) 指定跟踪对象边界时要使用的 conn 连通性。

示例

B = bwboundaries(___,options) 跟踪对象的外边界,并通过将 options 设置为 "holes""noholes" 来指定是否包括孔洞的边界。

B = bwboundaries(___,Name=Value) 使用名称-值参量 (自 R2023a 起)指定跟踪样式和返回的顶点坐标的顺序。

示例

[B,L] = bwboundaries(___) 还返回标签矩阵 L,该矩阵用于标记对象和孔洞。

示例

[B,L,n,A] = bwboundaries(___) 还返回 n(找到的对象数量)和 A(邻接矩阵)。

示例

全部折叠

将灰度图像读入工作区。

I = imread('rice.png');

使用局部自适应阈值将灰度图像转换为二值图像。

BW = imbinarize(I);

计算图像中区域的边界,并在图像上叠加边界。

[B,L] = bwboundaries(BW,'noholes');
imshow(label2rgb(L, @jet, [.5 .5 .5]))
hold on
for k = 1:length(B)
   boundary = B{k};
   plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)
end

将二值图像读入工作区。

BW = imread('blobs.png');

计算图像中区域的边界。

[B,L,N,A] = bwboundaries(BW);

显示叠加了边界的图像。在每个边界旁边添加区域编号(基于标签矩阵)。使用缩放工具读取单个标签。

imshow(BW); hold on;
colors=['b' 'g' 'r' 'c' 'm' 'y'];
for k=1:length(B),
  boundary = B{k};
  cidx = mod(k,length(colors))+1;
  plot(boundary(:,2), boundary(:,1),...
       colors(cidx),'LineWidth',2);

  %randomize text position for better visibility
  rndRow = ceil(length(boundary)/(mod(rand*k,7)+1));
  col = boundary(rndRow,2); row = boundary(rndRow,1);
  h = text(col+1, row-1, num2str(L(row,col)));
  set(h,'Color',colors(cidx),'FontSize',14,'FontWeight','bold');
end

使用 spy 函数显示邻接矩阵。

figure
spy(A);

将二值图像读入工作区。

BW = imread('blobs.png');

计算边界。

[B,L,N] = bwboundaries(BW);

用红色显示对象边界,用绿色显示孔边界。

imshow(BW); hold on;
for k=1:length(B),
   boundary = B{k};
   if(k > N)
     plot(boundary(:,2), boundary(:,1), 'g','LineWidth',2);
   else
     plot(boundary(:,2), boundary(:,1), 'r','LineWidth',2);
   end
end

将图像读入工作区。

BW = imread('blobs.png');

用红色显示父边界,用绿色显示孔。

[B,L,N,A] = bwboundaries(BW); 
figure; imshow(BW); hold on; 
% Loop through object boundaries  
for k = 1:N 
    % Boundary k is the parent of a hole if the k-th column 
    % of the adjacency matrix A contains a non-zero element 
    if (nnz(A(:,k)) > 0) 
        boundary = B{k}; 
        plot(boundary(:,2),... 
            boundary(:,1),'r','LineWidth',2); 
        % Loop through the children of boundary k 
        for l = find(A(:,k))' 
            boundary = B{l}; 
            plot(boundary(:,2),... 
                boundary(:,1),'g','LineWidth',2); 
        end 
    end 
end

输入参数

全部折叠

二值图像,指定为二维逻辑或数值矩阵。对于数值输入,任何非零像素都被视为 1 (true)。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

像素连通性,指定为下表中的值之一。

意义

二维连通

4

如果像素的边缘相互接触,则这些像素具有连通性。如果两个相邻像素都为 on 并在水平或垂直方向上连通,则它们是同一对象的一部分。

Center pixel connected to four pixels

当前像素以灰色显示。

8

如果像素的边缘或角相互接触,则这些像素具有连通性。如果两个相邻像素都为 on 并在水平、垂直或对角线方向上连通,则它们是同一对象的一部分。

Center pixel connected to eight pixels

当前像素以灰色显示。

数据类型: double

确定是否同时搜索父对象边界和子对象边界,指定为以下任一项:

选项

意义

"holes"

同时搜索对象和孔洞边界。这是默认设置。

"noholes"

仅搜索对象(父对象和子对象)边界。这可以提供更好的性能。

数据类型: char | string

名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量后,但对各个参量对组的顺序没有要求。

示例: B = bwboundaries(BW,TraceStyle="pixeledge") 沿边界像素的外部边缘跟踪二值图像 BW 中对象的边界。

自 R2023a 起

沿边界的跟踪样式,指定为 "pixelcenter""pixeledge"

跟踪样式

意义

"pixelcenter"

跟踪边界为连接边界像素中心的多边形。

"pixeledge"

跟踪边界为沿边界像素外边缘的多边形。

自 R2023a 起

返回的顶点坐标的顺序,指定为 "yx""xy"

跟踪样式

意义

"yx"

以 (y, x) 坐标形式返回边界顶点,返回顺序与 (row, column) 坐标的顺序相同

"xy"

以 (x, y) 坐标形式返回边界顶点

输出参量

全部折叠

边界顶点的坐标,以 p×1 元胞数组形式返回,其中 p 是对象和孔洞的数量。B 中的前 n 个元胞是对象边界,其余元胞是孔洞边界。

元胞数组中的每个元胞都包含一个 q×2 矩阵。矩阵中的每一行都包含边界上一个顶点的坐标。q 是对应区域的边界顶点数量。

连续区域的标签矩阵,以由非负整数组成的二维矩阵形式返回。第 k 个区域包含 L 中所有具有 k 值的元素。由 L 表示的对象和孔洞的数量等于 max(L(:))L 的零值元素构成背景。

数据类型: double

找到的对象的数量,以非负整数形式返回。

数据类型: double

边界和孔洞之间的父子依存关系,以稀疏逻辑方阵形式返回,边长为 max(L(:))A 的行和列对应于 B 中存储的边界的位置。A(i,j)=1 表示对象 i 是对象 j 的子级。可以使用 A 找到包围或被第 k 个边界包围的边界,如下所示:

enclosing_boundary  = find(A(k,:));
enclosed_boundaries = find(A(:,k));

数据类型: double

算法

bwboundaries 函数实现由雅可比的终止条件修正的摩尔邻点跟踪算法。此函数基于 boundaries 函数,后者出现在 Digital Image Processing Using MATLAB [1]第一版中。

参考

[1] Gonzalez, R. C., R. E. Woods, and S. L. Eddins, Digital Image Processing Using MATLAB, New Jersey, Pearson Prentice Hall, 2004.

扩展功能

版本历史记录

在 R2006a 之前推出

全部展开