MATLAB区域属性函数regionprops用法及实例详解

一、regionprops函数用法简介

      regionprops 函数在 MATLAB 中是一个强大的工具,用于计算和分析二值图像(或更一般地说,标注矩阵)中连通区域的属性。当处理二值图像时,连通区域通常对应于图像中的前景对象,而背景则为另一个值(通常是0)。可以在matlab的命令窗口中输入help regionprops获得该函数的帮助信息。

其基本语法如下:

        STATS = regionprops(L,properties) 测量标注矩阵 L中每一个标注区域的一系列属性。L 中不同的正整数元素对应不同的区域, 例如:L 中等于整数1的元素对应区域1;L 中等于整数2的元素对应区域2;以此类推。

      当调用 regionprops 函数时,可以省略 properties 参量,在这种情况下,该函数将返回 "Area"、"Centroid" 和 "BoundingBox" 测量值。返回值STATS 是一个长度为 max(L(:))的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量。 properties 可以是由逗号分割的字符串列表,包含字符串的单元数组,单个字符串 'all' 或者 'basic'。如果 properties 等于字符串 'all',则所有下述字串列表中的度量数据都将被计算,如果properties 没有指定或者等于 'basic',则属性 'Area'、'Centroid' 和'BoundingBox' 将被计算。

       要计算二值图像中连通区域的面积和质心,你可以使用 regionprops 函数并指定 'Area'和'Centroid' 属性。以下是一个 MATLAB 范例,演示了如何计算二值图像中所有连通区域的面积和质心并显示:

二、程序代码

clear all;
close all;clc;  
%bw = imread('circles.png'); % 读入二值图像   
bw = imread('text.png'); % 读入二值图像  
% 使用 regionprops 计算面积和质心  
stats = regionprops(bw, 'Area','Centroid');  
% 显示所有连通区域的面积  
disp('连通区域的面积:');  
for k = 1:length(stats)  
    fprintf('区域 %d 的面积: %d\n', k, stats(k).Area);  
end  
% 如果你想以数组形式获取所有面积  
allAreas = [stats.Area];  
disp('所有连通区域的面积(数组形式):');  
disp(allAreas);
imshow(bw)
centroids = cat(1,stats.Centroid);
hold on
plot(centroids(:,1),centroids(:,2),'b*'),title('质心');%绘制出各区域的质心
hold off

三、部分运行结果

55f4b8c30aed4cd9a37382d5a6c98229.png

 

18c71339829348e2be87651e1525bc0d.png

    如果还想显示图像中每个连通域的面积可对上面程序略加改进!

clear all; close all; clc;
bw = imread('text.png');% 读取二值图像
% 使用 regionprops 计算面积和质心
stats = regionprops(bw, 'Area', 'Centroid');
% 显示图像
imshow(bw);
hold on;
% 获取所有质心
centroids = cat(1, stats.Centroid);
% 遍历所有区域,标注每个区域的面积
for k = 1:length(stats)
     % 获取当前区域的质心和面积
     centroid = stats(k).Centroid;
     area = stats(k).Area;
    % 在质心位置标注面积
    %str = sprintf('区域 %d 面积: %d', k, area);
    str = sprintf(' %d', area);
    text(centroid(1), centroid(2), str, 'Color', 'blue', 'FontSize', 8);%选择蓝色
    % 绘制质心(可选)
    plot(centroid(1), centroid(2), 'r*');
end
% 找出面积最大的区域
allAreas = [stats.Area];
[maxArea, maxAreaIndex] = max(allAreas);
maxCentroid = stats(maxAreaIndex).Centroid;
% 添加标题和说明
title('质心及每个区域的面积');
legend('质心', '区域面积','location','southwest');
hold off;

主要运行结果显示如下:

7bb1f2ed687341f5af950a03b9d953c0.png

 

 四、最大区域质心标记和最大区域面积计算

       大家可以在上述的程序稍作修改,就可以进行图像的最大区域质心标记和最大区域面积计算。修改后的程序和运行结果如下:

clear all; close all; clc;      
 
%bw = imread('circles.png'); % 读入二值图像      
 
bw = imread('text.png'); % 读入二值图像      
 
% 使用 regionprops 计算面积和质心      
 
stats = regionprops(bw, 'Area', 'Centroid');      
 
% 显示所有连通区域的面积      
 
disp('连通区域的面积:');      
 
for k = 1:length(stats)      
    fprintf('区域 %d 的面积: %d\n', k, stats(k).Area);      
end      
 
% 如果你想以数组形式获取所有面积      
 
allAreas = [stats.Area];      
 
disp('所有连通区域的面积(数组形式):');      
 
disp(allAreas);      
 
% 找出面积最大的区域      
 
[maxArea, maxAreaIndex] = max(allAreas);      
 
fprintf('最大区域的面积是: %d\n', maxArea);      
 
% 显示图像      
 
imshow(bw);      
 
hold on;      
 
% 获取所有质心      
 
centroids = cat(1, stats.Centroid);      
 
plot(centroids(:,1), centroids(:,2), 'b*'); % 绘制出各区域的质心      
 
% 标注最大区域的质心      
 
maxCentroid = stats(maxAreaIndex).Centroid;      
 
plot(maxCentroid(1), maxCentroid(2), 'ro', 'MarkerSize', 10, 'LineWidth', 2); % 使用红色圆圈标注最大区域质心      
 
% 在图像上标注最大区域的面积    
str = sprintf('最大区域面积: %d', maxArea);    
text(maxCentroid(1), maxCentroid(2) - 10, str, 'Color', 'red', 'FontSize', 12);    
 
% 添加标题和说明      
 
title('质心及最大区域质心标注');      
 
% 将图例放在左下角  
legend('质心', '最大区域质心', 'Location', 'southwest');      
 
hold off;

66b4573cb7a3476aa55fd2f891c14970.png

edd93f3f3f2b452d8e576799418dfcdf.png

       如果你觉得本文对大家有帮助,请关注、点赞和转发,谢谢大家!!!

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值