2017-01-25 2 views
1

Я хочу выполнить 2D свертку на изображениях размером 600 X 400 с использованием фильтра 10 X 10. Фильтр не разделяется. scipy.signal.convolve2d работает хорошо для меня в настоящее время, но я ожидаю намного больших изображений в ближайшее время.Scipy convolve2d с подвыборкой, как Con2d от Theano?

Чтобы противостоять этому, у меня есть две идеи

  1. изменение размеров изображений
  2. подвыборки (или шагающие)?

Ориентируясь на субдискретизации части, Theano имеет функцию, которая делает свертка так же, как SciPy convolve2d см theano conv2d

Он также имеет возможность субдискретизации тоже. Но установка анано на окна была для меня болезненной. Как получить подвыборку с scipy.signal.convolve2d? Любые другие альтернативы (которые не требуют, чтобы я установил мне какую-нибудь тяжеловесную библиотеку)?

+1

Ваш фильтр будет расти с образами? В этом случае вы можете попробовать и посмотреть в [fftconovolve] (https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.fftconvolve.html), потому что IIRC в отличие от многих других программ для численных вычислений scipy doesn ' t используйте значение fft по умолчанию. Конечно, если ваш фильтр останется в 10x10, это не принесет вам многого, если вообще что-нибудь. –

+0

Мой фильтр останется прежним. Я действительно переехал в fftconvolve. И это действительно быстро (2X для моих целей). Однако у него тоже нет опции для подвыборки – GKS

+0

Я добавил некоторый код в A. Только 1d, я боюсь, но должен быть простым для обобщения. Взгляни. –

ответ

1

Вы можете реализовать подвыборку вручную, я просто набросаю 1d для простоты. Предположим, вы хотите отбирать s = d * f на регулярной подсерии с интервалом k. Тогда ваш n-й образец будет s_nk = sum_i = 0^10 f_i d_nk-i. Здесь нужно заметить, что индексы f и d всегда суммируются с кратным k. Это предполагает разбиение его на субавы s_nk = sum_j = 0^k-1 sum_i = 0^10/k f_j + ik d_-j + (n-i) k. Итак, что вам нужно сделать: subample d и f на сетках с интервалом k при всех смещениях 0, ..., k-1. Сверните все пары подвыборных d и f, смещения которых суммируются до 0 или k и добавляют результаты.

Вот код для 1d. Это примерно реализует вышеизложенное, только сетки расположены немного по-другому, чтобы упростить управление индексами. Вторая функция делает это глупо, т. Е. Вычисляет полную свертку и затем уничтожает. Он предназначен для тестирования первой функции.

import numpy as np 
from scipy import signal 

def ss_conv(d1, d2, decimate): 
    n = (len(d1) + len(d2) - 1) // decimate 
    out = np.zeros((n,)) 
    for i in range(decimate): 
     d1d = d1[i::decimate] 
     d2d = d2[decimate-i-1::decimate] 
     cv = signal.convolve(d1d, d2d, 'full') 
     out[:len(cv)] += cv 
    return out 

def conv_ss(d1, d2, decimate): 
    return signal.convolve(d1, d2, 'full')[decimate-1::decimate] 

Edit: 2d версия:

import numpy as np 
from scipy import signal 

def ss_conv_2d(d1, d2, decy, decx): 
    ny = (d1.shape[0] + d2.shape[0] - 1) // decy 
    nx = (d1.shape[1] + d2.shape[1] - 1) // decx 
    out = np.zeros((ny, nx)) 
    for i in range(decy): 
     for j in range(decx): 
      d1d = d1[i::decy, j::decx] 
      d2d = d2[decy-i-1::decy, decx-j-1::decx] 
      cv = signal.convolve2d(d1d, d2d, 'full') 
      out[:cv.shape[0], :cv.shape[1]] += cv 
    return out 

def conv_ss_2d(d1, d2, decy, decx): 
    return signal.convolve2d(d1, d2, 'full')[decy-1::decy, decx-1::decx] 
+0

Это интересно. Позвольте мне попробовать это. Я все еще не уверен, могу ли я получить 2D-версию, работающую – GKS

+0

Хорошо, это когда-то я сделал это для вас, см. Обновленный A. –

+0

Спасибо Павлу за ответ. На самом деле у меня работа 2D, но у вас немного быстрее. Я отмечу это принятое – GKS

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