截止值在 python 的高斯滤波图像

Gaussian filtering image with a cut-off value in python

我有一些数据基本上被 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 掩码数组,但它没有用。

有人知道怎么做吗?

高斯滤波是局部加权平均。如果你想调整权重使得某些像素(选定区域之外的像素)不用于计算其他像素的平均值,你需要使用归一化卷积:

( (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