diff options
author | taw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1> | 2007-03-31 12:50:00 +0000 |
---|---|---|
committer | taw27 <taw27@bf6ca9ba-c028-0410-8290-897cf20841d1> | 2007-03-31 12:50:00 +0000 |
commit | 3bc91ef5e88444cbd9366f0b1516a91af6313e8d (patch) | |
tree | 4cd3fa16fe8cc241cd37c46d2c69d556c9b5825d /src/itrans-threshold.c | |
parent | 8810e9ff13e9fb0db420dbdc529ef2f9dfe89d7c (diff) |
Tidy up itrans framework: move each peak detection algorithm to its own file
Fit svn::ignore properties (again?)
git-svn-id: svn://cook.msm.cam.ac.uk:745/diff-tomo/dtr@16 bf6ca9ba-c028-0410-8290-897cf20841d1
Diffstat (limited to 'src/itrans-threshold.c')
-rw-r--r-- | src/itrans-threshold.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/src/itrans-threshold.c b/src/itrans-threshold.c new file mode 100644 index 0000000..3a1d788 --- /dev/null +++ b/src/itrans-threshold.c @@ -0,0 +1,106 @@ +/* + * itrans-threshold.c + * + * Threshold and adaptive threshold peak searches + * + * (c) 2007 Thomas White <taw27@cam.ac.uk> + * + * dtr - Diffraction Tomography Reconstruction + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdint.h> + +#include "control.h" +#include "imagedisplay.h" +#include "reflections.h" + +unsigned int itrans_peaksearch_threshold(int16_t *image, ControlContext *ctx, double tilt_degrees, ImageDisplay *imagedisplay) { + + int width, height; + int x, y; + unsigned int n_reflections = 0; + + width = ctx->width; height = ctx->height; + + /* Simple Thresholding */ + for ( y=0; y<height; y++ ) { + for ( x=0; x<width; x++ ) { + + if ( image[x + width*y] > 10 ) { + if ( ctx->fmode == FORMULATION_PIXELSIZE ) { + reflection_add_from_reciprocal(ctx, (signed)(x-ctx->x_centre)*ctx->pixel_size, (signed)(y-ctx->y_centre)*ctx->pixel_size, + tilt_degrees, image[x + width*y]); + } else { + reflection_add_from_dp(ctx, (signed)(x-ctx->x_centre), (signed)(y-ctx->y_centre), tilt_degrees, image[x + width*y]); + } + if ( ctx->first_image ) { + imagedisplay_mark_point(imagedisplay, x, y); + } + n_reflections++; + } + + } + } + + return n_reflections; + +} + +unsigned int itrans_peaksearch_adaptive_threshold(int16_t *image, ControlContext *ctx, double tilt_degrees, ImageDisplay *imagedisplay) { + + int16_t max_val = 0; + int width, height; + unsigned int n_reflections = 0; + + width = ctx->width; height = ctx->height; + + /* Adaptive Thresholding */ + do { + + int max_x = 0; + int max_y = 0;; + int x, y; + + /* Locate the highest point */ + max_val = 0; + for ( y=0; y<height; y++ ) { + for ( x=0; x<width; x++ ) { + + if ( image[x + width*y] > max_val ) { + max_val = image[x + width*y]; + max_x = x; max_y = y; + } + + } + } + + if ( max_val > 50 ) { + if ( ctx->fmode == FORMULATION_PIXELSIZE ) { + reflection_add_from_reciprocal(ctx, (signed)(max_x-ctx->x_centre)*ctx->pixel_size, (signed)(max_y-ctx->y_centre)*ctx->pixel_size, + tilt_degrees, max_val); + } else { + reflection_add_from_dp(ctx, (signed)(max_x-ctx->x_centre), (signed)(max_y-ctx->y_centre), tilt_degrees, max_val); + } + if ( ctx->first_image ) { + imagedisplay_mark_point(imagedisplay, max_x, max_y); + } + n_reflections++; + + /* Remove it and its surroundings */ + for ( y=((max_y-10>0)?max_y-10:0); y<((max_y+10)<height?max_y+10:height); y++ ) { + for ( x=((max_x-10>0)?max_x-10:0); x<((max_x+10)<width?max_x+10:width); x++ ) { + image[x + width*y] = 0; + } + } + } + + } while ( max_val > 50 ); + + return n_reflections; + +} |