在Python中具有截止值的高斯滤波图像

时间:2018-08-07 13:39:22

标签: python python-2.7 image-processing imagefilter

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

有人知道怎么做吗?

1 个答案:

答案 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