我有一些基本上被0值包围的数据,我想对不覆盖零的非零值应用高斯滤波器。
这是MWE:
import numpy as np
import scipy.ndimage as ndimage
import matplotlib.pyplot as plt
import random
data = np.zeros((100, 100))
for i in range(25, 76, 1):
for j in range(25, 76, 1):
data[i, j] = random.random()
data2 = ndimage.gaussian_filter(data, sigma=5.0)
fig1 = plt.figure("data")
ax = fig1.add_subplot(111)
cf1 = ax.contourf(data)
fig1.colorbar(cf1)
fig1 = plt.figure("data2")
ax = fig1.add_subplot(111)
cf1 = ax.contourf(data2)
fig1.colorbar(cf1)
抱歉,我不知道为什么,但是我无法上传MWE的结果。
MWE产生一个100x100的数组,该数组在位于中心[25:75,25:75]的子正方形50x50中具有不为零的值。
应用过滤器时,非零值的数量会随着位置[5:96,5:96]的增加而增加。
我想要以某种方式掩盖零值并且不在此应用滤镜,必须仅在50x50子正方形中应用滤镜。
我尝试使用numpy掩码数组,但是没有用。
有人知道怎么做吗?
答案 0 :(得分:1)
高斯滤波是局部加权平均。如果要调整权重以使某些像素(在选定区域之外的像素)不用于计算其他像素的平均值,则需要使用归一化卷积:
( (f . m) * g ) / ( m * g )
其中f
是图像,m
是具有0值的不使用像素的掩码,g
是高斯核,*
是卷积
使用您的代码,它将实现为:
data = np.zeros((100, 100))
mask = np.zeros((100, 100))
for i in range(25, 76, 1):
for j in range(25, 76, 1):
data[i, j] = random.random()
mask[i, j] = 1
data2 = ndimage.gaussian_filter(data * mask, sigma=5.0)
data2 /= ndimage.gaussian_filter(mask, sigma=5.0)
这将使每个输出像素仅包含蒙版图像中具有1的像素的加权平均值。但是,零像素仍然会得到一个值。现在,您需要掩盖那些:
data2[np.logical_not(mask)] = 0