Browse Source

Add interpolated flat-field-correction and summing

Matthias Vogelgesang 9 years ago
parent
commit
b855e65e72
4 changed files with 101 additions and 20 deletions
  1. 1 0
      Makefile
  2. 4 1
      lamino.c
  3. 94 19
      reco.c
  4. 2 0
      reco.h

+ 1 - 0
Makefile

@@ -1,3 +1,4 @@
+CFLAGS=-Wall -O3
 PKG_DEPS = ufo
 SRC=lamino.c reco.c io.c
 BIN=lamino

+ 4 - 1
lamino.c

@@ -150,6 +150,7 @@ parse_params (Params *params, int argc, char **argv)
         { "radios", 0, 0, G_OPTION_ARG_STRING, &params->radios, "Radios", "[path|glob]" },
         { "darks", 0, 0, G_OPTION_ARG_STRING, &params->darks, "Darks", "[path|glob]" },
         { "flats", 0, 0, G_OPTION_ARG_STRING, &params->flats, "Flats", "[path|glob]" },
+        { "flats-after", 0, 0, G_OPTION_ARG_STRING, &params->flats_after, "Flats", "[path|glob]" },
         { "radio-step", 0, 0, G_OPTION_ARG_INT, &params->radio_step, "Radio step", "[int]" },
         { "dark-scale", 0, 0, G_OPTION_ARG_DOUBLE, &params->dark_scale, "Dark scale", "[float]" },
         { "output", 0, 0, G_OPTION_ARG_STRING, &params->output, "Output", "[path]" },
@@ -167,6 +168,7 @@ parse_params (Params *params, int argc, char **argv)
         { "vd", 0, 0, G_OPTION_ARG_INT, &params->v_size[2], "Depth of box", "[int]" },
         { "z-spacing", 0, 0, G_OPTION_ARG_DOUBLE, &params->z_spacing, "Z-spacing", "[int]" },
         { "interactive", 0, 0, G_OPTION_ARG_NONE, &params->interactive, "Start interactive mode", "" },
+        { "write-summed", 0, 0, G_OPTION_ARG_NONE, &params->write_summed, "Write summed flat-field-corrected projections", "" },
         { NULL }
     };
 
@@ -202,7 +204,8 @@ main (int argc, char **argv)
         .radios = NULL,
         .darks = NULL,
         .flats = NULL,
-        .output = "volume.tif",
+        .flats_after = NULL,
+        .output = "volume-%i.tif",
         .width = 0,
         .height = 0,
         .num_radios = 0,

+ 94 - 19
reco.c

@@ -262,9 +262,17 @@ run_simple_reconstruction (Params *params, gchar **argv)
     UfoBaseScheduler *sched = NULL;
     UfoTaskNode *radio_reader = NULL;
     UfoTaskNode *dark_reader = NULL;
-    UfoTaskNode *flat_reader = NULL;
-    UfoTaskNode *flat_avg = NULL;
+    UfoTaskNode *flat_before_reader = NULL;
+    UfoTaskNode *flat_before_stack = NULL;
+    UfoTaskNode *flat_before_median = NULL;
+    UfoTaskNode *flat_after_reader = NULL;
+    UfoTaskNode *flat_after_stack = NULL;
+    UfoTaskNode *flat_after_median = NULL;
+    UfoTaskNode *flat_interpolate = NULL;
     UfoTaskNode *ffc = NULL;
+    UfoTaskNode *copy = NULL;
+    UfoTaskNode *sum = NULL;
+    UfoTaskNode *sum_writer = NULL;
     GError *error = NULL;
 
     if (!params_okay (params)) {
@@ -280,24 +288,58 @@ run_simple_reconstruction (Params *params, gchar **argv)
     update_reader (radio_reader, params);
 
     if (with_flat_field_correction (params)) {
-        flat_avg = make_task (data->pm, "averager");
-        flat_reader = make_task (data->pm, "reader");
+        gchar *sum_name;
+
+        flat_before_reader = make_task (data->pm, "reader");
+        flat_before_stack = make_task (data->pm, "stack");
+        flat_before_median = make_task (data->pm, "flatten");
+
+        flat_after_reader = make_task (data->pm, "reader");
+        flat_after_stack = make_task (data->pm, "stack");
+        flat_after_median = make_task (data->pm, "flatten");
+
+        flat_interpolate = make_task (data->pm, "interpolate");
+
         dark_reader = make_task (data->pm, "reader");
         ffc = make_task (data->pm, "flat-field-correction");
 
+        copy = UFO_TASK_NODE (ufo_copy_task_new ());
+        sum = make_task (data->pm, "flatten-inplace");
+        sum_writer = make_task (data->pm, "writer");
+
+        g_object_set (flat_before_stack, "num-items", 21, NULL);
+        g_object_set (flat_after_stack, "num-items", 21, NULL);
+
         g_object_set (ffc,
                       "dark-scale", params->dark_scale,
                       "absorption-correction", TRUE,
                       NULL);
 
-        g_object_set (flat_reader, "path", params->flats, NULL);
+        sum_name = g_strdup_printf ("%s.sum.tif", params->output);
+        g_object_set (sum_writer,
+                      "filename", sum_name,
+                      NULL);
+        g_free (sum_name);
+
+        g_object_set (flat_before_reader, "path", params->flats, NULL);
+        g_object_set (flat_after_reader, "path", params->flats_after, NULL);
         g_object_set (dark_reader, "path", params->darks, NULL);
 
-        ufo_task_graph_connect_nodes (data->graph, flat_reader, flat_avg);
+        ufo_task_graph_connect_nodes (data->graph, flat_before_reader, flat_before_stack);
+        ufo_task_graph_connect_nodes (data->graph, flat_before_stack, flat_before_median);
+        ufo_task_graph_connect_nodes (data->graph, flat_after_reader, flat_after_stack);
+        ufo_task_graph_connect_nodes (data->graph, flat_after_stack, flat_after_median);
+        ufo_task_graph_connect_nodes_full (data->graph, flat_before_median, flat_interpolate, 0);
+        ufo_task_graph_connect_nodes_full (data->graph, flat_after_median, flat_interpolate, 1);
+
         ufo_task_graph_connect_nodes_full (data->graph, radio_reader, ffc, 0);
         ufo_task_graph_connect_nodes_full (data->graph, dark_reader, ffc, 1);
-        ufo_task_graph_connect_nodes_full (data->graph, flat_avg, ffc, 2);
-        ufo_task_graph_connect_nodes (data->graph, ffc, data->pad);
+        ufo_task_graph_connect_nodes_full (data->graph, flat_interpolate, ffc, 2);
+        ufo_task_graph_connect_nodes (data->graph, ffc, copy);
+
+        ufo_task_graph_connect_nodes (data->graph, copy, data->pad);
+        ufo_task_graph_connect_nodes (data->graph, copy, sum);
+        ufo_task_graph_connect_nodes (data->graph, sum, sum_writer);
     }
     else {
         warn ("> No flat/dark field correction\n");
@@ -319,9 +361,16 @@ run_simple_reconstruction (Params *params, gchar **argv)
 
     if (with_flat_field_correction (params)) {
         g_object_unref (ffc);
-        g_object_unref (flat_avg);
-        g_object_unref (flat_reader);
+        g_object_unref (flat_before_reader);
+        g_object_unref (flat_before_stack);
+        g_object_unref (flat_before_median);
+        g_object_unref (flat_after_reader);
+        g_object_unref (flat_after_stack);
+        g_object_unref (flat_after_median);
         g_object_unref (dark_reader);
+        g_object_unref (copy);
+        g_object_unref (sum);
+        g_object_unref (sum_writer);
     }
 }
 
@@ -402,8 +451,13 @@ run_cached_reconstruction (Params *params, gchar **argv)
         UfoBaseScheduler *sched;
         GError *error = NULL;
         UfoTaskNode *dark_reader = NULL;
-        UfoTaskNode *flat_reader = NULL;
-        UfoTaskNode *flat_avg = NULL;
+        UfoTaskNode *flat_before_reader = NULL;
+        UfoTaskNode *flat_before_stack = NULL;
+        UfoTaskNode *flat_before_median = NULL;
+        UfoTaskNode *flat_after_reader = NULL;
+        UfoTaskNode *flat_after_stack = NULL;
+        UfoTaskNode *flat_after_median = NULL;
+        UfoTaskNode *flat_interpolate = NULL;
         UfoTaskNode *ffc = NULL;
 
         params->cache = g_malloc (((gsize) params->num_radios) * ((gsize) params->width) * ((gsize) params->height) * sizeof (gfloat));
@@ -416,23 +470,40 @@ run_cached_reconstruction (Params *params, gchar **argv)
         data->output = UFO_TASK_NODE (ufo_output_task_new (2));
 
         if (with_flat_field_correction (params)) {
-            flat_avg = make_task (data->pm, "averager");
-            flat_reader = make_task (data->pm, "reader");
+            flat_before_reader = make_task (data->pm, "reader");
+            flat_before_stack = make_task (data->pm, "stack");
+            flat_before_median = make_task (data->pm, "flatten");
+
+            flat_after_reader = make_task (data->pm, "reader");
+            flat_after_stack = make_task (data->pm, "stack");
+            flat_after_median = make_task (data->pm, "flatten");
+
+            flat_interpolate = make_task (data->pm, "interpolate");
             dark_reader = make_task (data->pm, "reader");
             ffc = make_task (data->pm, "flat-field-correction");
 
+            g_object_set (flat_before_stack, "num-items", 21, NULL);
+            g_object_set (flat_after_stack, "num-items", 21, NULL);
+
             g_object_set (ffc,
                           "dark-scale", params->dark_scale,
                           "absorption-correction", TRUE,
                           NULL);
 
-            g_object_set (flat_reader, "path", params->flats, NULL);
+            g_object_set (flat_before_reader, "path", params->flats, NULL);
+            g_object_set (flat_after_reader, "path", params->flats_after, NULL);
             g_object_set (dark_reader, "path", params->darks, NULL);
 
-            ufo_task_graph_connect_nodes (read_graph, flat_reader, flat_avg);
+            ufo_task_graph_connect_nodes (read_graph, flat_before_reader, flat_before_stack);
+            ufo_task_graph_connect_nodes (read_graph, flat_before_stack, flat_before_median);
+            ufo_task_graph_connect_nodes (read_graph, flat_after_reader, flat_after_stack);
+            ufo_task_graph_connect_nodes (read_graph, flat_after_stack, flat_after_median);
+            ufo_task_graph_connect_nodes_full (read_graph, flat_before_median, flat_interpolate, 0);
+            ufo_task_graph_connect_nodes_full (read_graph, flat_after_median, flat_interpolate, 1);
+
             ufo_task_graph_connect_nodes_full (read_graph, radio_reader, ffc, 0);
             ufo_task_graph_connect_nodes_full (read_graph, dark_reader, ffc, 1);
-            ufo_task_graph_connect_nodes_full (read_graph, flat_avg, ffc, 2);
+            ufo_task_graph_connect_nodes_full (read_graph, flat_interpolate, ffc, 2);
             ufo_task_graph_connect_nodes (read_graph, ffc, data->output);
         }
         else {
@@ -455,8 +526,12 @@ run_cached_reconstruction (Params *params, gchar **argv)
 
         if (with_flat_field_correction (params)) {
             g_object_unref (ffc);
-            g_object_unref (flat_avg);
-            g_object_unref (flat_reader);
+            g_object_unref (flat_before_reader);
+            g_object_unref (flat_before_stack);
+            g_object_unref (flat_before_median);
+            g_object_unref (flat_after_reader);
+            g_object_unref (flat_after_stack);
+            g_object_unref (flat_after_median);
             g_object_unref (dark_reader);
         }
     }

+ 2 - 0
reco.h

@@ -5,9 +5,11 @@
 
 typedef struct {
     gboolean interactive;
+    gboolean write_summed;
     gchar *radios;
     gchar *darks;
     gchar *flats;
+    gchar *flats_after;
     gchar *output;
     gint width;
     gint height;