bwboundaries
跟踪二值图像中的对象边界
语法
说明
使用名称-值参数 (自 R2023a 起)指定跟踪样式和返回的顶点坐标的顺序。B
= bwboundaries(___,Name=Value
)
示例
在图像上叠加区域边界
将灰度图像读入工作区。
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
输入参数
BW
— 二值图像
二维数值矩阵 | 二维逻辑矩阵
二值图像,指定为二维逻辑或数值矩阵。对于数值输入,任何非零像素都被视为 1
(true
)。
数据类型: single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
conn
— 像素连通性
8
(默认) | 4
像素连通性,指定为下表中的值之一。
值 | 意义 | |
---|---|---|
二维连通 | ||
| 如果像素的边缘相互接触,则这些像素具有连通性。如果两个相邻像素都为 on 并在水平或垂直方向上连通,则它们是同一对象的一部分。 |
当前像素以灰色显示。 |
| 如果像素的边缘或角相互接触,则这些像素具有连通性。如果两个相邻像素都为 on 并在水平、垂直或对角线方向上连通,则它们是同一对象的一部分。 |
当前像素以灰色显示。 |
数据类型: double
options
— 确定是否同时搜索父对象边界和子对象边界
"holes"
(默认) | "noholes"
确定是否同时搜索父对象边界和子对象边界,指定为以下任一项:
选项 | 意义 |
---|---|
| 同时搜索对象和孔洞边界。这是默认设置。 |
| 仅搜索对象(父对象和子对象)边界。这可以提供更好的性能。 |
数据类型: char
| string
名称-值参数
将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参数名称,Value
是对应的值。名称-值参数必须出现在其他参数后,但对各个参数对组的顺序没有要求。
示例: B = bwboundaries(BW,TraceStyle="pixeledge")
沿边界像素的外部边缘跟踪二值图像 BW
中对象的边界。
TraceStyle
— 跟踪样式
"pixelcenter"
(默认) | "pixeledge"
自 R2023a 起
沿边界的跟踪样式,指定为 "pixelcenter"
或 "pixeledge"
。
跟踪样式 | 意义 |
---|---|
| 跟踪边界为连接边界像素中心的多边形。 |
| 跟踪边界为沿边界像素外边缘的多边形。 |
CoordinateOrder
— 返回的顶点坐标的顺序
"yx"
(默认) | "xy"
自 R2023a 起
返回的顶点坐标的顺序,指定为 "yx"
或 "xy"
。
跟踪样式 | 意义 |
---|---|
| 以 (y, x) 坐标形式返回边界顶点,返回顺序与 ( |
| 以 (x, y) 坐标形式返回边界顶点 |
输出参数
B
— 边界顶点的坐标
p×1 元胞数组
边界顶点的坐标,以 p×1 元胞数组形式返回,其中 p 是对象和孔洞的数量。B
中的前 n
个元胞是对象边界,其余元胞是孔洞边界。
元胞数组中的每个元胞都包含一个 q×2 矩阵。矩阵中的每一行都包含边界上一个顶点的坐标。q 是对应区域的边界顶点数量。
L
— 标签矩阵
非负整数的二维矩阵
连续区域的标签矩阵,以由非负整数组成的二维矩阵形式返回。第 k 个区域包含 L
中所有具有 k 值的元素。由 L
表示的对象和孔洞的数量等于 max(L(:))
。L
的零值元素构成背景。
数据类型: double
n
— 找到的对象的数量
非负整数
找到的对象的数量,以非负整数形式返回。
数据类型: double
A
— 边界和孔洞之间的父子依存关系
稀疏逻辑方阵
边界和孔洞之间的父子依存关系,以稀疏逻辑方阵形式返回,边长为 max(L(:))
。A
的行和列对应于 B
中存储的边界的位置。A(i,j)=1
表示对象 i
是对象 j
的子级。可以使用 A
找到包围或被第 k 个边界包围的边界,如下所示:
enclosing_boundary = find(A(k,:)); enclosed_boundaries = find(A(:,k));
数据类型: double
算法
bwboundaries
函数实现由雅可比的终止条件修正的 Moore 邻点跟踪算法。此函数基于 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.
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
bwboundaries
支持 C 代码生成(需要 MATLAB® Coder™)。请注意,如果您选择通用的MATLAB Host Computer
目标平台,bwboundaries
生成的代码将使用平台特定的预编译共享库。使用共享库可保留性能上的优化,但适用范围仅限于生成的代码所适用的目标平台。有关详细信息,请参阅Image Processing Toolbox 中代码生成支持的类型。参数
conn
必须为编译时常量。参数
options
必须为编译时常量。返回值
A
只能是满矩阵,不能是稀疏矩阵。
GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。
用法说明和限制:
conn
参数必须为编译时常量。options
参数必须为编译时常量。返回值
A
只能是满矩阵,不能是稀疏矩阵。
版本历史记录
在 R2006a 之前推出R2023a: 新的 TraceStyle
和 CoordinateOrder
名称-值参数
TraceStyle
名称-值参数增加了对沿边界像素外边缘跟踪边界的支持。以前,该函数仅通过边界像素的中心来跟踪边界。
CoordinateOrder
名称-值参数增加了对以 (x, y) 顺序返回的边界坐标的支持。以前,该函数仅以 (y, x) 顺序返回边界坐标。
另请参阅
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)