使用scipy.ndimage_generic_filter进行多维过滤

时间:2015-10-08 10:51:38

标签: python numpy multidimensional-array scipy filtering

我想使用generic filter来计算给定窗口(或内核)中值的平均值,以满足几个条件的值。我期望以下代码在3层窗口中生成第一个数组的均值滤波器,使用另外两个数组来掩盖平均值计算中的值。

from scipy import ndimage
import numpy as np

#some test data
tstArr = np.random.rand(3,7,7)
tstArr = tstArr*10
tstArr = np.int_(tstArr)
tstArr[1] = tstArr[1]*100
tstArr[2] = tstArr[2] *1000

#mean function
def testFun(tstData,processLayer,nLayers,kernelSize):
    funData= tstData.reshape((nLayers,kernelSize,kernelSize))
    meanLayer = funData[processLayer]
    maskedData = meanLayer[(funData[1]>1)&(funData[2]<9000)]
    returnMean = np.mean(maskedData)
    return returnMean

#number of layers in the array
nLayers = np.shape(tstArr)[0]         

#window size
kernelSize = 5 

#create a sampling window of 5x5 elements from each array             
footprnt = np.ones((nLayers,kernelSize,kernelSize),dtype = np.int)      

# calculate the mean of the first layer in the array (other two are for masking)
processLayer = 0                      

tstOut = ndimage.generic_filter(tstArr, testFun, footprint=footprnt,        extra_arguments = (processLayer,nLayers,kernelSize))

我认为这会从输入数组的第一层产生一个7x7的掩码平均值数组。输出是一个3x7x7数组,我不明白这些值代表什么。我不确定如何生成“蒙面”均值滤波数组,或者如何将输出解释为给定。

1 个答案:

答案 0 :(得分:0)

您的代码在3层窗口中生成第一个数组的均值过滤器,使用两个以上的数组来掩盖平均值计算中的值。您将在tstOut[1]中找到结果。

发生了什么事?当您使用ndimage.generic_filter形状tstArr(3, 7, 7)footprint=np.ones((3, 5, 5))时,对于从0到2的所有i,对于从0到0的所有j 6,对于从0到6的所有ktestFun被调用,tstArr的子数据集中在(i, j, k)且形状(3, 5, 5)(数组被反映)在边界提供缺失值。)

最后:

  • tstOut[0]tstArr[0]的平均过滤器,tstArr[0]tstArr[1]为掩码
  • tstOut[1]tstArr[0]的平均过滤器,tstArr[1]tstArr[2]为掩码
  • tstOut[2]tstArr[1]的平均过滤器,tstArr[2]tstArr[2]为掩码

同样,想要的结果在tstOut[1]

我希望这会对你有所帮助。