2 * Image Library -- Comparitions of image signatures
4 * (c) 2006 Pavel Charvat <pchar@ucw.cz>
6 * This software may be freely distributed and used according to the terms
7 * of the GNU Lesser General Public License.
14 #include "lib/fastbuf.h"
15 #include "images/math.h"
16 #include "images/images.h"
17 #include "images/signature.h"
22 image_signatures_dist_1(struct image_signature *sig1, struct image_signature *sig2)
24 DBG("image_signatures_dist_1()");
28 struct image_region *reg1 = sig1->reg;
29 struct image_region *reg2 = sig2->reg;
30 uns mf[IMAGE_REG_MAX][IMAGE_REG_MAX], mh[IMAGE_REG_MAX][IMAGE_REG_MAX];
31 uns lf[IMAGE_REG_MAX * 2], lh[IMAGE_REG_MAX * 2];
32 uns df = sig1->df + sig2->df, dh = sig1->dh + sig2->dh;
34 /* Compute distance matrix */
35 for (uns i = 0; i < cnt1; i++)
36 for (uns j = 0; j < cnt2; j++)
39 for (uns k = 0; k < IMAGE_REG_F; k++)
41 int dif = reg1[i].f[k] - reg2[j].f[k];
46 for (uns k = 0; k < IMAGE_REG_H; k++)
48 int dif = reg1[i].h[k] - reg2[j].h[k];
55 for (uns i = 0; i < cnt1; i++)
57 uns f = mf[i][0], h = mh[i][0];
58 for (uns j = 1; j < cnt2; j++)
63 lf[i] = (df * 0x10000) / (df + fast_sqrt_u32(f));
64 lh[i] = (dh * 0x10000) / (dh + fast_sqrt_u32(h));
65 lfs += lf[i] * (6 * reg1[i].wa + 2 * reg1[i].wb);
66 lhs += lh[i] * reg1[i].wa;
68 for (uns i = 0; i < cnt2; i++)
70 uns f = mf[0][i], h = mh[0][i];
71 for (uns j = 1; j < cnt1; j++)
76 lf[i + cnt1] = (df * 0x10000) / (df + fast_sqrt_u32(f));
77 lh[i + cnt1] = (dh * 0x10000) / (dh + fast_sqrt_u32(h));
78 lfs += lf[i] * (6 * reg2[i].wa + 2 * reg2[i].wb);
79 lhs += lh[i] * reg2[i].wa;
82 uns measure = lfs * 6 + lhs * 2 * 8;
85 /* Display similarity vectors */
86 byte buf[2 * IMAGE_REG_MAX * 16 + 3], *b = buf;
87 for (uns i = 0; i < cnt1 + cnt2; i++)
92 *b++ = '~', *b++ = ' ';
93 b += sprintf(b, "%.4f", (double)lf[i] / 0x10000);
98 for (uns i = 0; i < cnt1 + cnt2; i++)
103 *b++ = '~', *b++ = ' ';
104 b += sprintf(b, "%.4f", (double)lh[i] / 0x10000);
108 DBG("Lfm=%.4f", lfs / (double)(1 << (3 + 8 + 16)));
109 DBG("Lhm=%.4f", lhs / (double)(1 << (8 + 16)));
110 DBG("measure=%.4f", measure / (double)(1 << (3 + 3 + 8 + 16)));
113 return (1 << (3 + 3 + 8 + 16)) - measure;
116 #define ASORT_PREFIX(x) image_signatures_dist_2_##x
117 #define ASORT_KEY_TYPE uns
118 #define ASORT_ELT(i) items[i]
119 #define ASORT_EXTRA_ARGS , uns *items
120 #include "lib/arraysort.h"
123 #include "images/sig-cmp-gen.h"
124 #include "images/sig-cmp-gen.h"
127 image_signatures_dist(struct image_signature *sig1, struct image_signature *sig2)
129 switch (image_sig_compare_method)
132 return image_signatures_dist_1(sig1, sig2);
134 return image_signatures_dist_2(sig1, sig2);
136 die("Invalid image signatures compare method.");
141 image_signatures_dist_explain(struct image_signature *sig1, struct image_signature *sig2, struct fastbuf *fb)
143 if (image_sig_compare_method == 2)
144 return image_signatures_dist_2_explain(sig1, sig2, fb);
145 return image_signatures_dist(sig1, sig2);