在图像上执行积分的有效方法

时间:2016-12-07 14:09:06

标签: arrays matlab numpy vectorization integral

我有一个2D阵列(典型大小约400x100)如图所示(它看起来像一个梯形,因为右下方的元素是nan)。对于数组中的每个元素,我想在列中为几个元素(大约10个元素的顺序)执行数值积分。在物理语言中,将颜色视为力的大小,我想通过计算Fdz的积分来找到完成的工作。我可以使用双for循环并使用<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <path id="a" d="M40 50 A 45 45 0,0,0 80 90 L 80 50 Z" fill="#bf1238"></path> <path id="a" d="M120 50 A 45 45 0,0,1 80 90 L 80 50 Z" fill="#bf1238"></path> </svg> 来完成这项工作,但是还有其他更有效的方法(可能是使用数组和向量化)来在Matlab或python中完成吗?我的最终目标是找到评估积分最大的点。因此,从黄色代表大值的图像中,我们期望积分在虚线上方的右侧某处是最大的。

另外,如果我想要整合的点数是一个整数,这是相对容易的,但如果我想整合,比如说7.5分呢?我正在考虑使用trap来插入点,但我不确定这是否会使任务过于复杂。

enter image description here

1 个答案:

答案 0 :(得分:3)

您可以使用cumsum来加速trap。计算累积和(@Benjamin提出的1维积分图像)

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

与离散长度

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

result是图片中每个cumdata[i+npoints, j] - cumdata[i, j]的{​​{1}}矢量化。它会在最后i, j行填充零。如果您想阻止这种情况,可以npointsreflect的边界。

对于非离散间隔,您可以使用插值:

np.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长度的积分可以作为

获得
npoints+C

请注意,上限现在为>>> npoints = 6 >>> result = np.zeros_like(data) >>> result[:-npoints, :] = csnew[npoints:, :] - csdata[:-npoints, :] (6的实际转换为6.5元素),使其在实践中每6.5点整合一次。

然后您可以找到最大点

csnew