From 38089071300b8e04ed42236dd08d9055094fb3b8 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Tue, 15 Nov 2011 12:05:55 +0100 Subject: Introduce "libcrystfel" --- libcrystfel/src/image.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 libcrystfel/src/image.c (limited to 'libcrystfel/src/image.c') diff --git a/libcrystfel/src/image.c b/libcrystfel/src/image.c new file mode 100644 index 00000000..75a8af0a --- /dev/null +++ b/libcrystfel/src/image.c @@ -0,0 +1,144 @@ +/* + * image.c + * + * Handle images and image features + * + * (c) 2006-2010 Thomas White + * + * Part of CrystFEL - crystallography with a FEL + * + */ + + +#include +#include +#include +#include + +#include "image.h" +#include "utils.h" + +/** + * SECTION:image + * @short_description: Data structure representing an image + * @title: Image + * @section_id: + * @see_also: + * @include: "image.h" + * @Image: + * + * The image structure represents an image, usually one + * frame from a large series of diffraction patterns, which might be from the + * same or different crystals. + */ + + +struct _imagefeaturelist +{ + struct imagefeature *features; + int n_features; +}; + + +void image_add_feature(ImageFeatureList *flist, double fs, double ss, + struct image *parent, double intensity, const char *name) +{ + if ( flist->features ) { + flist->features = realloc(flist->features, + (flist->n_features+1) + *sizeof(struct imagefeature)); + } else { + assert(flist->n_features == 0); + flist->features = malloc(sizeof(struct imagefeature)); + } + + flist->features[flist->n_features].fs = fs; + flist->features[flist->n_features].ss = ss; + flist->features[flist->n_features].intensity = intensity; + flist->features[flist->n_features].parent = parent; + flist->features[flist->n_features].name = name; + flist->features[flist->n_features].valid = 1; + + flist->n_features++; + +} + + +ImageFeatureList *image_feature_list_new() +{ + ImageFeatureList *flist; + + flist = malloc(sizeof(ImageFeatureList)); + + flist->n_features = 0; + flist->features = NULL; + + return flist; +} + + +void image_feature_list_free(ImageFeatureList *flist) +{ + if ( !flist ) return; + + if ( flist->features ) free(flist->features); + free(flist); +} + + +struct imagefeature *image_feature_closest(ImageFeatureList *flist, + double fs, double ss, + double *d, int *idx) +{ + int i; + double dmin = +HUGE_VAL; + int closest = 0; + + for ( i=0; in_features; i++ ) { + + double ds; + + ds = distance(flist->features[i].fs, flist->features[i].ss, + fs, ss); + + if ( ds < dmin ) { + dmin = ds; + closest = i; + } + + } + + if ( dmin < +HUGE_VAL ) { + *d = dmin; + *idx = closest; + return &flist->features[closest]; + } + + *d = +INFINITY; + return NULL; +} + + +int image_feature_count(ImageFeatureList *flist) +{ + if ( flist == NULL ) return 0; + return flist->n_features; +} + + +struct imagefeature *image_get_feature(ImageFeatureList *flist, int idx) +{ + /* Sanity check */ + if ( flist == NULL ) return NULL; + if ( idx > flist->n_features ) return NULL; + + if ( flist->features[idx].valid == 0 ) return NULL; + + return &flist->features[idx]; +} + + +void image_remove_feature(ImageFeatureList *flist, int idx) +{ + flist->features[idx].valid = 0; +} -- cgit v1.2.3