MatLab求取多个闭合区域的轮廓、面积和bbox

问题描述

要对如下所示的二值标签图做如下处理:

  1. 获取每一个闭合小区域的轮廓曲线坐标
  2. 获取每一个闭合小区域的面积
  3. 获取每一个闭合小区域的 bounding box

MatLab求取多个闭合区域的轮廓、面积和bbox_第1张图片

处理方法

问题一: 获取每一个闭合小区域的轮廓曲线坐标,可以直接使用 bwboundaries 函数进行处理。

I = imread(img);
B = bwboundaries(I, 'noholes');

此时 B 为一个 n*1 的元胞数组,n 为闭合区域的个数,每个 cell 中存储了一个区域的轮廓坐标点,且坐标点是按照轮廓曲线顺时针方向存储的。

问题二: 要获取每一个小区域的面积,简单计算二值矩阵中不为 0 的元素个数已经不再适用。考虑先用 bwlabel 对标签的不同区域打上标记,默认按照 8 联通。然后可以根据标记像素值求取每个小区域的面积。

[L, num] = bwlabel(I);
area1 = sum(sum(L == 1));
area2 = sum(sum(L == 2));

这样就能分别求出两个区域的面积。

问题三: 要获取每一个小区域的 bounding box 很简单,已经知道了它们各自的轮廓坐标,求出这些坐标中 x(列坐标) 和 y(行坐标) 最小和最大的值:(ymin,xmin)(ymax,xmax) 即可。


另外,又发现了一个神奇的函数 regionprops,对图形处理很有用处 ~

参考:Matlab图像处理函数:regionprops

用法:STATS = regionprops(L,properties),用于测量矩阵 L 中每一个标注区域的一系列属性。

L 中不同的正整数元素对应不同的区域。例如:标记值为 1 的所有像素点对应区域 1,标记值为 2 的所有像素点对应区域 2,以此类推。

返回值 STATS 是一个长度为 max(L) 的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量。

properties 可以是由逗号分割的字符串列表、包含字符串的单元数组、单个字符串 ‘all’ 或者 ‘basic’。如果 properties 等于字符串 ‘all’,则所有下述字串列表中的度量数据都将被计算,如果 properties 没有指定或者等于 ‘basic’,则属性: ‘Area’, ‘Centroid’, 和 ‘BoundingBox’ 将被计算。下面的列表就是所有有效的属性字符串,它们大小写敏感并且可以缩写。

同样地,在使用 regionprops 前,需要先用 bwlabel 函数对矩阵不同区域进行标注。

属性 用途 返回值
Image 提取每一个小区域 二值图像
FilledImage 提取每一个小区域并做填充 二值图像
Area 计算各个区域像素总个数 1*L
FilledArea 计算各个区域填充后的像素总个数 1*L
BoundingBox 获取各个区域的最小外接矩形框 L*2
Centroid 获取各个区域的质心 (重心) 1*L
MajorAxisLength 与区域具有相同标准二阶中心矩的椭圆的长轴长度 标量
MinorAxisLength 与区域具有相同标准二阶中心矩的椭圆的短轴长度 标量
Eccentricity 与区域具有相同标准二阶中心矩的椭圆的离心率 标量
Orientation 与区域具有相同标准二阶中心矩的椭圆的长轴与x轴的交角(度) 标量
ConvexArea 填充区域凸多边形图像中的像素个数 标量
ConvexHull 获取包含某区域的最小凸多边形 p*2
ConvexImage 用来画出上述的区域最小凸多边形 二值图像

你可能感兴趣的:(图像处理,工具使用,#,MATLAB)