1、imclose
功能:对图像执行形态学闭运算
语法:
J = imclose(I,SE)
J = imclose(I,nhood)
说明
J = imclose(I,SE) 使用结构元素 SE 对灰度或二值图像 I 执行形态学闭运算。形态学闭运算是先膨胀后腐蚀,这两种运算使用相同的结构元素。
J = imclose(I,nhood) 对图像 I 执行闭运算,其中 nhood 是由指定结构元素邻域的 0 和 1 组成的矩阵。此语法等效于 imclose(I,strel(nhood))。
使用形态学闭运算填充图像中的空缺
示例代码:
originalBW = imread('circles.png');
imshow(originalBW);
se = strel('disk',10); % 使用一个盘形结构元素来保持对象的圆形特性。指定半径为 10 个像素,以便填充最大空缺
closeBW = imclose(originalBW,se); % 对图像执行形态学闭运算
figure, imshow(closeBW)
输入参数:
参数 | 描述 |
---|---|
I | 输入图像,指定为任意维度的灰度图像或二值图像 |
SE | 结构元素,指定为单个 strel 对象或 offsetstrel 对象。如果图像 I 的数据类型为 logical,则结构元素必须为平面。 |
nhood | 结构元素邻域,指定为 0 和 1 组成的矩阵 |
输出参数
J — 经过闭运算的图像,以灰度图像或二值图像形式返回。J 与输入图像 I 具有相同的数据类型。
2、bwmorph
功能:针对二值图像的形态学运算
语法
BW2 = bwmorph(BW,operation)
BW2 = bwmorph(BW,operation,n)
说明:
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)
输入参数
参数 | 选项 | 描述 |
---|---|---|
BW | 数据类型:single double int8 int16 int32 int64 uint8 uint16 uint32 uint64 logical | 二值图像,指定为二维数值矩阵或二维逻辑矩阵。对于数值输入,任何非零像素都被视为 1 (true) |
operation | bothat | 执行形态学“底帽”运算,返回原图像减去执行形态学闭运算之后得到的图像 |
branchpoints | 找到骨架的分支点 | |
bridge | 桥接未连通的像素,即如果 0 值像素有两个未连通的非零邻点,则将这些 0 值像素设置为 1 | |
clean | 删除孤立像素(由 0 包围的单个 1),例如以下图案中的那个中心像素 | |
close | 执行形态学闭运算(先腐蚀后膨胀) | |
diag | 使用对角填充以消除背景的 8 连通 | |
endpoints | 找到骨架的终点 | |
fill | 填充孤立的内部像素(由 1 包围的单个 0),例如以下图案中的那个中心像素 | |
hbreak | 删除具有 H 连通的像素 | |
majority | 如果像素的 3×3 邻域中有 5 个或更多像素为 1,则将像素设置为 1;否则,将像素设置为 0 | |
open | 执行形态学开运算(先腐蚀后膨胀) | |
remove | 删除内部像素。如果一个像素的所有 4 连通邻点均为 1,则此选项会将该像素设置为 0,因此只保留边界像素为 on | |
shrink | 使用 n = Inf,通过从对象边界删除像素,将对象收缩为点。使没有孔洞的对象收缩为点,有孔洞的对象收缩为每个孔洞和外边界之间的连通环。此选项保留欧拉数(也称为欧拉示性数) | |
skel | 使用 n = Inf,删除对象边界上的像素,而不允许对象分裂。其余的像素构成图像骨架。此选项会保留欧拉数 | |
spur | 删除杂散像素 | |
thicken | 在 n = Inf 时,通过向对象外部添加像素来加厚对象,直到先前未连通的对象实现 8 连通为止。此选项会保留欧拉数 | |
thin | 在 n = Inf 时,通过从对象边界删除像素,将对象收缩为线。使没有孔洞的对象收缩为具有最小连通性的线,有孔洞的对象收缩为每个孔洞和外边界之间的连通环。此选项会保留欧拉数 | |
tophat | 执行形态学“顶帽”运算,返回原图像减去执行形态学开运算之后得到的图像 | |
n | 数据类型:char/string,正整数 | 执行运算的次数,指定为正整数或 Inf。当您将 n 指定为 Inf 时,bwmorph 函数会重复该运算,直到图像不再变化 |
3、bwareafilt
功能:按大小从二值图像中提取对象
语法:
BW2 = bwareafilt(BW,range)
BW2 = bwareafilt(BW,n)
BW2 = bwareafilt(BW,n,keep)
BW2 = bwareafilt(___,conn)
说明:
BW2 = bwareafilt(BW,range) 从二值图像 BW 中提取对象面积在指定 range 内的所有连通分量(对象),并生成另一个二值图像 BW2。bwareafilt 返回仅包含符合条件的那些对象的二值图像 BW2。
BW2 = bwareafilt(BW,n) 保留 n 个最大对象。如果第 n 个位置出现结值,则 BW2 中仅包含前 n 个对象。
BW2 = bwareafilt(BW,n,keep) 指定是保留 n 个最大对象还是 n 个最小对象。
BW2 = bwareafilt(___,conn) 指定定义对象的像素连通性。
示例代码:
按对象面积对二值图像进行滤波
BW = imread('text.png'); % 读取图像
BW2 = bwareafilt(BW,[40 50]); % 对图像进行滤波,只保留那些面积在 40 到 50 之间的对象
imshowpair(BW,BW2,'montage') % 并排显示原始图像和滤波后的图像
按对象大小对二值图像进行滤波
BW = imread('text.png'); % 读取图像
BW2 = bwareafilt(BW,5); % 对图像进行滤波,只保留面积最大的 5 个对象
imshowpair(BW,BW2,'montage') % 并排显示原始图像和滤波后的图像
输入参数:
参数 | 选项 | 描述 |
---|---|---|
BW | 数据类型:logical | 要滤波的图像,指定为二值图像 |
range | 数据类型:single double int8 int16 int32 int64 uint8 uint16 uint32 uint64 | 面积的最小值和最大值,指定为 [low high] 形式的二元素数值向量 |
n | 数据类型: double | 按大小对图像对象进行滤波时要包含的对象数量,指定为数值标量 |
keep | largest(默认)/ smallest,数据类型: char/string | 要包含在输出图像中的对象的大小,指定为 ‘largest’ 或 ‘smallest’。如果第 n 个位置出现结值,则 bwareafilt 仅包括前 n 个对象 |
conn | 4,由 0 和 1 组成的 3×3 矩阵 | 如果像素的边缘相互接触,则这些像素具有连通性。如果两个相邻像素都为 on 并在水平或垂直方向上连通,则它们是同一对象的一部分 |
8,由 0 和 1 组成的 3×3 矩阵 | 如果像素的边缘或角相互接触,则这些像素具有连通性。如果两个相邻像素都为 on 并在水平、垂直或对角线方向上连通,则它们是同一对象的一部分 |