我有一个二维数组,我想检测所有的局部最大数组索引。也就是说,给定一个指数(i,j),其最大梯度是其8个相邻值中任意一个的最大绝对变化:
Index: (i, j)
Neighbors:
(i-1,j+1) (i,j+1) (i+1,j+1)
(i-1,j) [index] (i+1,j)
(i-1,j-1) (i,j-1) (i+1,j-1)
Neighbor angles:
315 0 45
270 [index] 90
225 180 135
MaxGradient(i,j) = Max(|Val(index) - Val(neighbor)|)如果它的MaxGradient至少与其邻居的MaxGradients一样大,则该索引被认为是局部最大的。
算法的输出应该是一个元组的二维数组,或者是一个三维数组,其中对于原始数组中的每个索引,输出数组包含一个值,指示该索引是否局部最大,如果是,则表示梯度的角度。
我最初的实现简单地传递了数组两次,一次用来计算最大梯度(存储在临时数组中),然后一次传递到临时数组上,以确定局部最大索引。每一次,我都是通过for循环来完成这个任务的,我会单独查看每个索引。
有什么更有效的方法来解决这个问题吗?
发布于 2011-11-19 07:28:57
正如Cyborg所指出的,完成计算只需要计算四个差异(注意,如果这真的是均匀网格上的空间梯度计算,则对角线和反对角线计算确实应该有1/sqrt(2)的因数)。如果我理解了您的问题,那么numpy的实现可能如下所示:
A=np.random.random(100).reshape(10,10)
# Padded copy of A
B=np.empty((12,12))
B[1:-1,1:-1]=A
B[0,1:-1]=A[0,:]
B[-1,1:-1]=A[-1,:]
B[1:-1,0]=A[:,0]
B[1:-1,-1]=A[:,-1]
B[0,0]=A[1,1]
B[-1,-1]=A[-1,-1]
B[-1,0]=A[-1,0]
B[0,1]=A[0,1]
# Compute 4 absolute differences
D1=np.abs(B[1:,1:-1]-B[:-1,1:-1]) # first dimension
D2=np.abs(B[1:-1,1:]-B[1:-1,:-1]) # second dimension
D3=np.abs(B[1:,1:]-B[:-1,:-1]) # Diagonal
D4=np.abs(B[1:,:-1]-B[:-1,1:]) # Antidiagonal
# Compute maxima in each direction
M1=np.maximum(D1[1:,:],D1[:-1,:])
M2=np.maximum(D2[:,1:],D2[:,:-1])
M3=np.maximum(D3[1:,1:],D3[:-1,:-1])
M4=np.maximum(D4[1:,:-1],D4[:-1,1:])
# Compute local maximum for each entry
M=np.max(np.dstack([M1,M2,M3,M4]),axis=2)这将使您在M.中输入A的四个方向中的每一个方向都有最大的差异,类似的想法可用于标记局部最大值,最终达到以下目的:
T=np.where((M==np.max(np.dstack([Ma,Mb,Mc,Md,Me,Mf,Mg,Mh]),axis=2)))它将给出一个数组,其中包含M中局部最大值的坐标。
发布于 2011-11-18 14:35:03
考虑以下8个相关索引:
X1 X2 X3
X4 X X5
X6 X7 X8您可以计算每一个像素X的差异D1=Val(X)-Val(X1),D2=Val(X)-Val(X2),D3=Val(X)-Val(X3),D4=Val(X)-Val(X4)。您不需要计算其他的差异,因为它们是前四个的镜像。要计算差异,可以用一行和一列零填充图像并减去。
https://stackoverflow.com/questions/8178129
复制相似问题