PrincipalAxisLength
形状测量的文档描述为(重点是我):
具有与区域相同归一化二阶中心矩的椭球体主轴长度(以体素为单位),返回为1x3向量。 regionprops3
按值从高到低排序。
换句话说,它将多元概率分布拟合到该区域,并计算该分布的中心矩,返回PrincipalAxisLength
测量的二阶中心矩(即方差)。
您看到的体积差异是由于这些中心矩不定义用于适应区域内数据的边界椭球体,而只是用于其内部分布数据的概率拟合的方差。 对于包含椭球形状的区域,它会低估椭球的范围(因此总体积)。以下是一些可视化代码:
[X, Y, Z] = meshgrid(-50:50, -20:20, -20:20);
R = [40 10 10];
I = ((X./R(1)).^2 + (Y./R(2)).^2 + (Z./R(3)).^2 <= 1);
stats = regionprops3(I, 'all');
L = stats.PrincipalAxisLength./2;
[x, y, z] = ellipsoid(0, 0, 0, L(1), L(2), L(3), 100);
surf(x, y, z, 'FaceAlpha', 0.5, 'FaceColor', 'r', 'EdgeColor', 'none');
axis equal;
hold on;
imageSlice = 256.*uint8(I(:, :, 21));
imageSlice = cat(3, imageSlice, imageSlice, imageSlice);
image(-50:50, -20:20, imageSlice);
view(0, 90);
这是最终的图形:
如果你想要将一个椭球面拟合到二进制对象上,可以使用 PrincipalAxisLength
的测量结果作为真实轴长的起始猜测值。在“File Exchange”上有这个函数可以进行椭球体拟合,但那个函数使用一组表面点而不是二进制体积。或许你可以调整那个代码以适应你的需求。
更新
在Cris的评论中提供的链接表明,第二中心矩和椭圆半径之间可能存在明确的数学关系。虽然我还没有时间处理这个数学问题,但我注意到仅通过缩放 PrincipalAxisLength
乘以sqrt(5/16)
就可以得到非常接近R
的值:
>> sqrt(5/16).*stats.PrincipalAxisLength
ans =
40.008372204885049 9.970908565527971 9.970908565527971