में मैं 2 डी छवि मैट्रिक्स के बड़े सेट में कठोर शरीर परिवर्तन लागू करना चाहता हूं। आदर्श रूप से, मैं सिर्फ अनुवाद और रोटेशन दोनों को निर्दिष्ट करने वाले एफ़िन रूपांतरण रूपांतरण मैट्रिक्स की आपूर्ति करने में सक्षम होना चाहता हूं, इसे एक बार में लागू करें, फिर आउटपुट पर क्यूबिक स्पलीन इंटरपोलेशन करें।फास्ट 2 डी कठोर शरीर में परिवर्तन numpy/scipy
दुर्भाग्य से ऐसा लगता है कि affine_transform
scipy.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' ने रूपांतरण के लिए एक मैट्रिक्स को स्वीकार किया है, तो निकोला के सुझाव में यह अधिक सरल होगा। –
एफ़िन कठोर नहीं है –