我想在2维阵列上应用3x3或更大的图像滤镜(高斯或中值)。
虽然有几种方法可以做到这一点,例如scipy.ndimage.gaussian_filter
或应用循环,但我想知道是否有办法在mxn
数组的每个像素上应用3x3或更大的滤镜同时,因为它可以节省很多时间绕过循环。可以使用函数式编程吗?
有一个名为scipy.ndimage.filters.convolve
的模块,请告诉它是否能够同时执行操作。
答案 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中并行处理的有用链接,但在访问相同的数据结构时要小心,例如同时具有多个线程的数组。如果你没有同步线程,他们可能会同时访问阵列的同一部分并搞砸了 请注意,可以有效并行运行的线程数量受处理器内核数量的限制。