X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=images%2Fsignature.h;h=791acc6819ef78a49aa4f40157c31888b5dbeb01;hb=d46d9596c225dbbcaef4b76e0828036e3addfbe3;hp=544526387cfc6583373bf478bc5ca446f41ce70f;hpb=956f5794fc8dad3ed98095f578cddbfe342f8db2;p=libucw.git diff --git a/images/signature.h b/images/signature.h index 54452638..791acc68 100644 --- a/images/signature.h +++ b/images/signature.h @@ -5,10 +5,16 @@ 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 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) */ @@ -18,25 +24,43 @@ struct image_vector { /* Fetures 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 */ + 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 */ + byte reserved[3]; } PACKED; -/* Image signature (10 + len * 16 bytes) */ +#define IMAGE_SIG_TEXTURED 0x1 + +/* Image signature (16 + len * 16 bytes) */ struct image_signature { byte len; /* Number of regions */ - byte df; /* average f dist */ - u16 dh; /* average h dist */ - struct image_vector vec; /* Combination of all regions... simple signature */ + byte flags; /* IMAGE_SIG_xxx */ + 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 */ } PACKED; +struct image_cluster { + union { + struct { + s32 dot; /* Dot product of the splitting plane */ + s8 vec[IMAGE_VEC_F]; /* Normal vector of the splitting plane */ + } PACKED; + struct { + u64 pos; /* Cluster size in bytes */ + } PACKED; + } PACKED; +} PACKED; + static inline uns image_signature_size(uns len) { - return 4 + sizeof(struct image_vector) + len * sizeof(struct image_region); + return OFFSETOF(struct image_signature, reg) + len * sizeof(struct image_region); } /* sig-dump.c */ @@ -48,10 +72,11 @@ byte *image_vector_dump(byte *buf, struct image_vector *vec); byte *image_region_dump(byte *buf, struct image_region *reg); struct image_sig_block { - struct image_sig_block *next; - u32 area; /* block area in pixels (usually 16) */ - u32 v[IMAGE_VEC_F]; - u32 x, y; /* block position */ + struct image_sig_block *next; /* linked list */ + u32 x, y; /* block position */ + byte area; /* block area in pixels (usually 16) */ + byte region; /* region index */ + byte v[IMAGE_VEC_F]; /* feature vector */ }; struct image_sig_region { @@ -64,54 +89,43 @@ struct image_sig_region { u64 w_sum; }; -/* sig-seg.c */ - -uns image_sig_segmentation(struct image_sig_block *blocks, uns blocks_count, struct image_sig_region *regions); +struct image_sig_data { + struct image *image; + struct image_sig_block *blocks; + struct image_sig_region regions[IMAGE_REG_MAX]; + u32 cols; + u32 rows; + u32 full_cols; + u32 full_rows; + u32 flags; + u32 area; + u32 valid; + u32 blocks_count; + u32 regions_count; + u32 f[IMAGE_VEC_F]; +}; /* sig-init.c */ -int compute_image_signature(struct image_thread *thread, struct image_signature *sig, struct image *image); - -/* sig-cmp.c */ +int compute_image_signature(struct image_context *ctx, struct image_signature *sig, struct image *image); -#define IMAGE_SIG_DIST_SCALE (3 + 3 + 8 + 16) +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); -uns image_signatures_dist(struct image_signature *sig1, struct image_signature *sig2); +/* sig-seg.c */ -#if 0 -/* K-dimensional interval */ -struct image_bbox { - struct image_vector vec[2]; -}; +void image_sig_segmentation(struct image_sig_data *data); -/* Similarity search tree... will be changed */ -struct image_tree { - uns count; /* Number of images in the tree */ - uns depth; /* Tree depth */ - struct image_bbox bbox; /* Bounding box containing all the */ - struct image_node *nodes; /* Internal nodes */ - struct image_leaf *leaves; /* Leaves */ -}; +/* sig-txt.c */ -/* Internal node in the search tree */ -#define IMAGE_NODE_LEAF 0x80000000 /* Node contains pointer to leaves array */ -#define IMAGE_NODE_DIM 0xff /* Split dimension */ -struct image_node { - u32 val; -}; +void image_sig_detect_textured(struct image_sig_data *data); -/* Leaves in the search tree */ -#define IMAGE_LEAF_LAST 0x80000000 /* Last entry in the list */ -#define IMAGE_LEAF_BITS(i) (31 / IMAGE_VEC_K) /* Number of bits for relative position in i-th dimension */ -struct image_leaf { - u32 flags; /* Relative position in bbox and last node flag */ - oid_t oid; -}; +/* sig-cmp.c */ -#define stk_print_image_vector(v) ({ struct image_vector *_v = v; \ - byte *_s = (byte *) alloca(IMAGE_VEC_K * 6), *_p = _s + sprintf(_s, "%d", _v->f[0]); \ - for (uns _i = 1; _i < IMAGE_VEC_K; _i++) _p += sprintf(_p, " %d", _v->f[_i]); _s; }) -#endif +uns image_signatures_dist(struct image_signature *sig1, struct image_signature *sig2); +uns image_signatures_dist_explain(struct image_signature *sig1, struct image_signature *sig2, void (*msg)(byte *text, void *param), void *param); #endif