summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomas Farago <sensej007@email.cz>2019-08-08 12:28:00 +0200
committerGitHub <noreply@github.com>2019-08-08 12:28:00 +0200
commitbba3b7a9f10df6f53ad3467637b22658a7948aa0 (patch)
tree3346472b81c7ed0fe0f0b28d2a865f699ee19e26
parent3888f4b62342f6a216acbb0164ed26283cc0f6dc (diff)
parentf45d388ca9253dd68b43f5635a1db6f3b4ffacc7 (diff)
downloadufo-filters-bba3b7a9f10df6f53ad3467637b22658a7948aa0.tar.gz
ufo-filters-bba3b7a9f10df6f53ad3467637b22658a7948aa0.tar.bz2
ufo-filters-bba3b7a9f10df6f53ad3467637b22658a7948aa0.tar.xz
ufo-filters-bba3b7a9f10df6f53ad3467637b22658a7948aa0.zip
Merge pull request #183 from ldorofeeva/master
Enhancement: add flat-field multiplier to ffc filter
-rw-r--r--docs/filters.rst3
-rw-r--r--src/kernels/ffc.cl8
-rw-r--r--src/ufo-flat-field-correct-task.c18
3 files changed, 26 insertions, 3 deletions
diff --git a/docs/filters.rst b/docs/filters.rst
index bd7044d..c04b536 100644
--- a/docs/filters.rst
+++ b/docs/filters.rst
@@ -902,6 +902,9 @@ Flat-field correction
Scale the dark field prior to the flat field correct.
+ .. gobj:prop:: flat-scale:float
+
+ Scale the flat field prior to the flat field correct.
Sinogram transposition
----------------------
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;
}