aboutsummaryrefslogtreecommitdiff
path: root/libcrystfel/src/image.c
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2011-11-15 12:05:55 +0100
committerThomas White <taw@physics.org>2012-02-22 15:27:40 +0100
commit38089071300b8e04ed42236dd08d9055094fb3b8 (patch)
tree91e1487ac820eb549e7652750867cd4fec039097 /libcrystfel/src/image.c
parent404c612223dbfa0210902ebc5c9226927335aa65 (diff)
Introduce "libcrystfel"
Diffstat (limited to 'libcrystfel/src/image.c')
-rw-r--r--libcrystfel/src/image.c144
1 files changed, 144 insertions, 0 deletions
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 <taw@physics.org>
+ *
+ * Part of CrystFEL - crystallography with a FEL
+ *
+ */
+
+
+#include <stdlib.h>
+#include <assert.h>
+#include <math.h>
+#include <stdio.h>
+
+#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 <structname>image</structname> 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; i<flist->n_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;
+}