2011-04-07 15 views
10

संपादित करें: पॉल ने इसे नीचे हल किया है। धन्यवाद!Scipy इंटरपोलेशन कैसे 3x3 मैट्रिक्स का आकार बदलने/resx करने के लिए 5x5 करने के लिए?

मैं 5x5 पर 3x3 मैट्रिक्स को दोहराने (अपस्केल) करने की कोशिश कर रहा हूं, इंटरमीडिएट पॉइंट्स को इंटरपोलेट.inटरपी 2 डी या इंटरपोलेट के साथ भरने की कोशिश कर रहा हूं। RectBivariateSpline (या जो भी काम करता है)।

यदि ऐसा करने के लिए एक सरल, मौजूदा फ़ंक्शन है, तो मैं इसका उपयोग करना चाहता हूं, लेकिन मुझे अभी तक यह नहीं मिला है। उदाहरण के लिए, एक समारोह की तरह काम करेगा:

# upscale 2x2 to 4x4 
matrixSmall = ([[-1,8],[3,5]]) 
matrixBig = matrixSmall.resample(4,4,cubic) 

तो, अगर मैं एक 3x3 मैट्रिक्स/सरणी के साथ शुरू:

0,-2,0 
-2,11,-2 
0,-2,0 

मैं एक नया 5x5 मैट्रिक्स गणना करने के लिए चाहते हैं ("मैं" जिसका अर्थ अंतर्वेशित मूल्य):

0, I[1,0], -2, I[3,0], 0 
I[0,1], I[1,1], I[2,1], I[3,1], I[4,1] 
-2, I[1,2], 11, I[3,2], -2 
I[0,3], I[1,3], I[2,3], I[3,3], I[4,3] 
0, I[1,4], -2, I[3,4], 0 

मैं खोज किया गया है और ऊपर पढ़ रहे हैं और विभिन्न विभिन्न परीक्षण कोड की कोशिश कर रहा है, लेकिन मैं काफी मैं क्या कर रहा हूँ के लिए सही सिंटैक्स पता लगा नहीं किया है। मुझे यह भी यकीन नहीं है कि मुझे कुछ लाइनों में मेष्रिड, मैग्रिड या लिन्स स्पेस का उपयोग करने की आवश्यकता है या नहीं।

संपादित करें: फिक्स्ड और काम पॉल के लिए धन्यवाद

import numpy, scipy 
from scipy import interpolate 

kernelIn = numpy.array([[0,-2,0], 
      [-2,11,-2], 
      [0,-2,0]]) 

inKSize = len(kernelIn) 
outKSize = 5 

kernelOut = numpy.zeros((outKSize,outKSize),numpy.uint8) 

x = numpy.array([0,1,2]) 
y = numpy.array([0,1,2]) 

z = kernelIn 

xx = numpy.linspace(x.min(),x.max(),outKSize) 
yy = numpy.linspace(y.min(),y.max(),outKSize) 

newKernel = interpolate.RectBivariateSpline(x,y,z, kx=2,ky=2) 

kernelOut = newKernel(xx,yy) 

print kernelOut 

उत्तर

9

केवल दो छोटे समस्याओं:

1) आपका xx, yy एक्स के सीमा के बाहर है, वाई (आप कर सकते हैं एक्सट्रपलेशन , लेकिन मुझे लगता है कि आप नहीं चाहते हैं।)

2) आपका नमूना आकार केएक्स और 3 (डिफ़ॉल्ट) के के लिए बहुत छोटा है। इसे 2 तक कम करें और क्यूबिक के बजाय एक वर्गबद्ध फिट प्राप्त करें।

import numpy, scipy 
from scipy import interpolate 

kernelIn = numpy.array([ 
    [0,-2,0], 
    [-2,11,-2], 
    [0,-2,0]]) 

inKSize = len(kernelIn) 
outKSize = 5 

kernelOut = numpy.zeros((outKSize),numpy.uint8) 

x = numpy.array([0,1,2]) 
y = numpy.array([0,1,2]) 

z = kernelIn 

xx = numpy.linspace(x.min(),x.max(),outKSize) 
yy = numpy.linspace(y.min(),y.max(),outKSize) 

newKernel = interpolate.RectBivariateSpline(x,y,z, kx=2,ky=2) 

kernelOut = newKernel(xx,yy) 

print kernelOut 
##[[ 0.  -1.5  -2.  -1.5  0. ] 
## [ -1.5  5.4375 7.75  5.4375 -1.5 ] 
## [ -2.  7.75 11.  7.75 -2. ] 
## [ -1.5  5.4375 7.75  5.4375 -1.5 ] 
## [ 0.  -1.5  -2.  -1.5  0. ]] 
+0

त्वरित समाधान के लिए बहुत बहुत धन्यवाद! यही वही है जो मैं ढूंढ रहा था। मैंने पहले लिन्स स्पेस की कोशिश की थी, लेकिन गलत स्वरूपण के साथ और मैं पूरी तरह से केएक्स, केई याद किया। – moski

9

आप scipy पहले से ही उपयोग कर रहे हैं, मुझे लगता है कि scipy.ndimage.interpolate.zoom आपको क्या चाहिए कर सकते हैं:

import numpy 
import scipy.ndimage 

a = numpy.array([[0.,-2.,0.], [-2.,11.,-2.], [0.,-2.,0.]]) 
out = numpy.round(scipy.ndimage.interpolation.zoom(input=a, zoom=(5./3), order = 2),1) 

print out 
#[[ 0. -1. -2. -1. 0. ] 
# [ -1. 1.8 4.5 1.8 -1. ] 
# [ -2. 4.5 11. 4.5 -2. ] 
# [ -1. 1.8 4.5 1.8 -1. ] 
# [ 0. -1. -2. -1. 0. ]] 

यहाँ "ज़ूम कारक" 5./3 है क्योंकि हम एक 5x5 सरणी के लिए एक 3x3 सरणी से जा रहे हैं । यदि आप दस्तावेज़ पढ़ते हैं, तो यह कहता है कि आप दो अक्षों के लिए स्वतंत्र रूप से ज़ूम कारक भी निर्दिष्ट कर सकते हैं, जिसका अर्थ है कि आप गैर स्क्वायर मैट्रिस को भी बढ़ा सकते हैं। डिफ़ॉल्ट रूप से, यह तीसरे ऑर्डर स्पलीन इंटरपोलेशन का उपयोग करता है, जो मुझे यकीन नहीं है कि सबसे अच्छा है।

मैंने इसे कुछ छवियों पर आजमाया और यह अच्छी तरह से काम करता है।

+0

इसे इंगित करने के लिए धन्यवाद। मुझे वह समारोह नहीं मिला था। मैं इसे भी कोशिश करूंगा। मुझे आश्चर्य है कि इस nd.image.interpolate.zoom और interpolate.RectBivariateSpline के बीच इंटरपोलेटेड आउटपुट मानों में महत्वपूर्ण अंतर क्या है। – moski

संबंधित मुद्दे