使用PIL和Numpy的Python图像滤波太慢

0 投票
2 回答
3412 浏览
提问于 2025-04-16 13:56

我正在用Python的PIL和Numpy实现一个最简单的高斯滤波器。现在一切都能正常工作,但速度非常慢 :( 我不知道怎么才能加快速度。你能帮帮我吗?

import os, sys  
import Image, ImageEnhance  
import numpy as np  

if (len(sys.argv) > 1):  
    im = Image.open(sys.argv[1])  
    data = np.array(im.resize((200,200)))  
    out_data = np.array(data)  
    chs = len(data[0][0])  
    kernel = np.array([[1.,2,1],  
                       [2,3,2],  
                       [1,2,1]])  
    ctr = 1  
    kernel = kernel/np.sum(kernel)  
    for x in xrange(data.shape[0]):  
        for y in xrange(data.shape[1]):  
            for c in xrange(chs):  
                acc = 0  
                for i in xrange(kernel.shape[0]):  
                    for j in xrange(kernel.shape[1]):  
                        m = x + i - ctr  
                        n = y + j - ctr  
                        if (m >= 0 and n >= 0 and m < data.shape[0] and n < data.shape  [1]):
                            acc += data[m][n][c]*kernel[i][j]  
                out_data[x][y][c] = acc  
    out = Image.new(im.mode, (data.shape[0], data.shape[1]))  
    out = Image.fromarray(out_data)  
    out.show()  
else:  
    print "no file was passed"  

2 个回答

0

你有没有试过分析一下这个程序的运行情况?如果你能找到大部分时间都花在哪里了,就会更清楚该集中精力优化哪些部分。

这里有些地方看起来可以并行处理,你可能想考虑使用多线程或多进程来加速这些部分,这取决于大部分时间是花在执行Python代码上(在GIL中),还是在使用numpy时(在GIL外)。

1

看看这个问题的回答:这里

高斯模糊滤镜是可以分开的,这意味着你可以大大简化你的算法(除了参考其他回答中的建议,比如并行处理)。

撰写回答