summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorelisa <elisa@elisa-debian.gateway.sasktel.net>2019-07-24 11:06:05 -0600
committerelisa <elisa@elisa-debian.gateway.sasktel.net>2019-07-24 11:06:05 -0600
commite940e9a9461b1e6daa45dad04b5155b0e86acfa4 (patch)
treeae0117a6fa0a565f863afe7e43b2e865ec78805b
parent0eb7aa76b06a2c71b492b6c5eade5b7de470da7e (diff)
downloadufo-filters-e940e9a9461b1e6daa45dad04b5155b0e86acfa4.tar.gz
ufo-filters-e940e9a9461b1e6daa45dad04b5155b0e86acfa4.tar.bz2
ufo-filters-e940e9a9461b1e6daa45dad04b5155b0e86acfa4.tar.xz
ufo-filters-e940e9a9461b1e6daa45dad04b5155b0e86acfa4.zip
Enhancement: add flat-field multiplier
-rw-r--r--src/kernels/ffc.cl8
-rw-r--r--src/ufo-flat-field-correct-task.c18
2 files changed, 23 insertions, 3 deletions
diff --git a/src/kernels/ffc.cl b/src/kernels/ffc.cl
index c936d1e..783b045 100644
--- a/src/kernels/ffc.cl
+++ b/src/kernels/ffc.cl
@@ -25,18 +25,20 @@ flat_correct (global float *corrected,
const int sinogram_input,
const int absorptivity,
const int fix_abnormal,
- const float dark_scale)
+ const float dark_scale,
+ const float flat_scale)
{
const int gid = get_global_id(1) * get_global_size(0) + get_global_id(0);
const int corr_idx = sinogram_input ? get_global_id(0) : gid;
const float cdark = dark[corr_idx] * dark_scale;
+ const float cflat = flat[corr_idx] * flat_scale;
float result;
if (absorptivity) {
- result = log ((flat[corr_idx] - cdark) / (data[gid] - cdark));
+ result = log ((cflat - cdark) / (data[gid] - cdark));
}
else {
- result = (data[gid] - cdark) / (flat[corr_idx] - cdark);
+ result = (data[gid] - cdark) / (cflat - cdark);
}
if (fix_abnormal && (isnan (result) || isinf (result))) {
diff --git a/src/ufo-flat-field-correct-task.c b/src/ufo-flat-field-correct-task.c
index 38ff731..4378bfc 100644
--- a/src/ufo-flat-field-correct-task.c
+++ b/src/ufo-flat-field-correct-task.c
@@ -31,6 +31,7 @@ struct _UfoFlatFieldCorrectTaskPrivate {
gboolean absorptivity;
gboolean sinogram_input;
gfloat dark_scale;
+ gfloat flat_scale;
cl_kernel kernel;
};
@@ -48,6 +49,7 @@ enum {
PROP_ABSORPTIVITY,
PROP_SINOGRAM_INPUT,
PROP_DARK_SCALE,
+ PROP_FLAT_SCALE,
N_PROPERTIES
};
@@ -153,6 +155,7 @@ ufo_flat_field_correct_task_process (UfoTask *task,
UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 5, sizeof (cl_int), &absorptivity));
UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 6, sizeof (cl_int), &fix_nan_and_inf));
UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 7, sizeof (cl_float), &priv->dark_scale));
+ UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->kernel, 8, sizeof (cl_float), &priv->flat_scale));
profiler = ufo_task_node_get_profiler (UFO_TASK_NODE (task));
ufo_profiler_call (profiler, cmd_queue, priv->kernel, 2, requisition->dims, NULL);
@@ -181,6 +184,10 @@ ufo_flat_field_correct_task_set_property (GObject *object,
case PROP_DARK_SCALE:
priv->dark_scale = g_value_get_float (value);
break;
+ case PROP_FLAT_SCALE:
+ priv->flat_scale = g_value_get_float (value);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -208,6 +215,9 @@ ufo_flat_field_correct_task_get_property (GObject *object,
case PROP_DARK_SCALE:
g_value_set_float (value, priv->dark_scale);
break;
+ case PROP_FLAT_SCALE:
+ g_value_set_float (value, priv->flat_scale);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -277,6 +287,13 @@ ufo_flat_field_correct_task_class_init (UfoFlatFieldCorrectTaskClass *klass)
-G_MAXFLOAT, G_MAXFLOAT, 1.0f,
G_PARAM_READWRITE);
+ properties[PROP_FLAT_SCALE] =
+ g_param_spec_float ("flat-scale",
+ "Scale the flat field prior to the flat field correct",
+ "Scale the flat field prior to the flat field correct",
+ -G_MAXFLOAT, G_MAXFLOAT, 1.0f,
+ G_PARAM_READWRITE);
+
for (guint i = PROP_0 + 1; i < N_PROPERTIES; i++)
g_object_class_install_property (gobject_class, i, properties[i]);
@@ -292,4 +309,5 @@ ufo_flat_field_correct_task_init(UfoFlatFieldCorrectTask *self)
self->priv->sinogram_input = FALSE;
self->priv->kernel = NULL;
self->priv->dark_scale = 1.0f;
+ self->priv->flat_scale = 1.0f;
}