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


16

我有一个2D图像,我要对其进行低通滤波,并具有以下约束/质量指标:

  1. 我无法向图像“添加”光线,因此结果中的每个像素应<=输入中的相应像素。
  2. 低通截止频率应作为参数进行实验
  3. 重复应用此过滤器不应显着改变结果。
  4. 运行该算法所需的时间(5MPix图像需要5分钟)
  5. 尽量减少被滤除的光量。

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

  1. 像正常情况一样使用高斯滤镜,然后将结果下拉以符合约束1。这与前3个点非常吻合,但比所需的光要少得多。

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

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

我在信号处理方面的经验几乎仅限于图像处理,因此我希望在信号处理其他领域活跃的专家的帮助下找到解决此问题的替代方法。

更新2011/08/18

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

输入数据: 输入数据

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

抛物线
对我而言,这是非常出色的,可悲的是,它不能通过首先应用水平然后垂直来完美地转换为2D。在这种情况下,您还会看到我可以以浮点分辨率评估拟合的抛物线,这虽然不大,但却不是绝对必要的。 抛物线拟合

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

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

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


1
您能否进一步说明限制1和5?他们似乎(乍一看)是矛盾的。
Peter K.

我可能会误解“此算法”的含义,但是应用低通滤波器需要5分钟5 MP。
2011年

Answers:


8

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

如果您要去除斑点,中值过滤可能也很有用。中值过滤的更高级形式是“常规过滤”。

在所有情况下,只要在输出和输入之间采用像素最小即可满足要求#1。这是重要的质量标准,但它不会限制算法的选择。


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


您好,感谢您提出灰度形态过滤的指针。维基百科上的描述似乎很有趣,我将对此进行调查。但是,在指向OpenCV文档的链接中,我仅看到普通的形态过滤器,而不是灰度过滤器。我将最终选中此选项,并让您知道结果。谢谢。
Pieter-Jan Busschaert 2011年

6
rwong关于中值滤波的建议是否有帮助?通过提供数据的简单示例和要获取的数据的“虚假”示例,进一步说明您要实现的目标可能会有所帮助。
Peter K.

我用示例数据和各种建议的结果更新了我的问题。我希望现在情况会更加清楚。
Pieter-Jan Busschaert 2011年

2

我建议使用平滑样条。

这是使用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')

在此处输入图片说明


感谢您的建议,我会进行调查。从您的图表看来,我需要比您的示例更高的smoothingFactor。x = 700周围的陡峭边缘不会被移除,并且将清晰可见。同样,x = [0,400]中的初始凸点也不会完全消除。您是否不认为这会与其他任何方法(低通滤波器+下移)存在相同的问题?您可以看到两个图形之间的全局偏移量,当我使用更高的smoothingFactor时,该偏移量甚至可能会增加。
Pieter-Jan Busschaert 2011年

@ Pieter-JanBusschaert:哦,我认为第一个高峰对您有用。无论如何,所有的低通滤波器+向下移都将在650左右的陡峭上升时遇到困难:它们会使该部分更平坦,因此曲线必须向下移动很多。中值过滤器后跟平滑样条线会有所帮助。
乔纳斯(Jonas)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.