[SciPy-User] 2D slice of transformed data
David Baddeley
david_baddeley at yahoo.com.au
Wed Mar 23 20:07:42 EDT 2011
I think you are on to the right idea with using transformed coordinates with
map_coordinates. I think the easiest way (and fastest way) to get your set of
transformed coordinates might be something like the following:
assuming Ai is the inverse of your transformation matrix ...
X, Y, Z, T = mgrid[whatever your goal slices are]
Xt = Ai[0,0]*X + Ai[0,1]*Y + Ai[0,2]*Z .....
Yt = Ai[1,0]*X ........
Tt = ...
Tt = ...
this lets you still exploit scipys vector operations on your arrays of
coordinates, rather than having to separately multiply each tuple with the
matrix. I'm you can probably write that as a loop to avoid all the redundant
code. eg:
def transformCoords(coords, A):
#coords is a list of coordinate arrays eg [X, Y, Z, T]
#A is the transformation matrix
ret = []
for i in range(len(coords)):
r_i = 0
for j in range(len(coords)):
r_j += A[i,j]*coords[j]
ret.append(r_i)
return ret
cheers,
David
________________________________
From: Chris Weisiger <cweisiger at msg.ucsf.edu>
To: scipy-user at scipy.org
Sent: Thu, 24 March, 2011 11:00:39 AM
Subject: [SciPy-User] 2D slice of transformed data
In preface, I'm not remotely an expert at array manipulation here. I'm an
experienced programmer, but not an experienced *scientific* programmer. I'm sure
what I want to do is possible, and I'm pretty certain it's even possible to do
efficiently, but figuring out the actual implementation is giving me fits.
I have two four-dimensional arrays of data: time, Z, Y, X. These represent
microscopy data taken of the same sample with two different cameras. Their views
don't quite match up if you overlay them, so we have a three-dimensional
transform to align one array with the other. That transformation consists of X,
Y, and Z translations (shifts), rotation about the Z axis, and equal scaling in
X and Y -- thus, the transformation has 5 parameters. I can perform the
transformation on the data without difficulty with ndimage.affine_transform, but
because we typically have hundreds of millions of pixels in one array, it takes
a moderately long time. A representative array would be 30x50x512x512 or
thereabouts.
I'm writing a program to allow users to adjust the transformation and see how
well-aligned the data looks from several perspectives. In addition to the
traditional XY view, we also want to show XZ and YZ views, as well as kymographs
(e.g. TX, TY, TZ views). Thus, I need to be able to show 2D slices of the
transformed data in a timely fashion. These slices are always perpendicular to
two axes (e.g. an XY slice passing through T = 0, Z = 20, or a TZ slice passing
through X = 256, Y = 256), never diagonal. It seems like the fast way to do this
would be to take each pixel in the desired slice, apply the reverse transform,
and figure out where in the original data it came from. But I'm having trouble
figuring out how to efficiently do this.
I could construct a 3D array with shape (length of axis 1), (length of axis 2),
(4), such that each position in the array is a 4-tuple of the coordinates of the
pixel in the desired slice. For example, if doing a YX slice at T = 10, Z = 20,
the array would look like [[[10, 20, 0, 0], [10, 20, 1, 0], [10, 20, 2, 0],
...], [[10, 20, 0, 1], 10, 20, 1, 1], ...]]. Then perhaps there'd be some way to
efficiently apply the inverse transform to each coordinate tuple, then using
ndimage.map_coordinates to turn those into pixel data. But I haven't managed to
figure that out yet.
By any chance is this already solved? If not, any suggestions / assistance would
be wonderful.
-Chris
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.scipy.org/pipermail/scipy-user/attachments/20110323/58a5337b/attachment.html>
More information about the SciPy-User
mailing list