2012-07-13 11 views
5

में मैं 2 डी छवि मैट्रिक्स के बड़े सेट में कठोर शरीर परिवर्तन लागू करना चाहता हूं। आदर्श रूप से, मैं सिर्फ अनुवाद और रोटेशन दोनों को निर्दिष्ट करने वाले एफ़िन रूपांतरण रूपांतरण मैट्रिक्स की आपूर्ति करने में सक्षम होना चाहता हूं, इसे एक बार में लागू करें, फिर आउटपुट पर क्यूबिक स्पलीन इंटरपोलेशन करें।फास्ट 2 डी कठोर शरीर में परिवर्तन numpy/scipy

दुर्भाग्य से ऐसा लगता है कि affine_transformscipy.ndimage.interpolation में अनुवाद नहीं करता है। मुझे पता है कि मैं shift और rotate के संयोजन का उपयोग कर सकता हूं, लेकिन यह एक प्रकार का गन्दा है और इसमें कई बार आउटपुट को इंटरपोल करना शामिल है।

मैं भी सामान्य geometric_transformation इस तरह का उपयोग कर की कोशिश की है:

import numpy as np 
from scipy.ndimage.interpolation import geometric_transformation 

# make the affine matrix 
def maketmat(xshift,yshift,rotation,dimin=(0,0)): 

    # centre on the origin 
    in2orig = np.identity(3) 
    in2orig[:2,2] = -dimin[0]/2.,-dimin[1]/2. 

    # rotate about the origin 
    theta = np.deg2rad(rotation) 
    rotmat = np.identity(3) 
    rotmat[:2,:2] = [np.cos(theta),np.sin(theta)],[-np.sin(theta),np.cos(theta)] 

    # translate to new position 
    orig2out = np.identity(3) 
    orig2out[:2,2] = xshift,yshift 

    # the final affine matrix is just the product 
    tmat = np.dot(orig2out,np.dot(rotmat,in2orig)) 

# function that maps output space to input space 
def out2in(outcoords,affinemat): 
    outcoords = np.asarray(outcoords) 
    outcoords = np.concatenate((outcoords,(1.,))) 
    incoords = np.dot(affinemat,outcoords) 
    incoords = tuple(incoords[0:2]) 
    return incoords 

def rbtransform(source,xshift,yshift,rotation,outdims): 

    # source --> target 
    forward = maketmat(xshift,yshift,rotation,source.shape) 

    # target --> source 
    backward = np.linalg.inv(forward) 

    # now we can use geometric_transform to do the interpolation etc. 
    tformed = geometric_transform(source,out2in,output_shape=outdims,extra_arguments=(backward,)) 

    return tformed 

यह काम करता है, लेकिन यह बुरी धीमी है, के बाद से यह अनिवार्य रूप से पिक्सेल निर्देशांक से अधिक पाशन है! ऐसा करने का एक अच्छा तरीका क्या है?

उत्तर

3

मुझे लगता है कि affine_transformकरता अनुवाद करना --- वहाँ offset पैरामीटर।

+0

हां, आप एक बहुत अच्छा मुद्दा बनाते हैं! मुझे क्या फेंक दिया गया था कि मुझे रैंक 3 मैट्रिक्स की आपूर्ति करने की उम्मीद है और उसने दो से अधिक पंक्तियों को स्वीकार करने से इंकार कर दिया। मुझे लगता है कि अगर यह 'affine_transform' ने रूपांतरण के लिए एक मैट्रिक्स को स्वीकार किया है, तो निकोला के सुझाव में यह अधिक सरल होगा। –

+0

एफ़िन कठोर नहीं है –

3

क्या आप scikit image का उपयोग कर सकते हैं? यदि ऐसा है, तो आप एक होमोग्राफी लागू करने का प्रयास कर सकते हैं। एक होमोग्राफी कैब एक 3x3 मैट्रिक्स के माध्यम से एक ही समय में अनुवाद और रोटेशन दोनों का प्रतिनिधित्व करने के लिए प्रयोग किया जाता है। आप skimage.transform.fast_homography फ़ंक्शन का उपयोग कर सकते हैं।

import numpy as np 
import scipy 
import skimage.transform 
im = scipy.misc.lena() 
H = np.asarray([[1, 0, 10], [0, 1, 20], [0, 0, 1]]) 
skimage.transform.fast_homography(im, H) 

ट्रांसफॉर्म ने मेरे पुराने कोर 2 डुओ पर लगभग 30 एमएस लिया।

homography के बारे में: http://en.wikipedia.org/wiki/Homography

+0

अच्छा, लगभग वही है जो मैं खोज रहा था। केवल नकारात्मक पक्ष यह है कि 'fast_homography' केवल बिलीनेर इंटरपोलेशन का समर्थन करता प्रतीत होता है, लेकिन सादा 'होमोग्राफी' बाइबिक करता है और मेरे उद्देश्यों के लिए पर्याप्त तेज़ है। –

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