Как эффективнее реализовать корреляцию? - PullRequest
0 голосов
/ 21 сентября 2019

Целью здесь является реализация операции свертки для изображения с использованием numpy.

Я пытался реализовать функцию свертки с опциями заполнения.Тем не менее, мой код использует два for loops для обхода строк и столбцов.Таким образом, чрезвычайно медленная обработка больших файлов изображений.

def correlate(I, h, pad):
    top, bottom, left, right = pad
    tmp = zero_padding(I, top, bottom, left, right)

    print("padded shape:", tmp.shape)
    max_dim = max(len(tmp.shape), len(h.shape))
    while len(tmp.shape) < 3:
        tmp = tmp[..., np.newaxis]
    while len(h.shape) < 3:
        h = h[..., np.newaxis]

    if h.shape[-1] < I.shape[-1]:
        if (I.shape[-1] == 3) & (h.shape[-1] == 1):
                h = np.dstack([h,h,h])
        else:
            raise ValueError('dimension mismatch')  

    new_hight = tmp.shape[0] - h.shape[0] + 1
    new_width = tmp.shape[1] - h.shape[1] + 1
    result = np.ones((new_hight, new_width, tmp.shape[-1]))

    for ver in range(new_hight):
        for hor in range(new_width):
            block = get_block(tmp, h, ver, hor)
            mix = np.sum(np.sum(block*h, axis=0), axis=0)
            result[ver, hor] = mix
    return result

Обработка моих (5000, 4000, 3) изображений заняла целую вечность.

1 Ответ

0 голосов
/ 21 сентября 2019

Учить реализовывать подобные вещи самостоятельно.Но главное, что вы узнаете, это то, что действительно (а) охватить граничные случаи и (б) сделать это быстро.

Возможно, вы захотите попробовать функции корреляции и свертки в scipy.signal.Например:

import numpy as np
from scipy.signal import correlate, convolve

a = np.random.random((100, 100, 3))
b = np.random.random((100, 100, 3))

corr = correlate(a, b, mode='same')
conv = convolve(a, b, mode='same')

Вы можете передать аргумент method, чтобы сделать это в частотной области, или есть также fftconvolve() (который использует method='fft').Возможно, вы захотите выбрать время для обоих вариантов, потому что любой из них может быть быстрее, в зависимости от ваших данных.

...