]> mj.ucw.cz Git - libucw.git/blob - images/signature.h
revising & testing image library
[libucw.git] / images / signature.h
1 #ifndef _IMAGES_SIGNATURE_H
2 #define _IMAGES_SIGNATURE_H
3
4 /* Configuration */
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[];
14
15 #define IMAGE_VEC_F     6
16 #define IMAGE_REG_F     IMAGE_VEC_F
17 #define IMAGE_REG_H     5
18 #define IMAGE_REG_MAX   16
19
20 /* K-dimensional feature vector (6 bytes) */
21 struct image_vector {
22   byte f[IMAGE_VEC_F];          /* texture features */
23 } PACKED;
24
25 /* Fetures for image regions (16 bytes) */
26 struct image_region {
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 */
31   byte reserved[3];
32 } PACKED;
33
34 #define IMAGE_SIG_TEXTURED      0x1
35
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 */
46 } PACKED;
47
48 struct image_cluster {
49   union {
50     struct {
51       s32 dot;                  /* Dot product of the splitting plane */
52       s8 vec[IMAGE_VEC_F];      /* Normal vector of the splitting plane */
53     } PACKED;
54     struct {
55       u64 pos;                  /* Cluster size in bytes */
56     } PACKED;
57   } PACKED;
58 } PACKED;
59
60 static inline uns
61 image_signature_size(uns len)
62 {
63   return OFFSETOF(struct image_signature, reg) + len * sizeof(struct image_region);
64 }
65
66 /* sig-dump.c */
67
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)
70
71 byte *image_vector_dump(byte *buf, struct image_vector *vec);
72 byte *image_region_dump(byte *buf, struct image_region *reg);
73
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 */
80 };
81
82 struct image_sig_region {
83   struct image_sig_block *blocks;
84   u32 count;
85   u32 a[IMAGE_VEC_F];
86   u32 b[IMAGE_VEC_F];
87   u32 c[IMAGE_VEC_F];
88   u64 e;
89   u64 w_sum;
90 };
91
92 struct image_sig_data {
93   struct image *image;
94   struct image_sig_block *blocks;
95   struct image_sig_region regions[IMAGE_REG_MAX];
96   u32 cols;
97   u32 rows;
98   u32 full_cols;
99   u32 full_rows;
100   u32 flags;
101   u32 area;
102   u32 valid;
103   u32 blocks_count;
104   u32 regions_count;
105   u32 f[IMAGE_VEC_F];
106 };
107
108 /* sig-init.c */
109
110 int compute_image_signature(struct image_context *ctx, struct image_signature *sig, struct image *image);
111
112 int image_sig_init(struct image_context *ctx, 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);
116
117 /* sig-seg.c */
118
119 void image_sig_segmentation(struct image_sig_data *data);
120
121 /* sig-txt.c */
122
123 void image_sig_detect_textured(struct image_sig_data *data);
124
125 /* sig-cmp.c */
126
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);
129
130 #endif
131