extern uns image_sig_min_width, image_sig_min_height;
extern uns *image_sig_prequant_thresholds;
extern uns image_sig_postquant_min_steps, image_sig_postquant_max_steps, image_sig_postquant_threshold;
+extern double image_sig_border_size;
+extern int image_sig_border_bonus;
+extern double image_sig_inertia_scale[];
+extern double image_sig_textured_threshold;
+extern int image_sig_compare_method;
+extern uns image_sig_cmp_features_weights[];
#define IMAGE_VEC_F 6
#define IMAGE_REG_F IMAGE_VEC_F
-#define IMAGE_REG_H 3
+#define IMAGE_REG_H 5
#define IMAGE_REG_MAX 16
/* K-dimensional feature vector (6 bytes) */
/* Fetures for image regions (16 bytes) */
struct image_region {
- byte f[IMAGE_VEC_F]; /* texture features */
- u16 h[IMAGE_REG_H]; /* shape features */
- u16 wa; /* normalized area percentage */
- u16 wb; /* normalized weight */
+ byte f[IMAGE_VEC_F]; /* texture features - L, u, v, LH, HL, HH */
+ byte h[IMAGE_REG_H]; /* shape/pos features - I1, I2, I3, X, Y */
+ byte wa; /* normalized area percentage */
+ byte wb; /* normalized weight */
+ byte reserved[3];
} PACKED;
-/* Image signature (10 + len * 16 bytes) */
+#define IMAGE_SIG_TEXTURED 0x1
+
+/* Image signature (16 + len * 16 bytes) */
struct image_signature {
byte len; /* Number of regions */
- byte df; /* average f dist */
- u16 dh; /* average h dist */
- struct image_vector vec; /* Combination of all regions... simple signature */
+ byte flags; /* IMAGE_SIG_xxx */
+ u16 cols; /* Image width */
+ u16 rows; /* Image height */
+ u16 df; /* Average weighted f dist */
+ u16 dh; /* Average weighted h dist */
+ struct image_vector vec; /* Average features of all regions... simple signature */
struct image_region reg[IMAGE_REG_MAX];/* Feature vector for every region */
} PACKED;
+struct image_cluster {
+ union {
+ struct {
+ s32 dot; /* Dot product of the splitting plane */
+ s8 vec[IMAGE_VEC_F]; /* Normal vector of the splitting plane */
+ } PACKED;
+ struct {
+ u64 pos; /* Cluster size in bytes */
+ } PACKED;
+ } PACKED;
+} PACKED;
+
static inline uns
image_signature_size(uns len)
{
- return 4 + sizeof(struct image_vector) + len * sizeof(struct image_region);
+ return OFFSETOF(struct image_signature, reg) + len * sizeof(struct image_region);
}
/* sig-dump.c */
struct image_sig_block *next; /* linked list */
u32 x, y; /* block position */
byte area; /* block area in pixels (usually 16) */
+ byte region; /* region index */
byte v[IMAGE_VEC_F]; /* feature vector */
};
u32 rows;
u32 full_cols;
u32 full_rows;
+ u32 flags;
u32 area;
u32 valid;
u32 blocks_count;
void image_sig_segmentation(struct image_sig_data *data);
-/* sig-cmp.c */
+/* sig-txt.c */
+
+void image_sig_detect_textured(struct image_sig_data *data);
-#define IMAGE_SIG_DIST_SCALE (3 + 3 + 8 + 16)
+/* sig-cmp.c */
uns image_signatures_dist(struct image_signature *sig1, struct image_signature *sig2);
+uns image_signatures_dist_explain(struct image_signature *sig1, struct image_signature *sig2, void (*msg)(byte *text, void *param), void *param);
#endif