regionprops
测量图像区域的属性
语法
说明
regionprops
函数测量图像中每个对象(连通分量)的属性,如面积、质心和边界框。regionprops
支持连续区域和不连续区域。
regionprops
使用二维图像的 8 连通邻域和更高维图像的最大连通性在二值图像中查找唯一对象。有关详细信息,请参阅像素连通性。要查找使用其他连通性类型的对象,请使用 bwconncomp
创建连通分量,然后改用 CC
参量将结果传递给 regionprops
。
注意
要测量三维体图像中对象的属性,请考虑改用 regionprops3
。虽然 regionprops
可以接受三维图像,但 regionprops3
支持更多的三维图像统计量。
当您调用 regionprops
函数时,可以省略 properties
参量,在这种情况下,该函数将返回 "Area"
、"Centroid"
和 "BoundingBox"
测量值。
测量二值图像 stats
= regionprops(BW
,properties
)BW
中每个对象的属性。
测量每个连通分量 stats
= regionprops(CC
,properties
)CC
的属性。
测量标注图像 stats
= regionprops(L
,properties
)L
中每个标注区域的属性。
还使用 stats
= regionprops(outputFormat
,___)outputFormat
参量将返回的测量值的格式指定为结构体数组或表。
示例
计算质心并在图像上叠加位置
将一个二值图像读入工作区中。
BW = imread('text.png');
使用 regionprops
计算图像中连通分量的质心。regionprops
函数以结构体数组形式返回质心。
s = regionprops(BW,'centroid');
将质心的 x 和 y 坐标存储到一个两列矩阵中。
centroids = cat(1,s.Centroid);
显示质心位置叠加的二值图像。
imshow(BW) hold on plot(centroids(:,1),centroids(:,2),'b*') hold off
估计圆形目标的中心和半径并绘制圆
估计图像中圆形目标的中心和半径,并使用此信息在图像上绘制圆。在此示例中,regionprops
在表中返回测量的区域属性。
将图像读入工作区。
a = imread("circlesBrightDark.png");
将输入图像转换为二值图像。
bw = a < 50;
imshow(bw)
title("Image with Circles")
计算图像中区域的属性,并在表中返回数据。
stats = regionprops("table",bw,"Centroid", ... "MajorAxisLength","MinorAxisLength")
stats=3×3 table
Centroid MajorAxisLength MinorAxisLength
________________ _______________ _______________
300 120 79.517 79.517
330.29 369.92 109.49 108.6
450 240 99.465 99.465
获取圆的中心和半径。
centers = stats.Centroid; diameters = mean([stats.MajorAxisLength stats.MinorAxisLength],2); radii = diameters/2;
绘制圆。
hold on
viscircles(centers,radii)
ans = Group with properties: Children: [2x1 Line] Visible: on HitTest: on Use GET to show all properties
hold off
创建具有部分过滤后的对象的二值图像
读取一个二值图像并检测连通分量。
BW = imread("text.png");
CC = bwconncomp(BW);
测量每个连通分量的面积,并以表形式返回结果。
p = regionprops("table",CC,"Area");
创建一个仅包含第二个至第十个最大连通分量的二值图像。显示结果。
[~,idx] = sort(p.Area,"descend");
BWfilt = cc2bw(CC,ObjectsToKeep=idx(2:10));
imshow(BWfilt)
隔离垂直方向的区域
读取米粒的灰度图像,然后将图像转换为二值图像。
I = imread("rice.png");
BW = imbinarize(I);
imshow(BW)
测量每个区域的面积和边界框。
CC = bwconncomp(BW); stats = regionprops("table",CC,"Area","BoundingBox");
选择满足以下条件的区域:
该区域大于 50 个像素
边界框宽度小于 15 个像素,高度大于或等于 20 个像素。
area = stats.Area; bbox = stats.BoundingBox; selection = (area > 50) & (bbox(:,3) < 15) & (bbox(:,4) >= 20); BW2 = cc2bw(CC,ObjectsToKeep=selection);
显示滤波后的图像。
imshow(BW2)
输入参数
BW
— 二值图像
逻辑数组
二值图像,指定为任意维度的逻辑数组。
regionprops
根据每个分量的 top-left
极值,从左到右对二值图像中的对象进行排序。当多个对象具有相同的水平位置时,该函数从上到下对这些对象进行排序,然后再沿任何更高的维度进行排序。regionprops
返回测量的属性 stats
,顺序与排序的对象相同。
数据类型: logical
CC
— 连通分量
结构体
连通分量,指定为具有四个字段的结构体。您可以通过使用 bwconncomp
或 bwpropfilt
函数来获得连通分量结构体。
字段 | 描述 |
---|---|
Connectivity | 连通分量(对象)的连通性 |
ImageSize | 二值图像的大小 |
NumObjects | 二值图像中连通分量(对象)的数量 |
PixelIdxList | 1×NumObjects 元胞数组,其中,元胞数组中的第 k 个元素是包含第 k 个对象中像素的线性索引的向量 |
数据类型: struct
L
— 标注图像
数值数组 | 分类数组
标注图像,指定为下列项之一。
任意维数的数值数组。标注为
0
的像素构成背景。标注为1
的像素构成一个对象;标注为2
的像素构成第二个对象;以此类推。regionprops
将负值像素视为背景,并向下舍入非整数的输入像素。您可以通过watershed
或labelmatrix
等标注函数得到一个数值标注图像。分类数组。每个类别对应一个不同区域。
数据类型: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| categorical
properties
— 测量的类型
"basic"
(默认) | 字符串标量或字符向量的以逗号分隔的列表 | 字符串标量数组 | 字符向量元胞数组 | "all"
测量的类型,指定为字符串标量或字符向量的逗号分隔列表、字符串标量数组、字符向量的元胞数组,或者指定为 "all"
或 "basic"
。
如果指定
"all"
,则regionprops
会计算所有形状测量值,对于灰度图像,还会计算像素值测量值。如果指定
"basic"
,则regionprops
仅计算"Area"
、"Centroid"
和"BoundingBox"
测量值。
下列各表列出了提供形状测量值的所有属性。像素值测量值表中列出的属性仅在指定灰度图像时有效。
形状测量值
属性名称 | 描述 | N 维支持 | GPU 支持 | 代码生成 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
"Area" | 区域中的实际像素数,以标量形式返回。此值可能与 如需适合三维体区域的等效属性,请使用 | 是 | 是 | 是 | ||||||||
"BoundingBox" | 包含区域的最小外接框的位置和大小,以 1×(2*Q) 向量形式返回,其中Q 是图像维度。前 Q 个元素是边界框最小边角的坐标。接下来的 Q 个元素是外接框沿每个维度的大小。例如,值为 | 是 | 是 | 是 | ||||||||
"Centroid" | 区域的质心,以 1×Q 向量形式返回,其中Q 是图像维度。 下图显示一个不连续区域的质心和边界框。该区域由白色像素组成。绿框是边界框,红点是质心。
| 是 | 是 | 是 | ||||||||
"Circularity" | 对象的圆度,以具有字段
最大圆度值为 1。输入必须为一个标签矩阵或具有连续区域的二值图像。如果图像包含不连续区域, | 仅二维 | 否 | 是 | ||||||||
"ConvexArea" | ConvexImage 中的像素数,以标量形式返回。 | 仅二维 | 否 | 否 | ||||||||
"ConvexHull" | 可以包含区域的最小凸多边形,以 p×2 矩阵形式返回。矩阵的每一行包含多边形一个顶点的 x 和 y 坐标。 | 仅二维 | 否 | 否 | ||||||||
"ConvexImage" | 指定凸包的图像,凸包内的所有像素均被填充(设置为 on ),以二值图像形式返回。图像大小与区域边界框的大小相同。对于恰好在凸包边界上的像素,regionprops 使用 Classify Pixels That Are Partially Enclosed by ROI 描述的算法。 | 仅二维 | 否 | 否 | ||||||||
"Eccentricity" | 与区域具有相同二阶矩的椭圆的偏心率,以标量形式返回。偏心率是椭圆焦距与其长轴的比值。该值介于 0 和 1 之间。(0 和 1 是特例。偏心率为 0 的椭圆其实是圆,偏心率为 1 的椭圆是线段。) | 仅二维 | 是 | 是 | ||||||||
"EquivDiameter" | 与区域面积相同的圆的直径,以标量形式返回。计算为 sqrt(4*Area/pi) 。 | 仅二维 | 是 | 是 | ||||||||
"EulerNumber" | 区域中的对象数减去这些对象中的孔洞数,以标量形式返回。仅二维标签矩阵支持此属性。regionprops 使用 8 连通计算欧拉数(也称为欧拉示性数)。要了解有关连通性的详细信息,请参阅像素连通性。 | 仅二维 | 否 | 是 | ||||||||
"Extent" | 区域中的像素数与边界框中总像素数的比率,以标量形式返回。计算方法为 Area 除以边界框的面积。 | 仅二维 | 是 | 是 | ||||||||
"Extrema" | 区域中的极值点,以 8×2 矩阵形式返回。矩阵的每一行都包含其中一个点的 x 和 y 坐标。向量的形式为 下图显示了两个不同区域的极值。在左侧区域中,每个极值点都不同。对于右侧区域,某些极值点(如
| 仅二维 | 是 | 是 | ||||||||
"FilledArea" | FilledImage 中 on 像素的数量,以标量形式返回。 | 是 | 否 | 是 | ||||||||
"FilledImage" | 与区域的边界框大小相同的图像,以二值数组形式返回。
| 是 | 否 | 是 | ||||||||
"Image" | 与区域的边界框大小相同的图像,以二值数组形式返回。on 像素对应于该区域,所有其他像素为 off 。 | 是 | 是 | 是 | ||||||||
"MajorAxisLength" | 与区域具有相同归一化二阶中心矩的椭圆长轴的长度(以像素为单位),以标量形式返回。 | 仅二维 | 是 | 是 | ||||||||
"MaxFeretProperties" | 费雷特属性,包括最大值费雷特直径、其相对角度和坐标值,以具有下列字段的结构体形式返回:
输入可以是二值图像、连通分量或标签矩阵。 | 仅二维 | 否 | 否 | ||||||||
"MinFeretProperties" | 费雷特属性,包括最小费雷特直径、其相对角度和坐标值,以具有下列字段的结构体形式返回:
输入可以是二值图像、连通分量或标签矩阵。 | 仅二维 | 否 | 否 | ||||||||
"MinorAxisLength" | 与区域具有相同归一化二阶中心矩的椭圆短轴的长度(以像素为单位),以标量形式返回。 | 仅二维 | 是 | 是 | ||||||||
"Orientation" | x 轴与椭圆长轴(该椭圆与区域具有相同的二阶矩)之间的角度,以标量形式返回。该值以度为单位,范围从 -90 度到 90 度。下图显示椭圆的轴和方向。图的左侧显示一个图像区域及其对应的椭圆。右侧显示相同的椭圆,蓝色实线表示轴。红点表示焦点。方向是水平虚线和长轴之间的角度。
| 仅二维 | 是 | 是 | ||||||||
"Perimeter" | 围绕区域边界的距离,以标量形式返回。
| 仅二维 | 否 | 是 | ||||||||
"PixelIdxList" | 区域中像素的线性索引,以包含 p 个元素的向量形式返回。 | 是 | 是 | 是 | ||||||||
"PixelList" | 区域中像素的位置,以 p×Q 矩阵形式返回。矩阵的每一行都具有 [x y z ...] 形式,指定区域中一个像素的坐标。 | 是 | 是 | 是 | ||||||||
"Solidity" | 凸包中区域内像素所占的比例,以标量形式返回。实度计算为
| 仅二维 | 否 | 否 | ||||||||
"SubarrayIdx" | 对象边界框内 L 的元素,以包含索引的元胞数组形式返回,以便 L(idx{:}) 提取元素。 | 是 | 是 | 否 |
下表中的像素值测量属性仅在指定灰度图像 I
时有效。
像素值测量值
属性名称 | 描述 | N 维支持 | GPU 支持 | 代码生成 |
---|---|---|---|---|
"MaxIntensity" | 区域中强度最大的像素的值,以标量形式返回。 | 是 | 是 | 是 |
"MeanIntensity" | 区域中所有强度值的均值,以标量形式返回。 | 是 | 是 | 是 |
"MinIntensity" | 区域中强度最低的像素的值,以标量形式返回。 | 是 | 是 | 是 |
"PixelValues" | 区域中的像素数,以 p×1 向量形式返回,其中 p 是区域中的像素数。向量中的每个元素都包含区域中一个像素的值。 | 是 | 是 | 是 |
"WeightedCentroid" | 基于位置和强度值的区域中心,以坐标的 p×Q 向量形式返回。WeightedCentroid 的第一个元素是加权质心的水平坐标(即 x 坐标)。第二个元素是垂直坐标(即 y 坐标)。WeightedCentroid 的所有其他元素均按维度顺序排列。 | 是 | 是 | 是 |
数据类型: char
| string
| cell
输出参量
stats
— 测量值
struct
数组 (默认) | 表
测量值,以结构体数组或表形式返回。数组中的结构体数或表中的行数等于 BW
、CC.NumObjects
或 max(L(:))
中的对象数。每个结构体的字段或每行中的变量表示为每个区域计算的属性,由 properties
指定。如果输入图像是分类标注图像 L
,则 stats
包含属性为 "LabelName"
的附加字段或变量。
详细信息
连续区域和不连续区域
连续区域也称为对象、连通分量或斑点。包含连续区域的标注图像 L
看起来可能像下面这样:
1 1 0 2 2 0 3 3 1 1 0 2 2 0 3 3
L
中等于 1 的元素属于第一个连续区域或连通分量;L
中等于 2 的元素属于第二个连通分量;以此类推。
不连续区域是可以包含多个连通分量的区域。包含不连续区域的标注图像看起来可能像下面这样:
1 1 0 1 1 0 2 2 1 1 0 1 1 0 2 2
L
中等于 1 的元素属于第一个区域,该区域是不连续的,包含两个连通分量。L
中等于 2 的元素属于第二个区域,它是单个连通分量。 提示
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
regionprops
支持 C 代码生成(需要 MATLAB® Coder™)。请注意,如果您选择通用的MATLAB Host Computer
目标平台,regionprops
生成的代码将使用平台特定的预编译共享库。使用共享库可保留性能上的优化,但适用范围仅限于生成的代码所适用的目标平台。有关详细信息,请参阅Image Processing Toolbox 中代码生成支持的类型。仅支持二值图像或数值标注图像。不支持分类数据类型的输入标注图像。
不支持指定输出类型
"table"
。不支持传递属性的元胞数组。请改用逗号分隔列表。
支持除
"ConvexArea"
、"ConvexHull"
、"ConvexImage"
、"MaxFeretProperties"
、"MinFeretProperties"
、"Solidity"
和"SubarrayIdx"
之外的所有属性。
GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。
用法说明和限制:
GPU Coder™ 只为二值图像生成优化的 CUDA® 代码。为输入标注图像生成的代码未经过优化。不支持分类数据类型的输入标注图像。
不支持指定输出类型
"table"
。不支持传递属性的元胞数组。请改用逗号分隔列表。
仅支持
"Area"
、"BoundingBox"
、"Centroid"
、"Eccentricity"
、"EquivDiameter"
、"Extent"
、"MajorAxisLength"
、"MinorAxisLength"
、"Orientation"
、"PixelIdxList"
"PixelList"
、"MaxIntensity"
、"MeanIntensity"
、"MinIntensity"
、"PixelValues"
和"WeightedCentroid"
属性。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
用法说明和限制:
gpuArray
输入必须为二维逻辑矩阵或二维标签矩阵。不支持连通分量结构体 (
CC
) 输入。不支持以下属性:
"ConvexArea"
、"ConvexHull"
、"ConvexImage"
、"Circularity"
、"EulerNumber"
、"FilledArea"
、"FilledImage"
、"MaxFeretProperties"
、"MinFeretProperties"
和"Solidity"
。"struct"
是唯一受支持的返回类型。
有关详细信息,请参阅GPU 上的图像处理。
版本历史记录
在 R2006a 之前推出R2023a: 新圆度方程
regionprops
函数使用新方程来计算圆度。新方程消除了一种偏差,这种偏差导致计算出的圆度对于相对较小的对象来说过高。
如果您想使用旧方程来重现圆度测量值,可以使用以下命令:
props = regionprops(I,["Area" "Perimeter"]); oldCircularity = 4*pi*props.Area ./ props.Perimeter.^2;
R2022b: 支持基于线程的环境
regionprops
现在支持基于线程的环境。
R2022a: regionprops
将所有输入的 Image
、ConvexImage
和 FilledImage
属性作为元胞数组存储在输出表中
从 R2022a 开始,当指定表输出格式时,regionprops
函数将 Image
、ConvexImage
和 FilledImage
属性值存储为元胞数组,而不考虑图像对象的大小。在以前的版本中,如果对象边界框的大小为 1×1 或 1×n,这些属性将作为数值标量或行向量存储在输出表中。
要更新您的代码,请使用圆点表示法并通过花括号 {}
来访问 Image
、ConvexImage
和 FilledImage
属性的值。例如,使用以下代码访问输入图像 BW
中第一个对象的 Image
属性。在以前的版本中,不需要花括号来访问存储为数值标量或行向量的值。
stats = regionprops("table",BW,"Image"); imdata = stats.Image{1};
R2020a: 支持分类数据
regionprops
现在支持分类图像数据。
R2019a: 新圆度和费雷特属性
regionprops
现在测量二值图像中区域的圆度和费雷特属性。要测量圆度、最小费雷特属性或最大费雷特属性,请在指定 properties
参量时分别包括 "Circularity"
、"MinFeretProperties"
或 "MaxFeretProperties"
。
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)