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_textured_threshold;
9 extern uns image_sig_compare_method;
12 #define IMAGE_REG_F IMAGE_VEC_F
14 #define IMAGE_REG_MAX 16
16 /* K-dimensional feature vector (6 bytes) */
18 byte f[IMAGE_VEC_F]; /* texture features */
21 /* Fetures for image regions (16 bytes) */
23 byte f[IMAGE_VEC_F]; /* texture features */
24 u16 h[IMAGE_REG_H]; /* shape features */
25 u16 wa; /* normalized area percentage */
26 u16 wb; /* normalized weight */
29 #define IMAGE_SIG_TEXTURED 0x1
31 /* Image signature (11 + len * 16 bytes) */
32 struct image_signature {
33 byte len; /* Number of regions */
34 byte flags; /* IMAGE_SIG_xxx */
35 byte df; /* Average f dist */
36 u16 dh; /* Average h dist */
37 struct image_vector vec; /* Combination of all regions... simple signature */
38 struct image_region reg[IMAGE_REG_MAX];/* Feature vector for every region */
41 struct image_cluster {
44 s32 dot; /* Dot product of the splitting plane */
45 s8 vec[IMAGE_VEC_F]; /* Normal vector of the splitting plane */
48 u64 pos; /* Cluster size in bytes */
54 image_signature_size(uns len)
56 return 5 + sizeof(struct image_vector) + len * sizeof(struct image_region);
61 #define IMAGE_VECTOR_DUMP_MAX (IMAGE_VEC_F * 16 + 1)
62 #define IMAGE_REGION_DUMP_MAX ((IMAGE_REG_F + IMAGE_REG_H) * 16 + 100)
64 byte *image_vector_dump(byte *buf, struct image_vector *vec);
65 byte *image_region_dump(byte *buf, struct image_region *reg);
67 struct image_sig_block {
68 struct image_sig_block *next; /* linked list */
69 u32 x, y; /* block position */
70 byte area; /* block area in pixels (usually 16) */
71 byte region; /* region index */
72 byte v[IMAGE_VEC_F]; /* feature vector */
75 struct image_sig_region {
76 struct image_sig_block *blocks;
85 struct image_sig_data {
87 struct image_sig_block *blocks;
88 struct image_sig_region regions[IMAGE_REG_MAX];
103 #define IMAGE_VECTOR_SIZE (sizeof(struct image_vector))
106 image_vector_read(struct fastbuf *fb, struct image_vector *vec)
108 breadb(fb, vec, sizeof(*vec));
109 return IMAGE_VECTOR_SIZE;
113 image_vector_write(struct fastbuf *fb, struct image_vector *vec)
115 bwrite(fb, vec, sizeof(*vec));
116 return IMAGE_VECTOR_SIZE;
120 image_signature_peek_size(struct fastbuf *fb)
122 return image_signature_size(bpeekc(fb));
125 uns image_signature_read(struct fastbuf *fb, struct image_signature *sig);
126 uns image_signature_write(struct fastbuf *fb, struct image_signature *sig);
130 int compute_image_signature(struct image_thread *thread, struct image_signature *sig, struct image *image);
132 int image_sig_init(struct image_thread *thread, struct image_sig_data *data, struct image *image);
133 void image_sig_preprocess(struct image_sig_data *data);
134 void image_sig_finish(struct image_sig_data *data, struct image_signature *sig);
135 void image_sig_cleanup(struct image_sig_data *data);
139 void image_sig_segmentation(struct image_sig_data *data);
143 void image_sig_detect_textured(struct image_sig_data *data);
147 uns image_signatures_dist(struct image_signature *sig1, struct image_signature *sig2);
148 uns image_signatures_dist_explain(struct image_signature *sig1, struct image_signature *sig2, void (*msg)(byte *text, void *param), void *param);