在图像处理领域中,我们经常需要对图像进行分析和特征提取。如何快速、准确地提取图像特征是解决许多问题的关键。而在MATLAB中,regionprops函数则能够实现图像特征的快速提取,本文将重点介绍这一函数的使用方法。
一、regionprops函数概述
regionprops函数是MATLAB中处理二值图像的函数之一。该函数能够在图像中寻找并分析出所有的连通区域,进而计算出这些区域的坐标、大小、形状、相对位置等特征信息。具体而言,regionprops函数可用于以下几个方面:
1. 寻找二值图像中的连通区域;
2. 计算每个连通区域的面积、周长、中心点、边框、方向等特征;
3. 检测图像中连通区域的形状、大小、位置等特征信息;
4. 在图像中标注或直接进行信息提取。
二、regionprops函数的使用方法
regionprops函数的调用格式如下所示:
P=regionprops(BW,properties)
其中,BW是输入的二值图像,properties是需要提取的特征列表。
在使用regionprops函数时,我们需要指定需要提取的特征。这里,我们将介绍一下regionprops函数可提取的特征列表,包括:
1. 'Area' – 连通区域的面积;
2. 'BoundingBox' – 连通区域的边框(矩形);
3. 'Centroid' – 连通区域质心的坐标;
4. 'ConvexArea' – 连通区域的凸包面积;
5. 'ConvexHull' – 连通区域的凸包角点坐标;
6. 'Eccentricity' – 连通区域的离心率;
7. 'EquivDiameter' – 连通区域的等效直径;
8. 'Extent' – 连通区域占据矩形区域的比例;
9. 'Image' – 连通区域的子图像;
10. 'MajorAxisLength' – 连通区域的主轴长度;
11. 'MinorAxisLength' – 连通区域的次轴长度;
12. 'Orientation' – 连通区域主轴与水平轴的夹角;
13. 'Perimeter' – 连通区域的周长;
14. 'Solidity' – 连通区域的固实度。
我们可以根据不同的应用需求选择不同的特征进行提取。
在提取完所需的特征后,我们可以通过regionprops函数返回值来获取这些特征的数值或其他信息。具体而言,regionprops函数将返回一个结构体数组,每个数组元素对应着一个连通区域的特征信息。这个结构体包括与我们提取的特征相对应的属性值,如下所示:
1. Area – 连通区域的面积;
2. BoundingBox – 连通区域的边框(矩形)的坐标;
3. Centroid – 连通区域质心的坐标;
4. ConvexArea – 连通区域的凸包面积;
5. ConvexHull – 连通区域的凸包角点坐标;
6. Eccentricity – 连通区域的离心率;
7. EquivDiameter – 连通区域的等效直径;
8. Extent – 连通区域占据矩形区域的比例;
9. Image – 连通区域的子图像;
10. MajorAxisLength – 连通区域的主轴长度;
11. MinorAxisLength – 连通区域的次轴长度;
12. Orientation – 连通区域主轴与水平轴形成的夹角;
13. Perimeter – 连通区域的周长;
14. Solidity – 连通区域的固实度。
当然,我们也可以使用regionprops函数返回的结构体数组来显示连通区域的特征,例如:
stats = regionprops(BW,'Area','Centroid','BoundingBox');
imshow(BW)
hold on
for i = 1:length(stats)
centroid = stats(i).Centroid;
plot(centroid(1),centroid(2),'r*')
rectangle('Position',stats(i).BoundingBox,'EdgeColor','g')
end
本段代码中,我们对输入的二值图像(BW)运行regionprops函数,提取面积(Area)、质心坐标(Centroid)和边框位置(BoundingBox),并用Matlab自带的绘图函数在图像上将结果标注出来。
三、应用实例
下面,我们将介绍regionprops函数在实际应用中的应用案例。
案例1:“物体计数”
在这个案例中,我们将使用regionprops函数来对一张街景图片中所有的汽车进行计数。假设我们已经通过图像处理技术得到了车辆区域的二值图像(见下图),记为img。
我们将根据汽车区域的大小来判断是否计入总数。根据我们的观察和经验,一辆轿车通常会占据一个正常的停车位大小,即大约1000个像素。因此,我们可以通过设定一个大小阈值来排除一些噪声和较小的不当计算汽车。
具体步骤如下:
1. 寻找并计数所有面积大于1000像素的连通区域。
为了完整地提取车辆区域的特征,我们在运行regionprops函数时选择了诸如'Area'、'BoundingBox'、'Centroid'等特征。代码如下:
stats = regionprops(img,'Area','BoundingBox','Centroid');
figure, imshow(img)
hold on
count = 0;
for i = 1:length(stats)
if stats(i).Area > 1000
count = count + 1;
rectangle('Position',stats(i).BoundingBox,'EdgeColor','g')
plot(stats(i).Centroid(1), stats(i).Centroid(2),'r*')
text(stats(i).Centroid(1), stats(i).Centroid(2), num2str(count),...
'HorizontalAlignment','center',...
'VerticalAlignment','middle', 'Color', 'black');
end
end
2. 显示汽车数量和位置信息。
我们将每辆汽车的数量和位置信息以文字和图形方式导出到原有图片上。具体代码如下:
title(['Total Cars Detected:',num2str(count)])
目标检测结果如下图所示:
案例2:“肿瘤分析”
在这个案例中,我们将使用regionprops函数来对肿瘤图像进行分析。我们将计算肿瘤中所有病变区域的面积、质心位置和形状等特征。
具体步骤如下:
1. 将原始图像转化为二值图像。
我们将使用im2bw函数将原始肿瘤图像转化为二值图像。具体代码如下:
img = imread('tumor.jpg');
img_bw = im2bw(img);
figure, imshow(img_bw)
2. 使用regionprops函数进行分析与特征提取。
我们将提取图像中所有病变区域的特征,包括面积('Area')、中心位置('Centroid')、形状('Eccentricity'、'Extent'等)和轮廓('Perimeter')。代码如下:
stats = regionprops(img_bw,'Area','Centroid','Eccentricity', 'Extent', 'Perimeter');
figure, imshow(img)
hold on
for i=1:numel(stats)
plot(stats(i).Centroid(1),stats(i).Centroid(2),'*')
text(stats(i).Centroid(1),stats(i).Centroid(2),num2str(i),'Color','red')
end
函数运行后,我们将得到包含病变区域各个特征的结构体数组。同时,我们使用Matlab自带的绘图函数plot和text将中心位置标注出来。
下图为另外一个肿瘤图像的分析结果:
四、总结
本文详细介绍了MATLAB中用于图像分析和特征提取的regionprops函数。我们探讨了该函数的应用范围、用法和常见案例,能够帮助读者更好地了解和掌握该函数,并能够应用于实际问题中。同时,我们也提醒读者在使用regionprops函数时要注意提取对应的规定特征,方能得到更精确的分析结果。