Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

bwboundaries

跟踪二值图像中的区域边界

说明

示例

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

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

示例

B = bwboundaries(BW,conn,options) 跟踪对象的外边界,其中 options'holes''noholes',指定是否包括位于其他对象内的孔洞的边界。

示例

[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

Figure contains an axes. The axes contains 152 objects of type image, line.

将二值图像读入工作区。

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

Figure contains an axes. The axes contains 79 objects of type image, line, text.

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

figure
spy(A);

Figure contains an axes. The axes contains an object of type line.

将二值图像读入工作区。

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

Figure contains an axes. The axes contains 40 objects of type image, line.

将图像读入工作区。

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

Figure contains an axes. The axes contains 23 objects of type image, line.

输入参数

全部折叠

二值输入图像,指定为二维逻辑或数值矩阵。BW 必须为二值图像,其中非零像素属于一个对象,零值像素构成背景。下图说明了这些分量。

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

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

意义

二维连通

4 连通

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

8 连通

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

数据类型: double

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

选项

意义

'holes'

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

'noholes'

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

数据类型: char | string

输出参数

全部折叠

边界像素的行和列坐标,以 p×1 元胞数组形式返回,其中 p 是对象和孔洞的数量。元胞数组中的每个元胞都包含一个 q×2 矩阵。矩阵中的每行都包含一个边界像素的行和列坐标。q 是对应区域的边界像素的数量。

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

数据类型: double

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

数据类型: double

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

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

算法

bwboundaries 函数实现由 Jacob 的终止条件修正的 Moore 邻点跟踪算法。此函数基于 boundaries 函数,后者出现在 Digital Image Processing Using MATLAB 第一版中,作者 Gonzalez, R. C.、R. E. Woods 和 S. L. Eddins,New Jersey,Pearson Prentice Hall,2004。

参考

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

扩展功能

在 R2006a 之前推出