本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

bwareaopen

从二值图像中删除小对象

说明

示例

BW2 = bwareaopen(BW,P) 从二值图像 BW 中删除少于 P 个像素的所有连通分量(对象),并生成另一个二值图像 BW2。此运算称为面积开运算

BW2 = bwareaopen(BW,P,conn) 删除所有连通分量,其中,conn 指定所需的连通性。

示例

全部折叠

读取二值图像。

BW = imread('text.png');

使用 bwareaopen 函数删除包含的像素数少于 50 的对象。

BW2 = bwareaopen(BW, 50);

并排显示原始图像和执行了形态学开运算的图像。

imshowpair(BW,BW2,'montage')

输入参数

全部折叠

二值图像,指定为任意维度的逻辑或数值数组。

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

对象的最大像素数,指定为非负整数。

示例: 50

数据类型: double

像素连通性,指定为下表中的值之一。对于二维图像,默认连通性是 8,对于三维图像,默认连通性是 26

意义

二维连通

4 连通

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

8 连通

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

三维连通

6 连通

如果像素的面接触,则这些像素具有连通性。如果两个相邻像素都为 on 并以如下方式连通,则它们是同一对象的一部分:

  • 在所列方向之一上连通:内、外、左、右、上、下

18 连通

如果像素的面或边缘接触,则这些像素具有连通性。如果两个相邻像素都为 on 并以如下方式连通,则它们是同一对象的一部分:

  • 在所列方向之一上连通:内、外、左、右、上、下

  • 在两个方向的组合上连通,如右下或内上

26 连通

如果像素的面、边缘或角接触,则这些像素具有连通性。如果两个相邻像素都为 on 并以如下方式连通,则它们是同一对象的一部分:

  • 在所列方向之一上连通:内、外、左、右、上、下

  • 在两个方向的组合上连通,如右下或内上

  • 在三个方向的组合上连通,如内右上或内左下

对于更高的维度,bwareaopen 使用默认值 conndef(ndims(BW),'maximal')

也可以通过指定由 01 组成的 3×3×...×3 矩阵,以更通用的方式来定义任意维度的连通性。值为 1 的元素定义相对于 conn 的中心元素的邻域位置。请注意,conn 必须关于其中心元素对称。有关详细信息,请参阅Specifying Custom Connectivities

数据类型: double | logical

输出参数

全部折叠

面积开运算后的图像,以与 BW 大小相同的逻辑数组形式返回。

算法

基本步骤如下

  1. 确定连通分量:

    CC = bwconncomp(BW, conn);
  2. 计算每个分量的面积:

    S = regionprops(CC, 'Area');
  3. 删除小对象:

    L = labelmatrix(CC);
    BW2 = ismember(L, find([S.Area] >= P));
    

扩展功能

另请参阅

|

在 R2006a 之前推出