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;
10 #define IMAGE_REG_F IMAGE_VEC_F
12 #define IMAGE_REG_MAX 16
14 /* K-dimensional feature vector (6 bytes) */
16 byte f[IMAGE_VEC_F]; /* texture features */
19 /* Fetures for image regions (16 bytes) */
21 byte f[IMAGE_VEC_F]; /* texture features */
22 u16 h[IMAGE_REG_H]; /* shape features */
23 u16 wa; /* normalized area percentage */
24 u16 wb; /* normalized weight */
27 /* Image signature (10 + len * 16 bytes) */
28 struct image_signature {
29 byte len; /* Number of regions */
30 byte df; /* average f dist */
31 u16 dh; /* average h dist */
32 struct image_vector vec; /* Combination of all regions... simple signature */
33 struct image_region reg[IMAGE_REG_MAX];/* Feature vector for every region */
37 image_signature_size(uns len)
39 return 4 + sizeof(struct image_vector) + len * sizeof(struct image_region);
44 #define IMAGE_VECTOR_DUMP_MAX (IMAGE_VEC_F * 16 + 1)
45 #define IMAGE_REGION_DUMP_MAX ((IMAGE_REG_F + IMAGE_REG_H) * 16 + 100)
47 byte *image_vector_dump(byte *buf, struct image_vector *vec);
48 byte *image_region_dump(byte *buf, struct image_region *reg);
50 struct image_sig_block {
51 struct image_sig_block *next;
52 u32 area; /* block area in pixels (usually 16) */
54 u32 x, y; /* block position */
57 struct image_sig_region {
58 struct image_sig_block *blocks;
67 struct image_sig_data {
69 struct image_sig_block *blocks;
70 struct image_sig_region regions[IMAGE_REG_MAX];
84 int compute_image_signature(struct image_thread *thread, struct image_signature *sig, struct image *image);
86 int image_sig_init(struct image_thread *thread, struct image_sig_data *data, struct image *image);
87 void image_sig_preprocess(struct image_sig_data *data);
88 void image_sig_finish(struct image_sig_data *data, struct image_signature *sig);
89 void image_sig_cleanup(struct image_sig_data *data);
93 void image_sig_segmentation(struct image_sig_data *data);
97 #define IMAGE_SIG_DIST_SCALE (3 + 3 + 8 + 16)
99 uns image_signatures_dist(struct image_signature *sig1, struct image_signature *sig2);
102 /* K-dimensional interval */
104 struct image_vector vec[2];
107 /* Similarity search tree... will be changed */
109 uns count; /* Number of images in the tree */
110 uns depth; /* Tree depth */
111 struct image_bbox bbox; /* Bounding box containing all the */
112 struct image_node *nodes; /* Internal nodes */
113 struct image_leaf *leaves; /* Leaves */
116 /* Internal node in the search tree */
117 #define IMAGE_NODE_LEAF 0x80000000 /* Node contains pointer to leaves array */
118 #define IMAGE_NODE_DIM 0xff /* Split dimension */
123 /* Leaves in the search tree */
124 #define IMAGE_LEAF_LAST 0x80000000 /* Last entry in the list */
125 #define IMAGE_LEAF_BITS(i) (31 / IMAGE_VEC_K) /* Number of bits for relative position in i-th dimension */
127 u32 flags; /* Relative position in bbox and last node flag */
131 #define stk_print_image_vector(v) ({ struct image_vector *_v = v; \
132 byte *_s = (byte *) alloca(IMAGE_VEC_K * 6), *_p = _s + sprintf(_s, "%d", _v->f[0]); \
133 for (uns _i = 1; _i < IMAGE_VEC_K; _i++) _p += sprintf(_p, " %d", _v->f[_i]); _s; })