У меня есть набор очень больших фильтров (всего 9015, каждый 910 x 910), которые я хотел бы применить к некоторым конкретным точкам на изображении (<10000).В основном, причина очень большого размера этих фильтров состоит в том, что каждый фильтр предназначен для применения только к одной точке, но все же учитывает целостность изображения.Математика того, что я хотел бы сделать (применение фильтров / свертки), довольно проста (то есть поэлементное умножение изображения на фильтр, а затем поэлементная сумма в каждом измерении). Ниже приведена реализацияЯ написал на python и numpy (где <code>... указывает на некоторую область в памяти для сохранения результата):
for q in range(3): # A variable to iterate through the color channels, given that the filters are only 2 dimensional
for i in range (len(filters)):
... = np.floor(np.sum(np.sum(filters[:,:,i] * img[:,:,q], axis = 1), axis = 0) + 0.5)
# Note that filters[:,:,i] selects the correct filter for the current given point
Но на моей довольно мощной машине это занимает очень много времени (порядка 280 секунд.) Учитывая это, я пытался использовать библиотечные функции для ускорения работы (потому что я предполагаю, что они высоко оптимизированы), но что-то вроде (с теми же примечаниями, что и здесь, повторно примененными)
for q in range(3):
for i in range (len(filters)):
... = scipy.ndimage.convolve(img[:,:,q], filters[:,:,i]))
не очень помогает.(Я даже не смог рассчитать время. Это почти наверняка, потому что количество вычислений, которые здесь нужно сделать, на намного выше, потому что оно вычисляет значения ячеек в каждой точке изображения с чрезвычайно большим фильтром.На данный момент я ищу способы ускорить это, и я все еще верю, что библиотечная функция - правильный путь.Если бы была функция, которая выполняла свертку в одной точке, или, как я упоминал в заголовке, применение фильтра в одной точке, я мог бы пройтись по меньшему количеству точек интереса (а не по всему изображению), вызвав этоФункция библиотеки в каждой из этих точек.Или есть какая-то функция, которая принимает набор индексов для запуска свертки?Или, может быть, есть способ изменить данные таким образом, чтобы функции свертки библиотеки выполнялись только в определенных точках?
Есть ли в python, numpy, scipy и т. Д. Функции, обладающие такой функциональностью?