2016-03-08 45 views
0

我想拟合不是完美球体的281 * 398 * 104矩阵的MR二进制数据,并找出球体的中心和半径以及误差。我知道LMS或SVD是适合球体的好选择。使用SVD/LMS拟合球体

我试图从sphereFit但matlab file exchange得到一个错误,

>> sphereFit(data) 
    Warning: Matrix is singular to working precision. 
    > In sphereFit at 33 
    ans = 
     NaN NaN NaN 

你让我知道问题出在哪里,或者任何其他的解决办法?

回答

0

如果您想使用球体拟合算法,您应该首先提取您假定为球体的对象的边界点。结果应该由包含点坐标的N×3阵列表示。然后你可以应用sphereFit函数。

为了获得二进制对象的边界点,有几种方法。一种方法是应用形态学侵蚀(您需要图像处理工具箱中的“imerode”函数)和小结构元素,然后计算两幅图像之间的集合差异,最后使用“查找”函数将二进制图像转换为坐标阵列。

的想法如下:

dataIn = imerode(data, ones([3 3 3])); 
bnd = data & ~data2; 
inds = find(bnd); 
[y, x, z] = ind2sub(size(data), inds); % be careful about x y order 
points = [x y z]; 
sphere = sphereFitting(points); 

顺便说一句,你给的链接是指圆拟合,我想你想指向一个球形接头提交?

问候,

+0

非常感谢您的回答。抱歉错误的超链接,我编辑了我用于分析的sphereFit函数的链接。 我需要根据我的'数据'(389 * 281 * 52; Row,Col,Slices)修改您的代码。我无法理解代码的一些行。所以你会让我用ones()的目的,虽然我读了imerode函数但是不能正确理解它。 x,y,z:它们是行,列,输入数据矩阵的切片。但是,我感谢您的关注@dlegland – Joe

+0

设置我的数据:dataIn = imerode(data,ones([3 3 3])); bnd = data&〜dataIn; inds = find(bnd); [y,x,z] = ind2sub(size(data),inds);点= [x y z]; sphere = sphereFit(points) – Joe

+0

首先,我假设你的数据是一个包含布尔值的3D数组,是吗? imerode函数的目的是去除位于“靠近”背景的输入二值图像的体素。它可以被看作是消除边界。通过与原始数据相结合,您可以获得具有白色体素边界的3D二值图像。 – dlegland