Main Content

bwmorph

针对二值图像的形态学运算

说明

示例

BW2 = bwmorph(BW,operation) 对二值图像 BW 应用特定的形态学运算。

注意

要对三维体图像执行形态学运算,请使用 bwmorph3

BW2 = bwmorph(BW,operation,n) 应用 n 次运算。n 可以是 Inf,在这种情况下会一直重复运算,直到图像不再变化。

示例

全部折叠

读取二值图像并显示它。

BW = imread('circles.png');
imshow(BW);

删除内部像素以保留形状轮廓。

BW2 = bwmorph(BW,'remove');
figure
imshow(BW2)

获取图像骨架。

BW3 = bwmorph(BW,'skel',Inf);
figure
imshow(BW3)

输入参数

全部折叠

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

要执行的形态学运算,指定为下列项之一。

操作

描述

"bothat"

执行形态学“底帽”运算,返回原图像减去执行形态学闭运算之后得到的图像。

bwmorph 函数使用邻域 ones(3) 执行形态学闭运算。如果要使用不同邻域执行形态学底帽运算,则请使用 imbothat 函数。

"branchpoints"

找到骨架的分支点。例如:

0  0  1  0  0           0  0  0  0  0
0  0  1  0  0           0  0  0  0  0
1  1  1  1  1  becomes  0  0  1  0  0
0  0  1  0  0           0  0  0  0  0
0  0  1  0  0           0  0  0  0  0

注意:要找到分支点,图像必须骨架化。要创建骨架化图像,请使用 bwmorph(BW,"skel")

"bridge"

桥接未连通的像素,即如果 0 值像素有两个未连通的非零邻点,则将这些 0 值像素设置为 1。例如:

1  0  0           1  1  0 
1  0  1  becomes  1  1  1 
0  0  1           0  1  1

"clean"

删除孤立像素(由 0 包围的单个 1),例如以下图案中的那个中心像素。

0  0  0 
0  1  0 
0  0  0

"close"

执行形态学闭运算(先膨胀后腐蚀)。

bwmorph 函数使用邻域 ones(3) 执行形态学闭运算。如果要使用不同邻域执行形态学闭运算,则请使用 imclose 函数。

"diag"

使用对角填充以消除背景的 8 连通。例如:

0  1  0           0  1  0 
1  0  0  becomes  1  1  0 
0  0  0           0  0  0

"endpoints"

找到骨架的终点。例如:

1  0  0  0           1  0  0  0
0  1  0  0  becomes  0  0  0  0
0  0  1  0           0  0  1  0
0  0  0  0           0  0  0  0

注意:要找到终点,图像必须骨架化。要创建骨架化图像,请使用 bwmorph(BW,"skel")

"fill"

填充孤立的内部像素(由 1 包围的单个 0),例如以下图案中的那个中心像素。

1  1  1 
1  0  1 
1  1  1

"hbreak"

删除具有 H 连通的像素。例如:

1  1  1           1  1  1 
0  1  0  becomes  0  0  0 
1  1  1           1  1  1

"majority"

如果像素的 3×3 邻域中有 5 个或更多像素为 1,则将像素设置为 1;否则,将像素设置为 0

"open"

执行形态学开运算(先腐蚀后膨胀)。

bwmorph 函数使用邻域 ones(3) 执行形态学开运算。如果要使用不同邻域执行形态学开运算,则请使用 imopen 函数。

"remove"

删除内部像素。如果一个像素的所有 4 连通邻点均为 1,则此选项会将该像素设置为 0,因此只保留边界像素为 on。

"shrink"

使用 n = Inf,通过从对象边界删除像素,将对象收缩为点。使没有孔洞的对象收缩为点,有孔洞的对象收缩为每个孔洞和外边界之间的连通环。此选项保留欧拉数(也称为欧拉示性数)。

"skel"

使用 n = Inf,删除对象边界上的像素,而不允许对象分裂。其余的像素构成图像骨架。此选项会保留欧拉数。

在使用三维体时,或当您要对骨架剪枝时,请使用 bwskel 函数。

"spur"

删除杂散像素。例如:

0  0  0  0           0  0  0  0
0  0  0  0           0  0  0  0
0  0  1  0  becomes  0  0  0  0
0  1  0  0           0  1  0  0
1  1  0  0           1  1  0  0

"thicken"

n = Inf 时,通过向对象外部添加像素来加厚对象,直到先前未连通的对象实现 8 连通为止。此选项会保留欧拉数。

"thin"

n = Inf 时,通过从对象边界删除像素,将对象收缩为线。使没有孔洞的对象收缩为具有最小连通性的线,有孔洞的对象收缩为每个孔洞和外边界之间的连通环。此选项会保留欧拉数。有关详细信息,请参阅算法

"tophat"

执行形态学“顶帽”运算,返回原图像减去执行形态学开运算之后得到的图像。

bwmorph 函数使用邻域 ones(3) 执行形态学开运算。如果您要对不同邻域执行形态学顶帽运算,则请使用 imtophat 函数。

提示

要执行形态学腐蚀或膨胀,请分别使用 imerodeimdilate 函数。如果要复制 bwmorph 函数执行的膨胀或腐蚀,则将邻域指定为 ones(3)

数据类型: char | string

执行运算的次数,指定为正整数或 Inf。当您将 n 指定为 Inf 时,bwmorph 函数会重复该运算,直到图像不再变化。

示例: 100

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

输出参量

全部折叠

执行形态学运算后的图像,以二维逻辑矩阵形式返回。

数据类型: logical

算法

全部折叠

当与 "thin" 选项结合使用时,bwmorph 使用以下算法 [3]

  1. 在第一个子迭代中,当且仅当条件 G1G2G3 全部满足时,才删除像素 p

  2. 在第二个子迭代中,当且仅当条件 G1G2G3 全部满足时,才删除像素 p

条件 G1:

XH(p)=1

其中

XH(p)=i=14bi

bi={1, if x2i1=0 and (x2i=1 or x2i+1=1)0, otherwise                                          

x1x2、...、x8p 的八个邻点的值,从东侧邻点开始,按逆时针顺序编号。

条件 G2:

2min{n1(p),n2(p)}3

其中

n1(p)=k=14x2k1x2k

n2(p)=k=14x2kx2k+1

条件 G3:

(x2x3x¯8)x1=0

条件 G3':

(x6x7x¯4)x5=0

这两个子迭代一起构成精简算法的一次迭代。当用户指定无限次数的迭代 (n=Inf) 时,迭代会一直重复,直到图像不再变化。所有条件都使用 applylut 和预先计算的查找表进行测试。

参考

[1] Haralick, Robert M., and Linda G. Shapiro, Computer and Robot Vision, Vol. 1, Addison-Wesley, 1992.

[2] Kong, T. Yung and Azriel Rosenfeld, Topological Algorithms for Digital Image Processing, Elsevier Science, Inc., 1996.

[3] Lam, L., Seong-Whan Lee, and Ching Y. Suen, "Thinning Methodologies-A Comprehensive Survey," IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol 14, No. 9, September 1992, page 879, bottom of first column through top of second column.

[4] Pratt, William K., Digital Image Processing, John Wiley & Sons, Inc., 1991.

扩展功能

版本历史记录

在 R2006a 之前推出