2010-09-16 5 views
5

क्या पाइथन या उसके किसी भी मॉड्यूल में MATLAB के conv2 फ़ंक्शन के बराबर है? अधिक विशेष रूप से, मुझे कुछ ऐसी चीज में रूचि है जो MATLAB में conv2(A, B, 'same') के समान गणना करता है।क्या MATLAB के conv2 फ़ंक्शन के पाइथन समतुल्य है?

+0

क्षमा करें, मिस्ड एन-डी भाग – Anycorn

+0

@aaa carp - कोई समस्या नहीं! धन्यवाद वैसे भी – Ryan

उत्तर

4

ऐसा लगता है कि scipy.signal.convolve2d वह है जिसे आप ढूंढ रहे हैं।

+1

'वही' मोड का उपयोग करते समय, मुझे नहीं लगता कि वे वास्तव में वही हैं। मैटलैब से साइपी अलग-अलग केंद्र हैं। Matlab कहते हैं, "यदि पंक्तियों या स्तंभों की एक विषम संख्या है, तो" केंद्र "अंत में शुरुआत में एक और छोड़ देता है।" SciPy विपरीत करने के लिए प्रतीत होता है। – endolith

+0

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

1
scipy.ndimage.convolve 

यह एन आयामों में करता है।

+0

तो 'scipy.signal.convolve' है? – endolith

1

आपको मैटलैब के conv2 के परिणामों को पुन: उत्पन्न करने के लिए प्रत्येक गैर-सिंगलटन आयाम के लिए ऑफसेट प्रदान करना होगा। एक साधारण कार्यान्वयन 'एक ही' विकल्प का समर्थन, केवल, अन्य उत्तर पहले से ही एक समकक्ष के रूप में scipy.signal.convolve2d उल्लेख हालांकि यह

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

की तरह किया जा सकता है, मैंने पाया है कि परिणाम अलग जब mode='same' का उपयोग करते हैं।

जबकि मैटलैब के conv2 छवि के निचले और दाएं भाग पर कलाकृतियों के परिणामस्वरूप scipy.signal.convolve2d में छवि के शीर्ष और बाईं ओर एक ही कलाकृतियां हैं।

(छवियों को सीधे पोस्ट करने के लिए पर्याप्त नहीं प्रतिष्ठा) व्यवहार दिखा भूखंडों के लिए इन लिंक देखें:

Upper left corner of convoluted Barbara

Lower right corner of convoluted Barbara

निम्नलिखित आवरण बहुत ही कुशल नहीं हो सकता है, लेकिन समस्या का समाधान मेरे इनपुट में दोनों इनपुट एरे और आउटपुट सरणी को घूर्णन करके, प्रत्येक 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)