2013-05-17 38 views
2

我有一個程序,我正在查詢包含在半徑爲R的球體S中的所有點。這些點是實際上在3D常規網格的頂點上對齊的三維點,但我不認爲這個細節與問題相關。查找體積(球體)的中心可以是3D節奏的任何地方。三維數據的高斯模糊

這些點包含一些數據(比如真實的)。我的問題是,如何使用3D濾鏡(例如高斯濾鏡)插值/過濾包含在球體中的點所保存的數據。我的理解是你需要這樣做(僞代碼):

interp_data = 0; 
for (each point contained in the lookup sphere S of radius R) 
     // compute square distance from point location to sphere centre 
     dist2 = distance2(sphere_center, curr_point_loc); 
     // compute gaussian weight 
     w = exp(-100 * dist2); 
     sumWeight += w; 
     interp_data += curr_point_data * w; 
interp_data /= sumWeight; 

是否正確。我看過一些使用類似技術的代碼。我知道exp函數的值100與某些似乎稱爲標準正常偏差的東西有關。值100在我看到的源代碼中被硬編碼,但我認爲這應該與球體的半徑有關?由於當dist2 = R^2時,高斯濾波器的權重應該下降到0。

如果有人可以對此有所瞭解,那就太好了。

另外它實際上是過濾3D數據的最佳方式?有更好/更快/更可靠的方法嗎?

非常感謝您的幫助。

+0

你應該說如果它是布爾值,RGB和它是哪種數據。這取決於速度是一個問題,你有多少點。超過1億,它會很慢。讀取和寫入數據,使用自己的數組創建自己的內存塊,以存儲有關每個點的信息,其速度提高了幾千倍,並且比堆棧或使用系統內存的效率高出許多倍。 –

回答

6

你的建議大多是合理的,但可能效率不高。 (另外,爲什麼距離平方而不僅僅是距離是多少?)

您可以更有效地通過做以下的事情進行3D高斯:

1)分離出內核爲3個1維通過與一維高斯核心。這是通過使用summed area tables

3的Gaussian blur wikipedia page

2解釋)可以通過連續做box-blur幾次逼近高斯核,並且可以實現),你也可以使用一個fast fourier transform做改爲將圖像乘以frequency space中的內核的卷積。

+1

線性分離解決方案的額外+++(#1) – Throwback1986

+0

謝謝你的答案,這已經是一個好的開始,但我希望有一個更實際的答案,並解釋關於100值和指數中使用的值(正常偏差)及其與球體半徑的關係。我在例子中使用dist2來避免計算平方根。在這種情況下FFT會過於昂貴,因爲我只考慮每次過濾幾個點,所以需要一些非常快速,準確和簡單的工具+我真的在處理3D數據,而不是圖像,即使原理相同。 – user18490