5

我在一组非常大的图像上使用的 2D 中值滤波器(3x3 窗口)存在瓶颈,我想尝试优化它。我已经测试scipy.ndimage了 median_filter 以及PIL,scipy.signalscikits-image. 但是,在 SO 中浏览时,我了解到 C 中有一个快速 O(n) 中值过滤器(Constant Time 中的中值过滤参见 C 中的滚动中值算法),我想知道是否可以使用 scipy 在 Python 中实现它。编织.内联?关于替代路线的任何建议?

4

3 回答 3

3

试试这个: C - Turlach 实现中的滚动中位数

http://ideone.com/8VVEa

用法:

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

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

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

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

于 2014-06-01T10:56:44.207 回答
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 循环......

于 2012-04-02T13:26:30.887 回答
1

我不知道底层算法,但 scikits-image 有一个滚动中值滤波器

否则,我建议用Cython(C/Python pidgin 语言)编写它。请务必查看使用 numpy 数组的卷积示例/教程

于 2012-03-26T15:17:35.207 回答