1 #ifndef _IMAGES_SIGNATURE_H
2 #define _IMAGES_SIGNATURE_H
5 extern uns image_sig_min_width, image_sig_min_height;
6 extern uns *image_sig_prequant_thresholds;
7 extern uns image_sig_postquant_min_steps, image_sig_postquant_max_steps, image_sig_postquant_threshold;
8 extern double image_sig_border_size;
9 extern int image_sig_border_bonus;
10 extern double image_sig_inertia_scale[];
11 extern double image_sig_textured_threshold;
12 extern int image_sig_compare_method;
13 extern uns image_sig_cmp_features_weights[];
16 #define IMAGE_REG_F IMAGE_VEC_F
18 #define IMAGE_REG_MAX 16
20 /* K-dimensional feature vector (6 bytes) */
22 byte f[IMAGE_VEC_F]; /* texture features */
25 /* Fetures for image regions (16 bytes) */
27 byte f[IMAGE_VEC_F]; /* texture features - L, u, v, LH, HL, HH */
28 byte h[IMAGE_REG_H]; /* shape/pos features - I1, I2, I3, X, Y */
29 byte wa; /* normalized area percentage */
30 byte wb; /* normalized weight */
34 #define IMAGE_SIG_TEXTURED 0x1
36 /* Image signature (16 + len * 16 bytes) */
37 struct image_signature {
38 byte len; /* Number of regions */
39 byte flags; /* IMAGE_SIG_xxx */
40 u16 cols; /* Image width */
41 u16 rows; /* Image height */
42 u16 df; /* Average weighted f dist */
43 u16 dh; /* Average weighted h dist */
44 struct image_vector vec; /* Average features of all regions... simple signature */
45 struct image_region reg[IMAGE_REG_MAX];/* Feature vector for every region */
48 struct image_cluster {
51 s32 dot; /* Dot product of the splitting plane */
52 s8 vec[IMAGE_VEC_F]; /* Normal vector of the splitting plane */
55 u64 pos; /* Cluster size in bytes */
61 image_signature_size(uns len)
63 return OFFSETOF(struct image_signature, reg) + len * sizeof(struct image_region);
68 #define IMAGE_VECTOR_DUMP_MAX (IMAGE_VEC_F * 16 + 1)
69 #define IMAGE_REGION_DUMP_MAX ((IMAGE_REG_F + IMAGE_REG_H) * 16 + 100)
71 byte *image_vector_dump(byte *buf, struct image_vector *vec);
72 byte *image_region_dump(byte *buf, struct image_region *reg);
74 struct image_sig_block {
75 struct image_sig_block *next; /* linked list */
76 u32 x, y; /* block position */
77 byte area; /* block area in pixels (usually 16) */
78 byte region; /* region index */
79 byte v[IMAGE_VEC_F]; /* feature vector */
82 struct image_sig_region {
83 struct image_sig_block *blocks;
92 struct image_sig_data {
94 struct image_sig_block *blocks;
95 struct image_sig_region regions[IMAGE_REG_MAX];
110 int compute_image_signature(struct image_thread *thread, struct image_signature *sig, struct image *image);
112 int image_sig_init(struct image_thread *thread, struct image_sig_data *data, struct image *image);
113 void image_sig_preprocess(struct image_sig_data *data);
114 void image_sig_finish(struct image_sig_data *data, struct image_signature *sig);
115 void image_sig_cleanup(struct image_sig_data *data);
119 void image_sig_segmentation(struct image_sig_data *data);
123 void image_sig_detect_textured(struct image_sig_data *data);
127 uns image_signatures_dist(struct image_signature *sig1, struct image_signature *sig2);
128 uns image_signatures_dist_explain(struct image_signature *sig1, struct image_signature *sig2, void (*msg)(byte *text, void *param), void *param);