我有一个2D图像,我要对其进行低通滤波,并具有以下约束/质量指标: br />应<=输入中相应的像素。
低通截止频率应作为参数,以进行实验
反复应用此滤波器不应明显改变结果。
/>运行此算法所需的时间(5MPix图像需要5分钟)
将滤除的光量减至最少。以及它们的缺点:像普通​​的高斯滤波器一样,然后将结果下拉以符合约束1。这与前3个点非常吻合,但比
通过它们之间的“低”点和“向下”抛物线拟合“向上”抛物线以使其平滑。这在1D中效果很好,但是首先在水平方向应用它,然后在垂直方向应用它会在2D中产生不好的结果。对于我的应用程序,它需要花费更长的时间,但不会太长。但是,重复应用此过滤器将大大改变结果。如果(1D)输入是完美的“向下”抛物线(根本不应该被过滤),它将由位于开始/结束处的2个“向上”抛物线代替。
使用某些其他形式的2D “基本”函数和线性求解可找到最佳参数。这只是一个想法,目前尚未实现/测试。

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

更新2011/08/18

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

输入数据:


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


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


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


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


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

评论

您能否进一步说明限制1和5? (乍看起来)它们是矛盾的。

我可能会误解“此算法”的含义,但是对于5 MP来说5分钟对于应用低通滤波器来说似乎很多。

#1 楼

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


http://opencv.willowgarage.com/documentation/image_filtering.html
http://en.wikipedia.org/wiki/ Dilation_(morphology)

如果您要去除斑点,中值过滤也可能很有用。中值滤波的一种更高级形式是“常规滤波”。在所有情况下,通过在输出和输入之间采用像素级最小值,可以轻松满足要求#1。这是一个重要的质量标准,但它不会限制算法的选择。


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

评论


$ \ begingroup $
嗨,谢谢您对灰度形态过滤的指导。维基百科上的描述似乎很有趣,我将对此进行调查。但是,在指向OpenCV文档的链接中,我仅看到普通的形态过滤器,而不是灰度过滤器。我将最终选中此选项,并让您知道结果。谢谢。
$ \ endgroup $
– Pieter-Jan Busschaert
11年8月17日在7:50

$ \ begingroup $
rwong关于中值滤波的建议是否有帮助?通过提供数据的简单示例和要获取的数据的“虚假”示例,进一步说明您要实现的目标可能会有所帮助。
$ \ endgroup $
– Peter K.♦
11年8月17日在10:03

$ \ begingroup $
我用示例数据和各种建议的结果更新了我的问题。我希望现在情况会更加清楚。
$ \ endgroup $
– Pieter-Jan Busschaert
11年8月18日在13:36

#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')




评论


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



$ \ begingroup $
@ Pieter-JanBusschaert:哦,我认为第一个高峰对您有用。无论如何,所有的低通滤波器+向下移都将在650左右的陡峭上升时遇到困难:它们会使该部分更平坦,因此曲线必须向下移动很多。中值过滤器后跟平滑样条线会有所帮助。
$ \ endgroup $
–乔纳斯(Jonas)
2011年11月5日,下午2:53

#3 楼

确保滤波后的信号始终大于或小于原始信号的一种简单方法是使用移动的最大(或最小)窗口,然后使用具有相同支持和直流增益的非负滤波器。 br />换句话说,您可以先使用平面结构元素执行灰度扩展,然后使用相同大小的常规模糊核对结果进行过滤。
扩展过程将迫使所有点都位于模糊至少要与原始点一样大(或小),因此模糊值至少(或最多)与原始点乘以模糊的DC增益(我们将其设置为1)设计)。另一方面,与纯膨胀相比,结果将更平滑,并且通常更接近原始膨胀,因为模糊会平滑由膨胀创建的平坦区域。
如果在CPU上实现,则在一维情况下矩形移动的最大/最小窗口可以构造为二叉树,其中叶子像圆形缓冲区一样工作,窗口大小为N时每个样本的更新成本为$ O(\ log N)$。在矩形支撑的情况下操作是可分离的。模糊也可以选择为可分开的。音频和2D扩展很简单。我知道这是一个古老的问题,但想想它可能仍然很有趣。 com / view / 3ttcDM(包括先进行水平扩张+模糊处理,然后进行垂直扩张+模糊处理的变体)