2018a版本MatLab利用regionprops函数获取图片中物体轮廓最小外接矩形

2018a版本MatLab利用regionprops函数获取图片中物体最小外接矩形

本次内容,用于介绍利用matlab中的regionprops函数来获取图像区域中的物体的最小外接矩形信息(位置、长、宽)。

1.regionprops函数

regionprops函数是matlab中一个用来度量图像区域属性的函数,常用于编辑区域面积分布,显示区域总数。其具体信息可在官方帮助文档中查看:
https://ww2.mathworks.cn/help/images/ref/regionprops.html

它的语法如下:
STATS = regionprops(L,properties)
描述:

1、测量标注矩阵 L中每一个标注区域的一系列属性。L 中不同的正整数元素对应不同的区域, 例如:L 中等于整数1的元素对应区域1;L 中等于整数2的元素对应区域2;以此类推。L数据类型支持多种,逻辑、数值皆可。
2、返回值STATS 是一个长度为 max(L(:))的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量。 properties 可以是由逗号分割的字符串列表,包含字符串的单元数组,单个字符串 ‘all’ 或者 ‘basic’。如果 properties 等于字符串 ‘all’,则所有下述字串列表中的度量数据都将被计算,如果properties 没有指定或者等于 ‘basic’,则属性 ‘Area’、‘Centroid’ 和’BoundingBox’ 将被计算。

具体属性如下:

'Area’图像各个区域中像素总个数
‘BoundingBox’ 包含相应区域的最小矩形
‘Centroid’ 每个区域的质心(重心)
‘MajorAxisLength’ 与区域具有相同标准二阶中心矩的椭圆的长轴长度(像素意义下)
‘MinorAxisLength’ 与区域具有相同标准二阶中心矩的椭圆的短轴长度(像素意义下)
‘Eccentricity’ 与区域具有相同标准二阶中心矩的椭圆的离心率(可作为特征)
‘Orientation’ 与区域具有相同标准二阶中心矩的椭圆的长轴与x轴的交角(度)
‘Image’ 与某区域具有相同大小的逻辑矩阵
‘FilledImage’ 与某区域具有相同大小的填充逻辑矩阵
‘FilledArea’ 填充区域图像中的on像素个数
‘ConvexHull’ 包含某区域的最小凸多边形
‘ConvexImage’ 画出上述区域最小凸多边形
‘ConvexArea’ 填充区域凸多边形图像中的on像素个数
‘EulerNumber’ 几何拓扑中的一个拓扑不变量——欧拉数
‘Extrema’ 八方向区域极值点
‘EquivDiameter’ 与区域具有相同面积的圆的直径
‘Solidity’ 同时在区域和其最小凸多边形中的像素比例
‘Extent’ 同时在区域和其最小边界矩形中的像素比例
‘PixelIdxList’ 存储区域像素的索引下标
‘PixelList’ 存储上述索引对应的像素坐标
‘Perimeter’ 图像各个区域边界地区的周长

参考:
百度百科:https://baike.baidu.com/item/regionprops/3208753?fr=aladdin
matlab帮助文档:https://ww2.mathworks.cn/help/images/ref/regionprops.html

2.regionprops函数获取最小外接矩形信息

通过前面对regionprops函数的简单介绍,我们可以了解到该函数可用于获取图像中各个区域中像素总个数、相应区域的最小矩形、每个区域的质心、估计图像中圆形对象的中心和半径、甚至填充…
所以这次用了regionprops函数来获取二值图片中物体最小外接矩形,下面直接放代码:
// An highlighted block
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                       regionprops函数 求得多张图片中区域的最小外接矩形
%1%      该regionprops函数直接用于需要的图片上就可得到图片中所有连通区域的最小外接矩形位置、长、宽信息
%  我下面函数,只是因为我现在有filenums张图片,图片中为人体轮廓,现在需要求得每一张图片中人体轮廓的
%  最小外接矩形,因而用到一些循环等语句。
%2%      regionprops函数的返回值为结构体;如果用其 regionprops(imbiEdgepic(:,:,i),'BoundingBox')
%imbiEdgepic(:,:,i)(imbiEdgepic二值图图集中的第i张图)的'BoundingBox'(最小外接矩形);
%  那么它的返回值stats为结构体,该结构体中包含第i张图片中  ****所有连通区域  最小外接矩形的位置、长宽信息 ****
% (如有2个连通区域,则返回的stats结构体具有两最小外接矩形的信息)
%  其矩形信息调用方法为:a = stats.BoundingBox; % stats.BoundingBox便是位置、长、宽信息
%                                             % [x,y,length,wight]
%
% % % % 始终注意一点:
%          该函数是对图片中所有连通区域求最小外接矩形!!!
%          如果图片中连通区域为多个,返回的结构体也是一次性的多维结构体!!! 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
... 
...
... 
figure('NumberTitle','off','Name','步态周期检测-最小外接矩形'); % figure显示名字
%%%% %%%% 获得每个轮廓的最小外接矩形
for i=1:filenums  
    imbiEdgepic(:,:,i) = imbinarize(Morphology(:,:,i)); % 将图集中第i张图片二值化处理
    %%%% regionprops函数用于返回图片的属性
    BoundBs(1,i) = regionprops(imbiEdgepic(:,:,i),'BoundingBox'); % 利用函数度量图像区域属性,这里度量最小外接矩形
                                                             % 返回结构数据,其内是有关最小外接矩形的位置
                                                              % 长、宽信息,调用格式:s.BoundingBox
                                                               % s.BoundingBox = [x,y,l,w]
                                                                % 始终注意,该函数是对图片中所有连通区域求最小外接矩形!!!如果图片中连通区域为多个,返回的结构体也是一次性的多维结构体!!!
    %%%% 利用画矩形函数rectangle函数,将求得的第i张图中物体最小外接矩形 画在 第i张图片上
    figure;imshow(Morphology(:,:,i));title(['No.4-',num2str(i)]); % 首先显示第i张图片
    hold on % 画图保持
    rectangle('position',BoundBs(1,i).BoundingBox,'edgecolor','r'); % 把矩形位置、长宽信息传入rectangle函数,画出最小外接矩形
    hold off

end

下面是我循环操作后的一个效果。

在这里插入图片描述


更多精彩内容