3 #define MSG(x...) do{}while(0)
4 #define LINE do{}while(0)
7 image_signatures_dist_2(struct image_signature *sig1, struct image_signature *sig2)
11 #define MSG(x...) do{ line += sprintf(line, x); }while(0)
12 #define LINE do{ line = buf; msg(line, param); }while(0)
15 explain_signature(struct image_signature *sig, void (*msg)(byte *text, void *param), void *param)
17 byte buf[1024], *line = buf;
18 MSG("signature: flags=0x%x df=%u dh=%u f=(%u", sig->flags, sig->df, sig->dh, sig->vec.f[0]);
19 for (uns i = 1; i < IMAGE_VEC_F; i++)
20 MSG(" %u", sig->vec.f[i]);
23 for (uns j = 0; j < sig->len; j++)
25 struct image_region *reg = sig->reg + j;
26 MSG("region %u: wa=%u wb=%u f=(%u", j, reg->wa, reg->wb, reg->f[0]);
27 for (uns i = 1; i < IMAGE_VEC_F; i++)
28 MSG(" %u", reg->f[i]);
29 MSG(") h=(%u", reg->h[0]);
30 for (uns i = 1; i < IMAGE_REG_H; i++)
31 MSG(" %u", reg->h[i]);
38 image_signatures_dist_2_explain(struct image_signature *sig1, struct image_signature *sig2, void (*msg)(byte *text, void *param), void *param)
42 DBG("image_signatures_dist_2()");
44 uns dist[IMAGE_REG_MAX * IMAGE_REG_MAX], p[IMAGE_REG_MAX], q[IMAGE_REG_MAX];
45 uns n, i, j, k, l, s, d;
46 struct image_region *reg1, *reg2;
48 byte buf[1024], *line = buf;
49 explain_signature(sig1, msg, param);
50 explain_signature(sig2, msg, param);
53 /* FIXME: do not mux textured and non-textured images (should be split in clusters tree) */
54 if ((sig1->flags ^ sig2->flags) & IMAGE_SIG_TEXTURED)
56 MSG("Textured vs non-textured");
61 /* Compute distance matrix */
63 MSG("Distance matrix:");
65 /* ... for non-textured images */
66 if (!((sig1->flags | sig2->flags) & IMAGE_SIG_TEXTURED))
67 for (j = 0, reg2 = sig2->reg; j < sig2->len; j++, reg2++)
68 for (i = 0, reg1 = sig1->reg; i < sig1->len; i++, reg1++)
71 isqr((int)reg1->h[0] - (int)reg2->h[0]) +
72 isqr((int)reg1->h[1] - (int)reg2->h[1]) +
73 isqr((int)reg1->h[2] - (int)reg2->h[2]);
75 isqr((int)reg1->f[0] - (int)reg2->f[0]) +
76 isqr((int)reg1->f[1] - (int)reg2->f[1]) +
77 isqr((int)reg1->f[2] - (int)reg2->f[2]) +
78 isqr((int)reg1->f[3] - (int)reg2->f[3]) +
79 isqr((int)reg1->f[4] - (int)reg2->f[4]) +
80 isqr((int)reg1->f[5] - (int)reg2->f[5]);
87 dist[n++] = (dt << 8) + i + (j << 4);
88 DBG("[%u, %u] dt=%u ds=%u", i, j, dt, ds);
89 MSG("[%u, %u] dt=%u ds=%u", i, j, dt, ds);
92 /* ... for textured images (ignore shape properties) */
94 for (j = 0, reg2 = sig2->reg; j < sig2->len; j++, reg2++)
95 for (i = 0, reg1 = sig1->reg; i < sig1->len; i++, reg1++)
98 isqr((int)reg1->f[0] - (int)reg2->f[0]) +
99 isqr((int)reg1->f[1] - (int)reg2->f[1]) +
100 isqr((int)reg1->f[2] - (int)reg2->f[2]) +
101 isqr((int)reg1->f[3] - (int)reg2->f[3]) +
102 isqr((int)reg1->f[4] - (int)reg2->f[4]) +
103 isqr((int)reg1->f[5] - (int)reg2->f[5]);
104 dist[n++] = (dt << 12) + i + (j << 4);
105 DBG("[%u, %u] dt=%u", i, j, dt);
106 MSG("[%u, %u] dt=%u", i, j, dt);
110 /* One or both signatures have no regions */
114 /* Get percentages */
115 for (i = 0, reg1 = sig1->reg; i < sig1->len; i++, reg1++)
117 for (i = 0, reg2 = sig2->reg; i < sig2->len; i++, reg2++)
120 /* Sort entries in distance matrix */
121 image_signatures_dist_2_sort(n, dist);
123 /* Compute significance matrix and resulting distance */
125 MSG("Significance matrix:");
127 for (k = 0, l = 128; l; k++)
130 j = (dist[k] >> 4) & 15;
146 DBG("[%u, %u] s=%u d=%u", i, j, s, d);
147 MSG("[%u, %u] s=%u d=%u", i, j, s, d);