一、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
三、部分运行结果
如果还想显示图像中每个连通域的面积可对上面程序略加改进!
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;
主要运行结果显示如下:
四、最大区域质心标记和最大区域面积计算
大家可以在上述的程序稍作修改,就可以进行图像的最大区域质心标记和最大区域面积计算。修改后的程序和运行结果如下:
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;
如果你觉得本文对大家有帮助,请关注、点赞和转发,谢谢大家!!!