2016-08-24 5 views
0

я делаю простой гаусс размытия, и так как я не мог сделать свертку работу SciPy, я сделал свой собственный:Мой гс фильтр слишком медленно

def Convolve(matr_, ker_): 
    output = matr_.astype(np.float64) 
    for x in range(len(matr_)): 
     for y in range(len(matr_[x])): 
      sum = 0 
      count = 0 
      width = int(len(ker_)/2) 
      for x_c in range(len(ker_)): 
       for y_c in range(len(ker_)): 
        x_index = x - x_c + width 
        y_index = y - y_c + width 
        if (x_index >= 0) and (x_index < len(matr_)) and (y_index >= 0) and (y_index < len(matr_[x])): 
         sum += ker_[x_c][y_c] * matr_[x_index][y_index] 
         count += ker_[x_c][y_c] 
        else: 
         #print("{0} -> {1}, {2} -> {3}".format(x, x_index, y, y_index)) 
         pass 
      output[x][y] = sum/count 
    return output.astype(matr_.dtype) 

Я также нормализуют пикселей здесь, так что они будут по-прежнему всегда подходит для matr_. Но он работает очень медленно, для работы с изображением 1440x900 требуется примерно 20 секунд. Как это можно сделать, чтобы работать быстрее?

+0

Вы можете использовать 'scipy.ndimage.gaussian_filter': http://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.gaussian_filter.html –

+0

@WarrenWeckesser Я хочу попробовать написать собственное. – RomaValcer

ответ

0

Вы никогда не должны использовать циклы в Python, если вы можете избежать этого. Используйте Numpy или Pandas и работайте над векторами.

Если у вас есть, чтобы использовать циклы (что не похоже на ваш пример), используйте пакет Numba.

+0

Как бы вы положили свертку в терминах векторов? – RomaValcer

Смежные вопросы