我在2D中值滤波器(3x3窗口)中存在瓶颈,我在一组非常大的图像上使用,我想尝试优化它。我已经测试了scipy.ndimage
median_filter,以及PIL
,scipy.signal
和scikits-image
。然而,浏览SO我已经知道C中有一个快速的O(n)中值滤波器(恒定时间的中值滤波见Rolling median algorithm in C),我想知道我是否可以使用scipy在Python中实现它。 weave.inline?
关于替代路线的任何建议?
答案 0 :(得分:3)
试试这个: Rolling median in C - Turlach implementation
用法:
Mediator* m = MediatorNew(9);
for (...)
{
MediatorInsert(m, value);
median = MediatorMedian(m);
}
我相信这与R算法相同,但更干净(事实上令人惊讶)。
你可以包装它,或者移植它并使用Numba(或Cython)。我想我会推荐Numba而不是Cython,如果没有别的,因为是普通的旧python代码。
我建议将它添加到scikits中,如果它比scikits中的那个更快:)
答案 1 :(得分: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循环......
答案 2 :(得分:1)
我不知道基础算法,但scikits-image有rolling median filter。
否则,我建议用Cython(C / Python pidgin语言)编写它。请务必查看convolution example/tutorial以使用numpy数组。