Фильтрация изображений Python с PIL и Numpy слишком медленная - PullRequest
0 голосов
/ 18 марта 2011

Я пытаюсь реализовать простейший фильтр Гаусса в 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 ]

1 голос
/ 18 марта 2011

Посмотрите ответы на этот вопрос здесь .

Фильтры размытия по Гауссу разделимы, что означает, что вы можете немного уменьшить сложность своего алгоритмав предложениях из других ответов, т.е. распараллеливание).

0 голосов
/ 18 марта 2011

Вы пробовали это профилировать? Если вы обнаружите, где вы проводите большую часть своего времени, будет более очевидно, где сосредоточиться на оптимизации.

Части этого выглядят смущающе паррально, возможно, вы захотите использовать для них многопоточность или многопроцессорность, в зависимости от того, сколько времени тратится на выполнение python в GIL или просто за его пределами.

...