如何从图像中的连续路径中过滤噪声

信息处理 图像处理 过滤器 过滤器设计 图片
2022-02-23 22:04:43

问题陈述

数据集

在上面的数据集中,您可以注意到一条连续的路径,然后是 x 轴上 320-400 左右的噪声带。我希望能够应用一个滤波器来放大连续路径,同时抑制噪声带。噪声带内的数据是无用的。

尝试 1

我是信号处理的新手,但我尝试设计自己的滤波器。我尝试设计一个最小过滤器。我将其定义为使输出信号 $ S $ 成为输入信号 $ F $ 中下一个 $ w $ 项中的最小值: $ S[n] = \min \{F[x] | x \in \{n, n+1, n+2, ..., n+w\}\} $

for i in range(len(original_signal) - window_len):
    filtered_signal[i:i+window_len] = min(original_signal[i:i+window_len])

它通过区域中的最低像素表示每个像素,这应该使噪声消失,因为噪声带在很多高值之间会有很多低值。它也消耗了太多的信号。

这是一张显示滤波器带走的图像(原始信号和滤波信号之间的差异)

在此处输入图像描述

尝试 2

中值滤波器不起作用,因为噪声带的中值相对较高(1e4):

噪声带直方图

而空白空间的中位数不是那么高(1e3):

空空间直方图

因此,中值滤波器不会将噪声降低到与空白空间相同的程度。

你知道我可以尝试任何过滤器吗?

附加数据

所需信号的直方图:

信号直方图

所有直方图归一化并放在相同的轴上:

在此处输入图像描述

3个回答

所以熵滤波器听起来不错,但它并没有真正起作用,因为即使在调整窗口之后,实际信号也被认为是高熵的。

我所做的是对时间轴(从左到右)中的所有数据进行导数。然后我限制了最大值。然后我整合了导数。

deriv = data[i, 1:] - data[i, :-1]
deriv[deriv > max_] = max_

导数是$ \frac{dy}{dx }$。在我看来 dy 是垂直线段, dx 是水平线段。把它们放在一起形成一个直角三角形,其中函数是斜边是 f,水平边是 dx,垂直边是 dy。因此 $ tan^{-1} {\frac{dy}{dx}} $ 是 f 的仰角。在我看来,在导数上设置最大值就像在 f 上设置最大角度。这就像说,“限制 f 的仰角。如果它与地平线的角度超过 150 度,则将其变小。”

它似乎工作。它限制了信号的最大仰角。您可以看到原始信号(红色)和导数滤波后的信号(绿色)。 时间方向的微分滤波器

然后我将原始信号减去应用于原始信号的导数滤波器。这让我只剩下噪声带,我可以放大、模糊然后减去它。

噪声带 好数据

免责声明:我在胡乱猜测。

我会尝试一种双边过滤器。在每个像素周围的补丁(大小取决于您的图像大小)中,评估您应该在噪声带之外具有显着更高的熵,因此如果熵低于某个阈值,您可以简单地在该特定像素上使用最小滤波器。

这种方法的问题在于,python 中的幼稚实现会有些慢。你可能不得不使用 Cython、Numba 或类似的东西来实现。

编辑:或者您可以简单地使用scikit-image中的熵过滤器。

我认为在噪声带中没有任何东西可以恢复。我在 GIMP 中对你的图像做了几件可怕的事情,在任何情况下都没有任何可见的东西表明那里有你的任何信号。

如果你看,你会看到噪音带有一种重复的绿色调——从上到下,你会看到噪音的部分,那里有更多的绿色。乍一看似乎与信号相连,但如果仔细观察,会发现有一个绿色部分,没有对应的信号。

您可能会从原始信号中做得更好,但我认为您不会从图片中得到任何东西。