/* * itrans-threshold.c * * Threshold and adaptive threshold peak searches * * (c) 2007 Thomas White * * dtr - Diffraction Tomography Reconstruction * */ #ifdef HAVE_CONFIG_H #include #endif #include #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 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 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)0)?max_x-10:0); x<((max_x+10) 50 ); return n_reflections; }