Есть ли Python-эквивалент функции conv2 в MATLAB? - PullRequest
6 голосов
/ 17 сентября 2010

Имеет ли Python или любой из его модулей функцию MATLAB conv2 ? В частности, меня интересует то, что выполняет те же вычисления, что и conv2(A, B, 'same') в MATLAB.

Ответы [ 4 ]

4 голосов
/ 17 сентября 2010

Похоже, scipy.signal.convolve2d - это то, что вы ищете.

3 голосов
/ 13 июля 2016

Хотя в других ответах уже упоминается scipy.signal.convolve2d в качестве эквивалента, я обнаружил, что результаты при использовании mode='same'.

отличаются, в то время как conv2 в Matlab приводит к появлению артефактов в нижней и правой частиimage, scipy.signal.convolve2d имеет одинаковые артефакты в верхней и левой частях изображения.

См. эти ссылки для графиков, показывающих поведение (недостаточно репутации для публикации изображений напрямую):

Верхний левый угол извилистой Барбары

Нижний правый угол извилистой Барбары

Следующая обертка может быть не очень эффективной, но я решил проблему в моейслучай поворота обоих входных массивов и выходного массива, каждый на 180 градусов:

import numpy as np
from scipy.signal import convolve2d

def conv2(x, y, mode='same')
    return np.rot90(convolve2d(np.rot90(x, 2), np.rot90(y, 2), mode=mode), 2)
1 голос
/ 14 октября 2015

Вы должны указать смещение для каждого не-одиночного измерения, чтобы воспроизвести результаты conv2 Matlab.Простая реализация, поддерживающая только «ту же самую» опцию, может быть сделана так:

import numpy as np
from scipy.ndimage.filters import convolve

def conv2(x,y,mode='same'):
    """
    Emulate the function conv2 from Mathworks.

    Usage:

    z = conv2(x,y,mode='same')

    TODO: 
     - Support other modes than 'same' (see conv2.m)
    """

    if not(mode == 'same'):
        raise Exception("Mode not supported")

    # Add singleton dimensions
    if (len(x.shape) < len(y.shape)):
        dim = x.shape
        for i in range(len(x.shape),len(y.shape)):
            dim = (1,) + dim
        x = x.reshape(dim)
    elif (len(y.shape) < len(x.shape)):
        dim = y.shape
        for i in range(len(y.shape),len(x.shape)):
            dim = (1,) + dim
        y = y.reshape(dim)

    origin = ()

    # Apparently, the origin must be set in a special way to reproduce
    # the results of scipy.signal.convolve and Matlab
    for i in range(len(x.shape)):
        if ( (x.shape[i] - y.shape[i]) % 2 == 0 and
             x.shape[i] > 1 and
             y.shape[i] > 1):
            origin = origin + (-1,)
        else:
            origin = origin + (0,)

    z = convolve(x,y, mode='constant', origin=origin)

    return z
1 голос
/ 17 сентября 2010
scipy.ndimage.convolve

делает это в n измерениях.

...