#ifndef _IMAGES_SIGNATURE_H
#define _IMAGES_SIGNATURE_H
-#include "lib/fastbuf.h"
-
/* Configuration */
extern uns image_sig_min_width, image_sig_min_height;
extern uns *image_sig_prequant_thresholds;
extern uns image_sig_postquant_min_steps, image_sig_postquant_max_steps, image_sig_postquant_threshold;
+extern double image_sig_border_size;
+extern int image_sig_border_bonus;
+extern double image_sig_inertia_scale[];
extern double image_sig_textured_threshold;
-extern uns image_sig_compare_method;
+extern int image_sig_compare_method;
+extern uns image_sig_cmp_features_weights[];
#define IMAGE_VEC_F 6
#define IMAGE_REG_F IMAGE_VEC_F
-#define IMAGE_REG_H 3
+#define IMAGE_REG_H 5
#define IMAGE_REG_MAX 16
/* K-dimensional feature vector (6 bytes) */
byte f[IMAGE_VEC_F]; /* texture features */
} PACKED;
-/* Fetures for image regions (16 bytes) */
+/* Features for image regions (16 bytes) */
struct image_region {
- byte f[IMAGE_VEC_F]; /* texture features */
- u16 h[IMAGE_REG_H]; /* shape features */
- u16 wa; /* normalized area percentage */
- u16 wb; /* normalized weight */
-} PACKED;
+ byte f[IMAGE_VEC_F]; /* texture features - L, u, v, LH, HL, HH */
+ byte h[IMAGE_REG_H]; /* shape/pos features - I1, I2, I3, X, Y */
+ byte wa; /* normalized area percentage */
+ byte wb; /* normalized weight */
+};
#define IMAGE_SIG_TEXTURED 0x1
-/* Image signature (11 + len * 16 bytes) */
+/* Image signature (usually 16 + len * 16 bytes) */
struct image_signature {
- byte len; /* Number of regions */
+ byte len; /* number of regions */
byte flags; /* IMAGE_SIG_xxx */
- byte df; /* Average f dist */
- u16 dh; /* Average h dist */
- struct image_vector vec; /* Combination of all regions... simple signature */
- struct image_region reg[IMAGE_REG_MAX];/* Feature vector for every region */
-} PACKED;
+ u16 cols; /* image width */
+ u16 rows; /* image height */
+ u16 df; /* average weighted f dist */
+ u16 dh; /* average weighted h dist */
+ struct image_vector vec; /* average features of all regions... simple signature */
+ struct image_region reg[IMAGE_REG_MAX];/* feature vector for every region */
+};
struct image_cluster {
union {
struct {
- s32 dot; /* Dot product of the splitting plane */
- byte vec[IMAGE_VEC_F]; /* Normal vector of the splitting plane */
+ s32 dot; /* dot product of the splitting plane */
+ s8 vec[IMAGE_VEC_F]; /* normal vector of the splitting plane */
};
struct {
- u64 pos; /* Cluster size in bytes */
+ u64 pos; /* cluster size in bytes */
};
};
};
static inline uns
image_signature_size(uns len)
{
- return 5 + sizeof(struct image_vector) + len * sizeof(struct image_region);
+ return OFFSETOF(struct image_signature, reg) + len * sizeof(struct image_region);
}
/* sig-dump.c */
u32 f[IMAGE_VEC_F];
};
-/* sig-fb.c */
-
-#define IMAGE_VECTOR_SIZE (sizeof(struct image_vector))
-
-static inline uns
-image_vector_read(struct fastbuf *fb, struct image_vector *vec)
-{
- breadb(fb, vec, sizeof(*vec));
- return IMAGE_VECTOR_SIZE;
-}
-
-static inline uns
-image_vector_write(struct fastbuf *fb, struct image_vector *vec)
-{
- bwrite(fb, vec, sizeof(*vec));
- return IMAGE_VECTOR_SIZE;
-}
-
-static inline uns
-image_signature_peek_size(struct fastbuf *fb)
-{
- return image_signature_size(bpeekc(fb));
-}
-
-uns image_signature_read(struct fastbuf *fb, struct image_signature *sig);
-uns image_signature_write(struct fastbuf *fb, struct image_signature *sig);
-
/* sig-init.c */
-int compute_image_signature(struct image_thread *thread, struct image_signature *sig, struct image *image);
+int compute_image_signature(struct image_context *ctx, struct image_signature *sig, struct image *image);
-int image_sig_init(struct image_thread *thread, struct image_sig_data *data, struct image *image);
+int image_sig_init(struct image_context *ctx, struct image_sig_data *data, struct image *image);
void image_sig_preprocess(struct image_sig_data *data);
void image_sig_finish(struct image_sig_data *data, struct image_signature *sig);
void image_sig_cleanup(struct image_sig_data *data);