diff options
author | Tomas Farago <sensej007@email.cz> | 2019-12-11 16:05:10 +0100 |
---|---|---|
committer | Tomas Farago <sensej007@email.cz> | 2020-02-05 10:33:57 +0100 |
commit | fd1dbaaab5bb182c2fc660992449fee954bc35b3 (patch) | |
tree | 6b9dfd0aeb74c0dd159fe902329b7484d540f1c5 /src | |
parent | 613273cbf1cbf681d19d4649c86b593aea7f2df3 (diff) | |
download | ufo-filters-fd1dbaaab5bb182c2fc660992449fee954bc35b3.tar.gz ufo-filters-fd1dbaaab5bb182c2fc660992449fee954bc35b3.tar.bz2 ufo-filters-fd1dbaaab5bb182c2fc660992449fee954bc35b3.tar.xz ufo-filters-fd1dbaaab5bb182c2fc660992449fee954bc35b3.zip |
find-large-spots: add spot-threshold-mode property
which enables users to choose if pixels below or above the threshold
should be selected, or if the absolute value of the pixel should be
taken for comparison.
Diffstat (limited to 'src')
-rw-r--r-- | src/kernels/morphology.cl | 18 | ||||
-rw-r--r-- | src/ufo-find-large-spots-task.c | 33 |
2 files changed, 46 insertions, 5 deletions
diff --git a/src/kernels/morphology.cl b/src/kernels/morphology.cl index 2f0c38d..af76b58 100644 --- a/src/kernels/morphology.cl +++ b/src/kernels/morphology.cl @@ -17,14 +17,26 @@ * License along with this library. If not, see <http://www.gnu.org/licenses/>. */ +/** + * Set mask to 1 if value exceeds threshold. If sgn is -1, value has to be below + * threshold, if it is 1 it has to be above threshold, if it is 0 absolute value + * is compared. + */ kernel void -set_abs_above_threshold (global float *input, +set_above_threshold (global float *input, global float *output, - const float threshold) + const float threshold, + const int sgn) { int index = get_global_id (1) * get_global_size (0) + get_global_id (0); + float value = input[index]; + if (!sgn) { + value = fabs (value) - threshold; + } else { + value = sgn * (value - threshold); + } - output[index] = fabs (input[index]) > threshold ? 1 : 0; + output[index] = value > 0 ? 1 : 0; } kernel void diff --git a/src/ufo-find-large-spots-task.c b/src/ufo-find-large-spots-task.c index d9b055a..9875ffc 100644 --- a/src/ufo-find-large-spots-task.c +++ b/src/ufo-find-large-spots-task.c @@ -27,9 +27,22 @@ #include "common/ufo-addressing.h" #include "common/ufo-common.h" +typedef enum { + SPOT_THRESHOLD_BELOW = -1, + SPOT_THRESHOLD_ABSOLUTE, + SPOT_THRESHOLD_ABOVE +} SpotThresholdMode; + +static GEnumValue spot_threshold_mode_values[] = { + { SPOT_THRESHOLD_BELOW, "SPOT_THRESHOLD_BELOW", "below" }, + { SPOT_THRESHOLD_ABSOLUTE, "SPOT_THRESHOLD_ABSOLUTE", "absolute" }, + { SPOT_THRESHOLD_ABOVE, "SPOT_THRESHOLD_ABOVE", "above" }, + { 0, NULL, NULL} +}; struct _UfoFindLargeSpotsTaskPrivate { gfloat spot_threshold; + SpotThresholdMode spot_threshold_mode; gfloat grow_threshold; cl_context context; cl_kernel set_ones_kernel, set_threshold_kernel, grow_kernel, holes_kernel, convolution_kernel, sum_kernel; @@ -48,6 +61,7 @@ G_DEFINE_TYPE_WITH_CODE (UfoFindLargeSpotsTask, ufo_find_large_spots_task, UFO_T enum { PROP_0, + PROP_SPOT_THRESHOLD_MODE, PROP_SPOT_THRESHOLD, PROP_GROW_THRESHOLD, PROP_ADDRESSING_MODE, @@ -74,7 +88,7 @@ ufo_find_large_spots_task_setup (UfoTask *task, UFO_RESOURCES_CHECK_SET_AND_RETURN (clRetainContext (priv->context), error); priv->set_ones_kernel = ufo_resources_get_kernel (resources, "morphology.cl", "set_to_ones", NULL, error); - priv->set_threshold_kernel = ufo_resources_get_kernel (resources, "morphology.cl", "set_abs_above_threshold", NULL, error); + priv->set_threshold_kernel = ufo_resources_get_kernel (resources, "morphology.cl", "set_above_threshold", NULL, error); priv->grow_kernel = ufo_resources_get_kernel (resources, "morphology.cl", "grow_region_above_threshold", NULL, error); priv->holes_kernel = ufo_resources_get_kernel (resources, "morphology.cl", "fill_holes", NULL, error); priv->convolution_kernel = ufo_resources_get_kernel (resources, "estimate-noise.cl", "convolve_abs_laplacian_diff", NULL, error); @@ -208,6 +222,7 @@ ufo_find_large_spots_task_process (UfoTask *task, UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->set_threshold_kernel, 0, sizeof (cl_mem), &in_mem)); UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->set_threshold_kernel, 1, sizeof (cl_mem), &priv->aux_mem[0])); UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->set_threshold_kernel, 2, sizeof (cl_int), &priv->spot_threshold)); + UFO_RESOURCES_CHECK_CLERR (clSetKernelArg (priv->set_threshold_kernel, 3, sizeof (cl_int), &priv->spot_threshold_mode)); ufo_profiler_call (profiler, cmd_queue, priv->set_threshold_kernel, 2, requisition->dims, NULL); UFO_RESOURCES_CHECK_CLERR (clEnqueueCopyBuffer (cmd_queue, priv->aux_mem[0], @@ -302,6 +317,9 @@ ufo_find_large_spots_task_set_property (GObject *object, case PROP_SPOT_THRESHOLD: priv->spot_threshold = g_value_get_float (value); break; + case PROP_SPOT_THRESHOLD_MODE: + priv->spot_threshold_mode = g_value_get_enum (value); + break; case PROP_GROW_THRESHOLD: priv->grow_threshold = g_value_get_float (value); break; @@ -326,6 +344,9 @@ ufo_find_large_spots_task_get_property (GObject *object, case PROP_SPOT_THRESHOLD: g_value_set_float (value, priv->spot_threshold); break; + case PROP_SPOT_THRESHOLD_MODE: + g_value_set_enum (value, priv->spot_threshold_mode); + break; case PROP_GROW_THRESHOLD: g_value_set_float (value, priv->grow_threshold); break; @@ -413,9 +434,16 @@ ufo_find_large_spots_task_class_init (UfoFindLargeSpotsTaskClass *klass) g_param_spec_float ("spot-threshold", "Pixels with grey value larger than this are considered as spots", "Pixels with grey value larger than this are considered as spots", - 0.0f, G_MAXFLOAT, 0.0f, + -G_MAXFLOAT, G_MAXFLOAT, 0.0f, G_PARAM_READWRITE); + properties[PROP_SPOT_THRESHOLD_MODE] = + g_param_spec_enum ("spot-threshold-mode", + "Pixels must be either \"below\", \"above\" the spot threshold, or their \"absolute\" value can be compared", + "Pixels must be either \"below\", \"above\" the spot threshold, or their \"absolute\" value can be compared", + g_enum_register_static ("spot-threshold-mode", spot_threshold_mode_values), + SPOT_THRESHOLD_ABSOLUTE, G_PARAM_READWRITE); + properties[PROP_GROW_THRESHOLD] = g_param_spec_float ("grow-threshold", "Spot growing threshold", @@ -443,5 +471,6 @@ ufo_find_large_spots_task_init(UfoFindLargeSpotsTask *self) self->priv = UFO_FIND_LARGE_SPOTS_TASK_GET_PRIVATE(self); self->priv->spot_threshold = 0.0f; self->priv->grow_threshold = 0.0f; + self->priv->spot_threshold_mode = SPOT_THRESHOLD_ABSOLUTE; self->priv->addressing_mode = CL_ADDRESS_MIRRORED_REPEAT; } |