2010-09-16 73 views

Trả lời

4

Có vẻ như scipy.signal.convolve2d là những gì bạn đang tìm kiếm.

+1

Khi sử dụng chế độ 'cùng', tôi không nghĩ chúng thực sự giống nhau. SciPy trung tâm khác với Matlab. Matlab nói "Nếu có một số hàng hoặc cột lẻ, thì" trung tâm "sẽ để lại một số ở đầu hơn là kết thúc." SciPy dường như làm điều ngược lại. – endolith

+0

https://gist.github.com/4303970 – endolith

1
scipy.ndimage.convolve 

thực hiện theo thứ nguyên n.

+0

do đó, không 'scipy.signal.convolve'? – endolith

1

Bạn phải cung cấp bù đắp cho từng thứ nguyên không phải đơn để tái tạo kết quả của conv2 của Matlab. Một thực hiện đơn giản hỗ trợ tùy chọn 'cùng', chỉ, có thể được thực hiện như thế này

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 
2

Trong khi câu trả lời khác đã đề cập đến scipy.signal.convolve2d như tương đương, tôi thấy rằng các kết quả khác nhau khi sử dụng mode='same'.

Trong khi kết quả của các bức ảnh conv2 của Matlab ở phía dưới và bên phải của hình ảnh, scipy.signal.convolve2d có cùng các tạo tác ở trên cùng và bên trái của hình ảnh.

Xem những liên kết này cho lô cho thấy hành vi (không đủ uy tín để gửi hình ảnh trực tiếp):

Upper left corner of convoluted Barbara

Lower right corner of convoluted Barbara

Các wrapper sau đây có thể không phải là rất hiệu quả, nhưng giải quyết vấn đề trong trường hợp của tôi bằng cách xoay cả hai mảng đầu vào và mảng đầu ra, từng mảng 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) 
Các vấn đề liên quan