Python:同时对2-d阵列的每个像素执行操作

时间:2012-10-19 06:20:45

标签: python image filter numpy scipy

我想在2维阵列上应用3x3或更大的图像滤镜(高斯或中值)。

虽然有几种方法可以做到这一点,例如scipy.ndimage.gaussian_filter或应用循环,但我想知道是否有办法在mxn数组的每个像素上应用3x3或更大的滤镜同时,因为它可以节省很多时间绕过循环。可以使用函数式编程吗?

有一个名为scipy.ndimage.filters.convolve的模块,请告诉它是否能够同时执行操作。

2 个答案:

答案 0 :(得分:2)

您可能想了解Python中的并行处理: http://wiki.python.org/moin/ParallelProcessing 或特别是multiprocessing包: http://docs.python.org/library/multiprocessing.html

在多处理器上使用Python Imaging Library(PIL)进行检查。 Using multiprocessing with the PIL 和类似的问题。

您可以创建四个工作人员,将您的图像分成四个,并将每个象限分配给一个工人。但是,您可能会浪费时间来节省开销。另一方面,如果您要处理多个图像,那么这种方法可能会起作用(让每个工作人员打开自己的图像)。

答案 1 :(得分:1)

即使python确实提供了将操作应用于NxM阵列而不进行循环的功能,因此操作仍然不会在后台同时执行,因为CPU每个周期可以处理的指令数量是有限的,因此没有时间可以保存。对于你的用例,这可能会适得其反,因为你的数组中的字段可能具有依赖性,如果你不知道它们被访问的顺序,那么很可能最终会出现问题。

Hugues提供了一些关于Python中并行处理的有用链接,但在访问相同的数据结构时要小心,例如同时具有多个线程的数组。如果你没有同步线程,他们可能会同时访问阵列的同一部分并搞砸了 请注意,可以有效并行运行的线程数量受处理器内核数量的限制。