【问题标题】:Gaussian filtering image with a cut-off value in pythonpython中具有截止值的高斯滤波图像
【发布时间】:2018-11-03 02:54:38
【问题描述】:

我有一些基本上被 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 在位于中心位置 [25:75, 25:75] 的子正方形 50x50 中生成一个 100x100 数组,其中包含非零值。

当我应用过滤器时,非零值的数量随着位置 [5:96, 5:96] 的增加而增加。

我希望它以某种方式掩盖零值而不在那里应用过滤器,过滤器必须仅在 50x50 子正方形中应用。

我尝试使用 numpy 掩码数组,但没有成功。

有人知道怎么做吗?

【问题讨论】:

  • 您是要忍受 0 还是 0,还是希望 0 完全不影响过滤结果?
  • @CrisLuengo 我希望它们完全不影响过滤结果

标签: python python-2.7 image-processing imagefilter


【解决方案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

【讨论】:

    猜你喜欢
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2020-08-02
    • 1970-01-01
    相关资源
    最近更新 更多