2016-03-08 44 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