]> mj.ucw.cz Git - libucw.git/blob - images/signature.h
868f4d1c8b0aece82eb2b30ad56d953774cb3582
[libucw.git] / images / signature.h
1 #ifndef _IMAGES_SIGNATURE_H
2 #define _IMAGES_SIGNATURE_H
3
4 #include "lib/fastbuf.h"
5
6 /* Configuration */
7 extern uns image_sig_min_width, image_sig_min_height;
8 extern uns *image_sig_prequant_thresholds;
9 extern uns image_sig_postquant_min_steps, image_sig_postquant_max_steps, image_sig_postquant_threshold;
10 extern double image_sig_textured_threshold;
11 extern uns image_sig_compare_method;
12
13 #define IMAGE_VEC_F     6
14 #define IMAGE_REG_F     IMAGE_VEC_F
15 #define IMAGE_REG_H     3
16 #define IMAGE_REG_MAX   16
17
18 /* K-dimensional feature vector (6 bytes) */
19 struct image_vector {
20   byte f[IMAGE_VEC_F];          /* texture features */
21 } PACKED;
22
23 /* Fetures for image regions (16 bytes) */
24 struct image_region {
25   byte f[IMAGE_VEC_F];          /* texture features */
26   u16 h[IMAGE_REG_H];           /* shape features */
27   u16 wa;                       /* normalized area percentage */
28   u16 wb;                       /* normalized weight */
29 } PACKED;
30
31 #define IMAGE_SIG_TEXTURED      0x1
32
33 /* Image signature (11 + len * 16 bytes) */
34 struct image_signature {
35   byte len;                     /* Number of regions */
36   byte flags;                   /* IMAGE_SIG_xxx */
37   byte df;                      /* Average f dist */
38   u16 dh;                       /* Average h dist */
39   struct image_vector vec;      /* Combination of all regions... simple signature */
40   struct image_region reg[IMAGE_REG_MAX];/* Feature vector for every region */
41 } PACKED;
42
43 struct image_cluster {
44   union {
45     struct {
46       s32 dot;                  /* Dot product of the splitting plane */
47       byte vec[IMAGE_VEC_F];    /* Normal vector of the splitting plane */
48     };
49     struct {
50       u64 pos;                  /* Cluster size in bytes */
51     };
52   };
53 };
54
55 static inline uns
56 image_signature_size(uns len)
57 {
58   return 5 + sizeof(struct image_vector) + len * sizeof(struct image_region);
59 }
60
61 /* sig-dump.c */
62
63 #define IMAGE_VECTOR_DUMP_MAX (IMAGE_VEC_F * 16 + 1)
64 #define IMAGE_REGION_DUMP_MAX ((IMAGE_REG_F + IMAGE_REG_H) * 16 + 100)
65
66 byte *image_vector_dump(byte *buf, struct image_vector *vec);
67 byte *image_region_dump(byte *buf, struct image_region *reg);
68
69 struct image_sig_block {
70   struct image_sig_block *next;         /* linked list */
71   u32 x, y;                             /* block position */
72   byte area;                            /* block area in pixels (usually 16) */
73   byte region;                          /* region index */
74   byte v[IMAGE_VEC_F];                  /* feature vector */
75 };
76
77 struct image_sig_region {
78   struct image_sig_block *blocks;
79   u32 count;
80   u32 a[IMAGE_VEC_F];
81   u32 b[IMAGE_VEC_F];
82   u32 c[IMAGE_VEC_F];
83   u64 e;
84   u64 w_sum;
85 };
86
87 struct image_sig_data {
88   struct image *image;
89   struct image_sig_block *blocks;
90   struct image_sig_region regions[IMAGE_REG_MAX];
91   u32 cols;
92   u32 rows;
93   u32 full_cols;
94   u32 full_rows;
95   u32 flags;
96   u32 area;
97   u32 valid;
98   u32 blocks_count;
99   u32 regions_count;
100   u32 f[IMAGE_VEC_F];
101 };
102
103 #define IMAGE_VECTOR_SIZE (sizeof(struct image_vector))
104
105 static inline uns
106 bget_image_vector(struct fastbuf *fb, struct image_vector *vec)
107 {
108   breadb(fb, vec, sizeof(*vec));
109   return IMAGE_VECTOR_SIZE;
110 }
111
112 static inline uns
113 bput_image_vector(struct fastbuf *fb, struct image_vector *vec)
114 {
115   bwrite(fb, vec, sizeof(*vec));
116   return IMAGE_VECTOR_SIZE;
117 }
118
119 static inline uns
120 bpeek_image_signature(struct fastbuf *fb)
121 {
122   return image_signature_size(bpeekc(fb));
123 }
124
125 uns get_image_signature(byte *buf, struct image_signature *sig);
126 uns put_image_signature(byte *buf, struct image_signature *sig);
127
128 uns bget_image_signature(struct fastbuf *fb, struct image_signature *sig);
129 uns bput_image_signature(struct fastbuf *fb, struct image_signature *sig);
130
131 /* sig-init.c */
132
133 int compute_image_signature(struct image_thread *thread, struct image_signature *sig, struct image *image);
134
135 int image_sig_init(struct image_thread *thread, struct image_sig_data *data, struct image *image);
136 void image_sig_preprocess(struct image_sig_data *data);
137 void image_sig_finish(struct image_sig_data *data, struct image_signature *sig);
138 void image_sig_cleanup(struct image_sig_data *data);
139
140 /* sig-seg.c */
141
142 void image_sig_segmentation(struct image_sig_data *data);
143
144 /* sig-txt.c */
145
146 void image_sig_detect_textured(struct image_sig_data *data);
147
148 /* sig-cmp.c */
149
150 uns image_signatures_dist(struct image_signature *sig1, struct image_signature *sig2);
151 uns image_signatures_dist_explain(struct image_signature *sig1, struct image_signature *sig2, void (*msg)(byte *text, void *param), void *param);
152
153 #endif
154