在 Numpy 掩码数组上使用 scipy ndimage 函数

问题描述

我想对二维数组应用一些图像过滤器,但我希望过滤器忽略某个值,例如 0,因为它代表 Nan。为简单起见,这是我的数组之一:

array([[ 0.,0.,4.,19.,7.,9.,6.],[ 0.,3.,13.,1.,16.,17.,17.],2.,12.,8.,15.,4.],11.,10.,18.],6.,5.,8.],[17.,14.,[ 9.,18.,10.],[18.,4.]])

形状 = 8,9。

这是我想对非零值应用的过滤器:

def lee_filter(img,size):
    img_mean = uniform_filter(img,(size,size))
    img_sqr_mean = uniform_filter(img**2,size)) #from scipy.ndimage.filters
    img_variance = img_sqr_mean - img_mean**2

    overall_variance = variance(img) #from scipy.ndimage.measurements

    img_weights = img_variance / (img_variance + overall_variance)
    img_output = img_mean + img_weights * (img - img_mean)
    return img_output

让我们关注第一个函数

uniform_filter(img,size)) #size=3

我假设为了将函数应用于非零值,我需要屏蔽它们。

y = np.ma.masked_where(img== 0,img)

>>> masked_array(
  data=[[--,--,4.0,19.0,7.0,9.0,6.0],[--,3.0,13.0,1.0,16.0,17.0,17.0],2.0,12.0,8.0,15.0,4.0],11.0,10.0,18.0],6.0,5.0,8.0],[17.0,14.0,[9.0,18.0,10.0],[18.0,4.0]],mask=[[ True,True,False,False],[ True,[False,False]],fill_value=1e+20)

当我申请时:

uniform_filter(y,(3,3))

我得到了与申请相同的结果:

uniform_filter(img,3))

>>>array([[ 2.11111111,2.44444444,3.88888889,2.77777778,8.44444444,10.66666667,13.55555556,10.77777778,10.33333333],[ 2.33333333,5.66666667,5.33333333,10.44444444,11.22222222,10.55555556],[ 4.11111111,9.77777778,8.33333333,8.88888889,9.88888889,11.55555556,12.44444444,13.        ],[ 2.66666667,5.44444444,7.66666667,10.11111111,9.66666667],[ 7.,7.22222222,7.55555556,7.77777778,10.33333333,12.66666667],[ 7.66666667,6.55555556,8.22222222,8.55555556,11.88888889,12.55555556,11.33333333],[11.,8.77777778,4.77777778,6.11111111,7.44444444,10.55555556,12.11111111,11.        ],[10.44444444,3.11111111,4.55555556,6.88888889,9.66666667,7.44444444]])

我想忽略零,以便返回的数组将有零,其中零位于首位,并且所有计算都应仅应用于非零值

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)