2016-12-07 21 views
2

如圖所示,我有一個二維數組(典型大小約爲400x100)(因爲右下角的元素是nan,所以它看起來像一個梯形)。對於數組中的每個元素,我想爲幾個元素(約10個元素的順序)沿列進行數值積分。在物理學語言中,把顏色看作力的大小,我想通過計算Fdz的積分來找到所做的工作。我可以使用雙循環並使用trap來完成這項工作,但是有沒有其他更有效的方法(可能是使用數組和矢量化)在Matlab或Python中執行?我的最終目標是找到評估積分最大的點。因此,從黃色代表較大值的圖像中,我們預計積分將是虛線右上方的最大值。在圖像上執行積分的有效方法

另外,如果我想整合的點的數量是一個整數,那麼相對比較容易,但是如果我想要整合,比如7.5點呢?我正在考慮使用fit來插入點,但我不確定這是否太過複雜的任務。

enter image description here

+0

可能:https://en.wikipedia.org/wiki/Summed_area_table – Benjamin

+0

你如何定義的積分爲ponint'x'域?它是'[0,npoints]'*開始*在'x'還是'[-s,s]'(用s = npoints/2')*居中*在'x'? –

回答

3

您可以使用cumsum用來加快trap。計算累積性總和(1維積分圖像通過@Benjamin提議)

>>> import numpy as np 
>>> csdata = np.cumsum(data, axis=1) 

集成具有離散長度

>>> npoints = 6 
>>> result = np.zeros_like(data) 
>>> result[:-npoints, :] = csdata[npoints:, :] - csdata[:-npoints, :] 

resultcumdata[i+npoints, j] - cumdata[i, j]針對圖像中的每一個i, j矢量。它將填滿0行最後的npoints行。如果你想防止這種情況,你可以reflectnp.pad的邊界。

對於非離散的間隔,可以用內插工作:

>>> from scipy.interpolate import interp2d 
>>> C = 0.5 # to interpolate every npoints+C pixels 
>>> y, x = np.mgrid[:data.shape[0], :data.shape[1]] 
>>> ynew, xnew = np.mgrid[C:data.shape[0]+C, :data.shape[1]] 
>>> f = interp2d(x, y, csdata) 
>>> csnew = f(xnew, ynew) 

上述移規則網格C像素y方向,和內插在這些點的累積性數據csdata(在實踐中,它vectorices對每個像素進行插值)。

然後npoints+C長度的積分可以作爲

>>> npoints = 6 
>>> result = np.zeros_like(data) 
>>> result[:-npoints, :] = csnew[npoints:, :] - csdata[:-npoints, :] 

注意能夠得到該上限是現在csnew(6移位實際上得到的6.5元素),使得它在實踐中每6.5分集成。

然後可以找到最高點作爲

>>> idx = np.argmax(result.ravel()) # ravel to get the 1D maximum point 
>>> maxy, maxx = np.unravel_index(idx, data.shape) # get 2D coordinates of idx