如何仅通过减少峰值数据来进行低通滤波?

信息处理 图像处理 低通滤波器
2022-01-04 03:38:32

我有一个 2D 图像,我想用这些约束/质量指标对其进行低通滤波:

  1. 我不能向图像“添加”光,因此结果中的每个像素都应该是 <= 输入中的相应像素。
  2. 低通截止频率应该是一个参数,进行实验
  3. 重复应用此过滤器不应显着改变结果。
  4. 运行此算法所需的时间(5MPix 图像需要 5 分钟似乎是合理的)
  5. 最大限度地减少被过滤掉的光量。

以下是我尝试过的一些方法,以及它们的缺点:

  1. 像正常一样使用高斯滤波器,然后将结果拉低以符合约束 1。这非常符合前 3 点,但减少了不必要的光。

  2. 通过它们之间的“低”点和“向下”抛物线拟合“向上”抛物线以平滑。这在 1D 中效果很好,但首先水平应用它,然后垂直应用它会在 2D 中产生不好的结果。我的申请需要更长的时间,但不会太长。但是,重复应用此过滤器将极大地改变结果。如果 (1D) 输入是完美的“向下”抛物线(根本不应该被过滤),它将被位于开始/结束处的 2 个“向上”抛物线替换。

  3. 使用其他形式的二维“基本”函数和线性求解来找到最佳参数。这只是目前的一个想法,尚未实施/测试。

我在信号处理领域的经验几乎完全是图像处理,因此我希望通过活跃于信号处理其他领域的专家的意见,找到解决这个问题的方法。

更新 2011/08/18

根据当前的反应,我决定通过添加典型输入的图表以及我最初描述的 3 种方法的结果以及我迄今为止收到的建议来使事情更加清晰。为了便于比较,我在这些示例中仅使用了一维过滤。

输入数据: 输入数据

高斯滤波器+ 将其降低以符合要求(1)。
您可以看到,将其降低会导致右侧不必要的光线减少。 高斯滤波

抛物线
就我而言,这非常出色,遗憾的是它并不能通过先应用水平,然后应用垂直来完美地转换为 2D。在这种情况下,您还可以看到我可以在浮点分辨率中评估拟合的抛物线,这是一个小好处,但不是绝对必需的。 抛物线拟合

灰度侵蚀
根据rwong的建议,我尝试了灰度侵蚀。我使用了与我的“拟合”抛物线具有相同抛物线形状的结构元素。结果几乎完全相同,因此看起来很有希望。但是,仍然存在一些问题: 1. 我的结构元素不够“大”(虽然它已经是 801 像素宽) 1. 我只有“向上”抛物线,没有“向下抛物线”来平滑从一条抛物线过渡到下一个。 灰度侵蚀

中值过滤
仅出于完整性考虑,这并不是我真正想要的。 中值滤波器

原始数据
我将原始输入数据 + 各种 python 命令粘贴到 pastebin 中,因此您也可以尝试使用相同的数据。
http://pastebin.com/ASnJ9M0p

3个回答

您的尝试#2 确实有一个 2D 版本 - 它在理论上是相似的,但它不能分解为两个 1D 操作。请阅读“二维灰度形态过滤”。它比曲线拟合更快。

如果您尝试去除斑点,中值过滤也可能很有用。中值滤波的更高级形式是“序数滤波”。

在所有情况下,通过在输出和输入之间取像素最小值,可以很容易地满足要求 #1。这是一个重要的质量标准,但它不会限制算法的选择。


高斯滤波(和许多其他有用的过滤器)可以被分解(首先从 2D 到 1D 操作,然后通过傅里叶变换),但是还有许多其他有用的图像处理技术是不可分解的,这使得它们变慢但不会减少它们的用处。

我建议使用平滑样条。

以下是如何使用 Matlab 和来自 Matlab File Exchange 的强大的样条平滑函数SMOOTHN(其中包含完整的源代码,以便您可以在需要时在其他地方重新实现它)来执行此操作。请注意,它也适用于 n 维数据:

%# - get inputlist from pastebin

%# - smoothen data. Lower factor means less smooth
smoothingFactor = 1000;
smoothData = smoothn(inputlist,smoothingFactor);

%# - shift down
smoothData = smoothData - max(inputlist-smoothData);

%# - show results
plot(inputlist,'b'),hold on,plot(smoothData,'r')

在此处输入图像描述

确保滤波后的信号始终大于(或小于)原始信号的一种简单方法是使用移动的最大值(或分别为最小值)窗口,然后使用具有相同支持和 DC 单位增益的非负滤波器。换句话说,您可以首先使用平面结构元素执行灰度膨胀,然后使用相同大小的常规模糊核对结果进行过滤。

膨胀过程将强制模糊支持内的所有点至少与原始点一样大(或小),因此模糊值将至少(或最多)与原始点乘以 DC 一样大模糊的增益(我们通过设计将其设置为统一)。另一方面,与纯膨胀相比,结果会更平滑,并且通常更接近原始图像,因为模糊会使膨胀产生的平坦区域变得平滑。

如果在 CPU 上实现,那么在一维情况下,矩形移动最大/最小窗口可以构造为二叉树,其中叶子就像一个循环缓冲区,具有O(logN)窗口大小为 N 的更新每个样本的成本。在矩形支持的情况下,操作是可分离的。模糊也可以选择为可分离的。

现在,我不知道这在应用于图像时实际上是什么样子,但基本技术在计算用于音频的砖墙前瞻限制的包络的上下文中是众所周知的,并且对 2D 的扩展相当简单。我知道这是一个老问题,但认为它可能仍然很有趣。

这是一个(可笑的低效;这只是为了看看它的外观)Shadertoy 实现: https ://www.shadertoy.com/view/3ttcDM (包括首先进行水平扩张+模糊,然后垂直扩张+模糊的变体)