【问题标题】:Using scipy.weave.inline for fast 2D median filtering使用 scipy.weave.inline 进行快速 2D 中值滤波
【发布时间】:2012-04-09 18:11:09
【问题描述】:

我在大量图像上使用的 2D 中值滤波器(3x3 窗口)存在瓶颈,我想尝试优化它。我测试了scipy.ndimage median_filter,以及PILscipy.signalscikits-image。但是,在 SO 中浏览时,我了解到 C 中有一个快速 O(n) 中值过滤器(Constant Time 中的中值过滤参见Rolling median algorithm in C),我想知道是否可以使用 scipy.weave 在 Python 中实现它。排队 ? 有什么替代路线的建议吗?

【问题讨论】:

  • 我有一个用于 Perreault + Hebert 的 cython 包装器,在某个地方进行恒定时间的中值过滤——但这对于 3x3 来说太过分了,最好做一个排序网络,25 个比较中有 9 个输入。输入是 0..255 还是什么?
  • 您只想处理您的图像集吗? OpenCV 是替代路线吗? medianBlure 也许?您还拥有 CUDA 和 OpenCl 实现。
  • 大部分代码框架已经在python中,小部分在matlab中,最好用python实现这部分代码。
  • @natan OpenCV 的大部分功能都有一个不错的 Python 接口。例如。来自文档:Python:cv2.medianBlur(src, ksize[, dst]) → dst
  • @eickenberg,我猜你是对的,它的意思是线性的,所以 O(n) 是正确的写法吗?

标签: python image-processing scipy filtering median


【解决方案1】:

我不知道底层算法,但是 scikits-image 有一个rolling median filter

否则,我建议用Cython(C/Python pidgin 语言)编写它。请务必查看 convolution example/tutorial 以了解如何使用 numpy 数组。

【讨论】:

  • 谢谢,我会调查的。另外,写 3x3 我的意思是中间窗口大小是 3x3,它使用的实际图像是百万像素大。
  • 嗯,scikits 似乎比 PIL 和 scipy.ndimage 还要慢。不幸的是,我处理的图像是 16 位的,所以 0..255 选项不相关。下一个 Cython...
【解决方案2】:

如果您仍然感兴趣,我会尝试 numpy 的重塑和中位数:

a= some big array
a.reshape(N,3,3) #N being specific to your array
[numpy.median(m) for m in a]

我不知道这与您的 testet 方法相比如何扩展,但如果您想使用 C 进行优化,您可以在列表理解中固定 for 循环...

【讨论】:

  • 这很优雅,但不幸的是它计算了每个不重叠的 3x3 的中值,而不是每个可能的 3x3 的中值。
【解决方案3】:

试试这个: Rolling median in C - Turlach implementation

http://ideone.com/8VVEa

用法:

Mediator* m = MediatorNew(9);
for (...)
{
      MediatorInsert(m, value);
      median = MediatorMedian(m);
}

我相信这与 R 算法相同,但更简洁(事实上,令人惊讶的是)。

您可以包装它,也可以移植它并使用 Numba(或 Cython)。如果没有别的,我想我会推荐 Numba 而不是 Cython,因为它普通的旧 python 代码。

如果它的运行速度已经比 scikits 中的快,我建议将它添加到 scikits 中:)

【讨论】:

  • 感谢 Alex,我还没有尝试过,但看起来很有希望。
猜你喜欢
  • 2016-06-05
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 2017-06-19
  • 1970-01-01
  • 2012-05-07
相关资源
最近更新 更多