From 0e13be2d1970221b8086bfeda61bc463e9d65e55 Mon Sep 17 00:00:00 2001
From: Martin Genet <martin.genet@polytechnique.edu>
Date: Tue, 21 May 2019 10:42:37 +0200
Subject: [PATCH] Cleaning k-space resampling

---
 downsample_images.py |  51 ++++++++------------
 generate_images.py   | 109 +++++++++++++++++++------------------------
 2 files changed, 69 insertions(+), 91 deletions(-)

diff --git a/downsample_images.py b/downsample_images.py
index 20f0163..162a27a 100644
--- a/downsample_images.py
+++ b/downsample_images.py
@@ -43,25 +43,28 @@ def downsample_images(
     images_ndim = myvtk.getImageDimensionality(
         image=image,
         verbose=0)
+    mypy.my_print(verbose, "images_ndim = "+str(images_ndim))
     images_spacing = image.GetSpacing()
-    images_origin = image.GetOrigin()
+    mypy.my_print(verbose, "images_spacing = "+str(images_spacing))
+    images_delta = images_spacing[0:images_ndim]
+    mypy.my_print(verbose, "images_delta = "+str(images_delta))
     images_nvoxels = myvtk.getImageDimensions(
         image=image,
         verbose=0)
     mypy.my_print(verbose, "images_nvoxels = "+str(images_nvoxels))
-    assert (len(images_nvoxels) == images_ndim)
     images_npoints = numpy.prod(images_nvoxels)
-    # mypy.my_print(verbose, "images_npoints = "+str(images_npoints))
-    assert (images_npoints == image.GetNumberOfPoints())
+    mypy.my_print(verbose, "images_npoints = "+str(images_npoints))
 
     images_downsampled_nvoxels = numpy.array(images_nvoxels)/numpy.array(downsampling_factors)
     images_downsampled_nvoxels = numpy.ceil(images_downsampled_nvoxels)
     images_downsampled_nvoxels = [int(n) for n in images_downsampled_nvoxels]
     mypy.my_print(verbose, "images_downsampled_nvoxels = "+str(images_downsampled_nvoxels))
-    downsampling_factors = numpy.array(images_nvoxels)/numpy.array(images_downsampled_nvoxels)
+    downsampling_factors = list(numpy.array(images_nvoxels)/numpy.array(images_downsampled_nvoxels))
     mypy.my_print(verbose, "downsampling_factors = "+str(downsampling_factors))
     downsampling_factor = numpy.prod(downsampling_factors)
     mypy.my_print(verbose, "downsampling_factor = "+str(downsampling_factor))
+    images_downsampled_delta = list(numpy.array(images_delta)*numpy.array(downsampling_factors))
+    # mypy.my_print(verbose, "images_downsampled_delta = "+str(images_downsampled_delta))
     images_downsampled_npoints = numpy.prod(images_downsampled_nvoxels)
     # mypy.my_print(verbose, "images_downsampled_npoints = "+str(images_downsampled_npoints))
 
@@ -149,32 +152,18 @@ def downsample_images(
     else:
         image_downsampled = vtk.vtkImageData()
 
-        if   (images_ndim == 1):
-            extent = [0, images_downsampled_nvoxels[0]-1, 0,                               0, 0,                               0]
-        elif (images_ndim == 2):
-            extent = [0, images_downsampled_nvoxels[0]-1, 0, images_downsampled_nvoxels[1]-1, 0,                               0]
-        elif (images_ndim == 3):
-            extent = [0, images_downsampled_nvoxels[0]-1, 0, images_downsampled_nvoxels[1]-1, 0, images_downsampled_nvoxels[2]-1]
-        image_downsampled.SetExtent(extent)
-        mypy.my_print(verbose, "extent = "+str(extent))
-
-        if   (images_ndim == 1):
-            spacing = [images_spacing[0]*downsampling_factors[0],                                        1.,                                        1.]
-        elif (images_ndim == 2):
-            spacing = [images_spacing[0]*downsampling_factors[0], images_spacing[1]*downsampling_factors[1],                                        1.]
-        elif (images_ndim == 3):
-            spacing = [images_spacing[0]*downsampling_factors[0], images_spacing[1]*downsampling_factors[1], images_spacing[2]*downsampling_factors[2]]
-        image_downsampled.SetSpacing(spacing)
-        mypy.my_print(verbose, "spacing = "+str(spacing))
-
-        if   (images_ndim == 1):
-            origin = [spacing[0]/2,           0.,           0.]
-        elif (images_ndim == 2):
-            origin = [spacing[0]/2, spacing[1]/2,           0.]
-        elif (images_ndim == 3):
-            origin = [spacing[0]/2, spacing[1]/2, spacing[2]/2]
-        image_downsampled.SetOrigin(origin)
-        mypy.my_print(verbose, "origin = "+str(origin))
+        dimensions_downsampled = images_downsampled_nvoxels+[1]*(3-images_ndim)
+        mypy.my_print(verbose, "dimensions_downsampled = "+str(dimensions_downsampled))
+        image_downsampled.SetDimensions(dimensions_downsampled)
+
+        spacing_downsampled = images_downsampled_delta+[1.]*(3-images_ndim)
+        mypy.my_print(verbose, "spacing_downsampled = "+str(spacing_downsampled))
+        image_downsampled.SetSpacing(spacing_downsampled)
+
+        origin_downsampled = list(numpy.array(images_downsampled_delta)/2)
+        origin_downsampled = origin_downsampled+[0.]*(3-images_ndim)
+        mypy.my_print(verbose, "origin_downsampled = "+str(origin_downsampled))
+        image_downsampled.SetOrigin(origin_downsampled)
 
         image_downsampled_scalars = myvtk.createDoubleArray(
             name="ImageScalars",
diff --git a/generate_images.py b/generate_images.py
index cde5c46..21c7de0 100644
--- a/generate_images.py
+++ b/generate_images.py
@@ -28,29 +28,29 @@ def set_I_woGrad(
         image,
         X,
         I,
-        vtk_image_scalars,
+        image_upsampled_scalars,
         k_point,
         G=None,
         Finv=None,
-        vtk_gradient_vectors=None):
+        image_gradient_upsampled_vectors=None):
 
     image.I0(X, I)
-    vtk_image_scalars.SetTuple(k_point, I)
+    image_upsampled_scalars.SetTuple(k_point, I)
 
 def set_I_wGrad(
         image,
         X,
         I,
-        vtk_image_scalars,
+        image_upsampled_scalars,
         k_point,
         G,
         Finv,
-        vtk_gradient_vectors):
+        image_gradient_upsampled_vectors):
 
     image.I0_wGrad(X, I, G)
-    vtk_image_scalars.SetTuple(k_point, I)
+    image_upsampled_scalars.SetTuple(k_point, I)
     G = numpy.dot(G, Finv)
-    vtk_gradient_vectors.SetTuple(k_point, G)
+    image_gradient_upsampled_vectors.SetTuple(k_point, G)
 
 def generate_images(
         images,
@@ -90,61 +90,47 @@ def generate_images(
         evolution,
         generate_image_gradient)
 
-    vtk_image = vtk.vtkImageData()
-
-    delta = numpy.array(images["L"])/numpy.array(images["n_voxels"])
-
-    images["n_voxels_upsampled"] = numpy.array(images["n_voxels"])*numpy.array(images["upsampling_factors"])
-    delta_upsampled = numpy.array(images["L"])/numpy.array(images["n_voxels_upsampled"])
-
-    if   (images["n_dim"] == 1):
-        extent = [0, images["n_voxels_upsampled"][0]-1, 0,                                 0, 0,                                 0]
-    elif (images["n_dim"] == 2):
-        extent = [0, images["n_voxels_upsampled"][0]-1, 0, images["n_voxels_upsampled"][1]-1, 0,                                 0]
-    elif (images["n_dim"] == 3):
-        extent = [0, images["n_voxels_upsampled"][0]-1, 0, images["n_voxels_upsampled"][1]-1, 0, images["n_voxels_upsampled"][2]-1]
-    vtk_image.SetExtent(extent)
-    mypy.my_print(verbose, "extent = "+str(extent))
-
-    if   (images["n_dim"] == 1):
-        spacing = [delta_upsampled[0],                 1.,                 1.]
-    elif (images["n_dim"] == 2):
-        spacing = [delta_upsampled[0], delta_upsampled[1],                 1.]
-    elif (images["n_dim"] == 3):
-        spacing = [delta_upsampled[0], delta_upsampled[1], delta_upsampled[2]]
-    vtk_image.SetSpacing(spacing)
-    mypy.my_print(verbose, "spacing = "+str(spacing))
-
-    if   (images["n_dim"] == 1):
-        origin = [delta[0]/2,         0.,         0.]
-    elif (images["n_dim"] == 2):
-        origin = [delta[0]/2, delta[1]/2,         0.]
-    elif (images["n_dim"] == 3):
-        origin = [delta[0]/2, delta[1]/2, delta[2]/2]
-    vtk_image.SetOrigin(origin)
-    mypy.my_print(verbose, "origin = "+str(origin))
-
-    n_points = vtk_image.GetNumberOfPoints()
-    vtk_image_scalars = myvtk.createFloatArray(
+    image_upsampled = vtk.vtkImageData()
+
+    n_voxels_upsampled = list(numpy.array(images["n_voxels"])*numpy.array(images["upsampling_factors"]))
+
+    dimensions_upsampled = n_voxels_upsampled+[1]*(3-images["n_dim"])
+    mypy.my_print(verbose, "dimensions_upsampled = "+str(dimensions_upsampled))
+    image_upsampled.SetDimensions(dimensions_upsampled)
+
+    delta = list(numpy.array(images["L"])/numpy.array(images["n_voxels"]))
+    delta_upsampled = list(numpy.array(delta)/numpy.array(images["upsampling_factors"]))
+
+    spacing_upsampled = delta_upsampled+[1.]*(3-images["n_dim"])
+    mypy.my_print(verbose, "spacing_upsampled = "+str(spacing_upsampled))
+    image_upsampled.SetSpacing(spacing_upsampled)
+
+    origin_upsampled = list(numpy.array(delta_upsampled)/2)
+    origin_upsampled = origin_upsampled+[0.]*(3-images["n_dim"])
+    mypy.my_print(verbose, "origin_upsampled = "+str(origin_upsampled))
+    image_upsampled.SetOrigin(origin_upsampled)
+
+    n_points_upsampled = image_upsampled.GetNumberOfPoints()
+    image_upsampled_scalars = myvtk.createFloatArray(
         name="ImageScalars",
         n_components=1,
-        n_tuples=n_points,
+        n_tuples=n_points_upsampled,
         verbose=verbose-1)
-    vtk_image.GetPointData().SetScalars(vtk_image_scalars)
+    image_upsampled.GetPointData().SetScalars(image_upsampled_scalars)
 
     if (generate_image_gradient):
-        vtk_gradient = vtk.vtkImageData()
-        vtk_gradient.DeepCopy(vtk_image)
+        image_gradient_upsampled = vtk.vtkImageData()
+        image_gradient_upsampled.DeepCopy(image_upsampled)
 
-        vtk_gradient_vectors = myvtk.createFloatArray(
+        image_gradient_upsampled_vectors = myvtk.createFloatArray(
             name="ImageScalarsGradient",
             n_components=3,
-            n_tuples=n_points,
+            n_tuples=n_points_upsampled,
             verbose=verbose-1)
-        vtk_gradient.GetPointData().SetScalars(vtk_gradient_vectors)
+        image_gradient_upsampled.GetPointData().SetScalars(image_gradient_upsampled_vectors)
     else:
-        vtk_gradient         = None
-        vtk_gradient_vectors = None
+        image_gradient_upsampled         = None
+        image_gradient_upsampled_vectors = None
 
     x = numpy.empty(3)
     X = numpy.empty(3)
@@ -164,23 +150,23 @@ def generate_images(
         t = images["T"]*float(k_frame)/(images["n_frames"]-1) if (images["n_frames"]>1) else 0.
         mypy.my_print(verbose, "t = "+str(t))
         mapping.init_t(t)
-        for k_point in xrange(n_points):
-            vtk_image.GetPoint(k_point, x)
+        for k_point in xrange(n_points_upsampled):
+            image_upsampled.GetPoint(k_point, x)
             #print "x0 = "+str(x)
             mapping.X(x, X, Finv)
             #print "X = "+str(X)
-            set_I(image, X, I, vtk_image_scalars, k_point, G, Finv, vtk_gradient_vectors)
+            set_I(image, X, I, image_upsampled_scalars, k_point, G, Finv, image_gradient_upsampled_vectors)
             global_min = min(global_min, I[0])
             global_max = max(global_max, I[0])
-        #print vtk_image
+        #print image_upsampled
         myvtk.writeImage(
-            image=vtk_image,
+            image=image_upsampled,
             filename=images["folder"]+"/"+images["basename"]+"_"+str(k_frame).zfill(images["zfill"])+"."+images["ext"],
             verbose=verbose-1)
         if (generate_image_gradient):
-            #print vtk_gradient
+            #print image_gradient_upsampled
             myvtk.writeImage(
-                image=vtk_gradient,
+                image=image_gradient_upsampled,
                 filename=images["folder"]+"/"+images["basename"]+"-grad"+"_"+str(k_frame).zfill(images["zfill"])+"."+images["ext"],
                 verbose=verbose-1)
     # mypy.my_print(verbose, "global_min = "+str(global_min))
@@ -190,6 +176,7 @@ def generate_images(
         downsampling = False
     else:
         downsampling = True
+
         ddic.downsample_images(
             images_folder=images["folder"],
             images_basename=images["basename"],
@@ -199,8 +186,10 @@ def generate_images(
             verbose=verbose)
 
     if (images["data_type"] in ("float")):
-        pass
+        normalizing = False
     elif (images["data_type"] in ("unsigned char", "unsigned short", "unsigned int", "unsigned long", "unsigned float", "uint8", "uint16", "uint32", "uint64", "ufloat")):
+        normalizing = True
+
         ddic.normalize_images(
             images_folder=images["folder"],
             images_basename=images["basename"]+("_downsampled"*(downsampling)),
-- 
GitLab