我使用regionprops3
命令在MATLAB中计算对象的属性我以为PrincipalAxisLength
是我物体的直径,但不是。
我创建了一个包含半径小于cc>的椭球的二值图像我从I
得到这些值:
sum(I(:)) = 16741
stats.volume = 16741
stats.EquivDiameter = 31.739 % 4/3*pi*(31.739/2)^3=16741
stats.PrincipalAxisLength = [71.535, 17.936, 17.908]
如果
(40, 10, 10)
是椭球体的3倍直径,那么它的体积是:4/3*pi*71.535/2*17.936/2*17.908/2 = 12031
不等于以上体积。
那么,如何计算椭球的半径呢?
最佳答案
形状测量的documentation描述为(重点矿山):
椭球体主轴的长度(以体素为单位),具有与区域相同的标准化第二中心矩,返回为1乘3向量PrincipalAxisLength
将值从高到低排序。
换言之,它符合该区域的多元概率分布,并计算该分布的central moments,返回regionprops3
测量的第二个中心矩(即方差)。
你所看到的体积差异是因为这些中心矩并没有定义一个适合区域内数据的边界椭球体,而是分布在其中的数据的概率拟合的方差对于包含椭球体形状的区域,它将低估椭球体的范围(从而低估总体积)这里有一些代码可以可视化:
% Create 3D binary data containing ellipsoid:
[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);
% Calculate statistics with regionprops3:
stats = regionprops3(I, 'all');
L = stats.PrincipalAxisLength./2;
% Create ellipsoid surface from second central moments and plot:
[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;
% Create image of middle slice through ellipsoid and plot:
imageSlice = 256.*uint8(I(:, :, 21));
imageSlice = cat(3, imageSlice, imageSlice, imageSlice);
image(-50:50, -20:20, imageSlice);
view(0, 90);
最后一个情节是:
如果您想要将椭球曲面拟合到二进制对象,则可以使用
PrincipalAxisLength
测量作为实际轴长度的初始猜测文件交换中有一个this function函数,它进行椭球体拟合,但它使用一组曲面点,而不是二进制卷也许你可以修改代码来满足你的需求。更新
注释中的link provided by Cris表明,可以确定第二中心矩和椭圆半径之间的明确数学关系虽然我还没有机会完成数学运算,但我注意到,简单地将
PrincipalAxisLength
按PrincipalAxisLength
进行缩放就可以得到接近sqrt(5/16)
的值:>> sqrt(5/16).*stats.PrincipalAxisLength
ans =
40.008372204885049 9.970908565527971 9.970908565527971