From f0a4d5cf71aa209c5d2d69abcef85d6c0e27ccb8 Mon Sep 17 00:00:00 2001 From: Pavel Charvat Date: Wed, 6 Sep 2006 14:09:55 +0200 Subject: [PATCH] more verbose IMAGESIM explain for debug purposes --- images/image-sim-test.c | 10 ++- images/sig-cmp-gen.h | 136 ++++++++++++++++++++++++++++++++++++++++ images/sig-cmp.c | 102 ++++-------------------------- images/signature.h | 3 +- 4 files changed, 158 insertions(+), 93 deletions(-) create mode 100644 images/sig-cmp-gen.h diff --git a/images/image-sim-test.c b/images/image-sim-test.c index d8b8474d..e0a1899e 100644 --- a/images/image-sim-test.c +++ b/images/image-sim-test.c @@ -264,7 +264,15 @@ main(int argc, char **argv) if (img1 && img2) { - uns dist = image_signatures_dist(&sig1, &sig2); + uns dist; + if (verbose) + { + struct fastbuf *fb = bfdopen(0, 4096); + dist = image_signatures_dist_explain(&sig1, &sig2, fb); + bclose(fb); + } + else + dist = image_signatures_dist(&sig1, &sig2); MSG("dist=%u", dist); } diff --git a/images/sig-cmp-gen.h b/images/sig-cmp-gen.h new file mode 100644 index 00000000..804f1f0c --- /dev/null +++ b/images/sig-cmp-gen.h @@ -0,0 +1,136 @@ +#ifndef SIG_EXPLAIN + +#define MSG(x...) do{}while(0) + +static uns +image_signatures_dist_2(struct image_signature *sig1, struct image_signature *sig2) + +#else + +#define MSG(x...) bprintf(fb, x) + +static void +dump_signature(struct image_signature *sig, struct fastbuf *fb) +{ + MSG("signature: flags=0x%x df=%u dh=%u f=(%u", sig->flags, sig->df, sig->dh, sig->vec.f[0]); + for (uns i = 1; i < IMAGE_VEC_F; i++) + MSG(" %u", sig->vec.f[i]); + MSG(")\n"); + for (uns j = 0; j < sig->len; j++) + { + struct image_region *reg = sig->reg + j; + MSG("region %u: wa=%u wb=%u f=(%u", j, reg->wa, reg->wb, reg->f[0]); + for (uns i = 1; i < IMAGE_VEC_F; i++) + MSG(" %u", reg->f[i]); + MSG(") h=(%u", reg->h[0]); + for (uns i = 1; i < IMAGE_REG_H; i++) + MSG(" %u", reg->h[i]); + MSG(")\n"); + } +} + +static uns +image_signatures_dist_2_explain(struct image_signature *sig1, struct image_signature *sig2, struct fastbuf *fb) + +#endif +{ + DBG("image_signatures_dist_2()"); + + uns dist[IMAGE_REG_MAX * IMAGE_REG_MAX], p[IMAGE_REG_MAX], q[IMAGE_REG_MAX]; + uns n, i, j, k, l, s, d; + struct image_region *reg1, *reg2; + +#ifdef SIG_EXPLAIN + dump_signature(sig1, fb); + dump_signature(sig2, fb); +#endif + + /* Compute distance matrix */ + n = 0; + MSG("Distance matrix:\n"); + /* ... for non-textured images */ + if (!((sig1->flags | sig2->flags) & IMAGE_SIG_TEXTURED)) + for (j = 0, reg2 = sig2->reg; j < sig2->len; j++, reg2++) + for (i = 0, reg1 = sig1->reg; i < sig1->len; i++, reg1++) + { + uns ds = + isqr((int)reg1->h[0] - (int)reg2->h[0]) + + isqr((int)reg1->h[1] - (int)reg2->h[1]) + + isqr((int)reg1->h[2] - (int)reg2->h[2]); + uns dt = + isqr((int)reg1->f[0] - (int)reg2->f[0]) + + isqr((int)reg1->f[1] - (int)reg2->f[1]) + + isqr((int)reg1->f[2] - (int)reg2->f[2]) + + isqr((int)reg1->f[3] - (int)reg2->f[3]) + + isqr((int)reg1->f[4] - (int)reg2->f[4]) + + isqr((int)reg1->f[5] - (int)reg2->f[5]); + if (ds < 1000) + dt *= 8; + else if (ds < 10000) + dt *= 12; + else + dt *= 16; + DBG("[%u][%u] ... dt=%u ds=%u", i, j, dt, ds); + dist[n++] = (dt << 8) + i + (j << 4); + MSG("[%u, %u] ... dt=%u ds=%u\n", i, j, dt, ds); + } + /* ... for textured images (ignore shape properties) */ + else + for (j = 0, reg2 = sig2->reg; j < sig2->len; j++, reg2++) + for (i = 0, reg1 = sig1->reg; i < sig1->len; i++, reg1++) + { + uns dt = + isqr((int)reg1->f[0] - (int)reg2->f[0]) + + isqr((int)reg1->f[1] - (int)reg2->f[1]) + + isqr((int)reg1->f[2] - (int)reg2->f[2]) + + isqr((int)reg1->f[3] - (int)reg2->f[3]) + + isqr((int)reg1->f[4] - (int)reg2->f[4]) + + isqr((int)reg1->f[5] - (int)reg2->f[5]); + dist[n++] = (dt << 12) + i + (j << 4); + MSG("[%u, %u] ... dt=%u\n", i, j, dt); + } + + /* One or both signatures have no regions */ + if (!n) + return 0xffffffff; + + /* Get percentages */ + for (i = 0, reg1 = sig1->reg; i < sig1->len; i++, reg1++) + p[i] = reg1->wb; + for (i = 0, reg2 = sig2->reg; i < sig2->len; i++, reg2++) + q[i] = reg2->wb; + + /* Sort entries in distance matrix */ + image_signatures_dist_2_sort(n, dist); + + /* Compute significance matrix and resulting distance */ + uns sum = 0; + MSG("Significance matrix:\n"); + for (k = 0, l = 128; l; k++) + { + i = dist[k] & 15; + j = (dist[k] >> 4) & 15; + d = dist[k] >> 8; + if (p[i] <= q[j]) + { + s = p[i]; + q[j] -= p[i]; + p[i] = 0; + } + else + { + s = q[j]; + p[i] -= q[j]; + q[j] = 0; + } + l -= s; + sum += s * d; + DBG("s[%u][%u]=%u d=%u", i, j, s, d); + MSG("[%u, %u]=%u d=%u\n", i, j, s, d); + } + + return sum; +} + +#undef SIG_EXPLAIN +#undef MSG diff --git a/images/sig-cmp.c b/images/sig-cmp.c index 75b8277d..b7cd2ed1 100644 --- a/images/sig-cmp.c +++ b/images/sig-cmp.c @@ -11,6 +11,7 @@ #include "lib/lib.h" #include "lib/math.h" +#include "lib/fastbuf.h" #include "images/math.h" #include "images/images.h" #include "images/signature.h" @@ -118,96 +119,9 @@ image_signatures_dist_1(struct image_signature *sig1, struct image_signature *si #define ASORT_EXTRA_ARGS , uns *items #include "lib/arraysort.h" -static uns -image_signatures_dist_2(struct image_signature *sig1, struct image_signature *sig2) -{ - DBG("image_signatures_dist_2()"); - - uns dist[IMAGE_REG_MAX * IMAGE_REG_MAX], p[IMAGE_REG_MAX], q[IMAGE_REG_MAX]; - uns n, i, j, k, l, s, d; - struct image_region *reg1, *reg2; - - /* Compute distance matrix */ - n = 0; - /* ... for non-textured images */ - if (!((sig1->flags | sig2->flags) & IMAGE_SIG_TEXTURED)) - for (j = 0, reg2 = sig2->reg; j < sig2->len; j++, reg2++) - for (i = 0, reg1 = sig1->reg; i < sig1->len; i++, reg1++) - { - uns ds = - isqr((int)reg1->h[0] - (int)reg2->h[0]) + - isqr((int)reg1->h[1] - (int)reg2->h[1]) + - isqr((int)reg1->h[2] - (int)reg2->h[2]); - uns dt = - isqr((int)reg1->f[0] - (int)reg2->f[0]) + - isqr((int)reg1->f[1] - (int)reg2->f[1]) + - isqr((int)reg1->f[2] - (int)reg2->f[2]) + - isqr((int)reg1->f[3] - (int)reg2->f[3]) + - isqr((int)reg1->f[4] - (int)reg2->f[4]) + - isqr((int)reg1->f[5] - (int)reg2->f[5]); - if (ds < 1000) - dt *= 8; - else if (ds < 10000) - dt *= 12; - else - dt *= 16; - DBG("[%u][%u] ... ds=%u dt=%u", i, j, ds, dt); - dist[n++] = (dt << 8) + i + (j << 4) ; - } - /* ... for textured images (ignore shape properties) */ - else - for (j = 0, reg2 = sig2->reg; j < sig2->len; j++, reg2++) - for (i = 0, reg1 = sig1->reg; i < sig1->len; i++, reg1++) - { - uns dt = - isqr((int)reg1->f[0] - (int)reg2->f[0]) + - isqr((int)reg1->f[1] - (int)reg2->f[1]) + - isqr((int)reg1->f[2] - (int)reg2->f[2]) + - isqr((int)reg1->f[3] - (int)reg2->f[3]) + - isqr((int)reg1->f[4] - (int)reg2->f[4]) + - isqr((int)reg1->f[5] - (int)reg2->f[5]); - dist[n++] = (dt << 12) + i + (j << 4) ; - } - - /* One or both signatures have no regions */ - if (!n) - return 1 << IMAGE_SIG_DIST_SCALE; - - /* Get percentages */ - for (i = 0, reg1 = sig1->reg; i < sig1->len; i++, reg1++) - p[i] = reg1->wb; - for (i = 0, reg2 = sig2->reg; i < sig2->len; i++, reg2++) - q[i] = reg2->wb; - - /* Sort entries in distance matrix */ - image_signatures_dist_2_sort(n, dist); - - /* Compute significance matrix and resulting distance */ - uns sum = 0; - for (k = 0, l = 128; l; k++) - { - i = dist[k] & 15; - j = (dist[k] >> 4) & 15; - d = dist[k] >> 8; - if (p[i] <= q[j]) - { - s = p[i]; - q[j] -= p[i]; - p[i] = 0; - } - else - { - s = q[j]; - p[i] -= q[j]; - q[j] = 0; - } - l -= s; - sum += s * d; - DBG("s[%u][%u]=%u d=%u", i, j, s, d); - } - - return sum; -} +#define SIG_EXPLAIN +#include "images/sig-cmp-gen.h" +#include "images/sig-cmp-gen.h" uns image_signatures_dist(struct image_signature *sig1, struct image_signature *sig2) @@ -223,3 +137,11 @@ image_signatures_dist(struct image_signature *sig1, struct image_signature *sig2 } } +uns +image_signatures_dist_explain(struct image_signature *sig1, struct image_signature *sig2, struct fastbuf *fb) +{ + if (image_sig_compare_method == 2) + return image_signatures_dist_2_explain(sig1, sig2, fb); + return image_signatures_dist(sig1, sig2); +} + diff --git a/images/signature.h b/images/signature.h index 4f53f24f..597e016d 100644 --- a/images/signature.h +++ b/images/signature.h @@ -117,9 +117,8 @@ void image_sig_detect_textured(struct image_sig_data *data); /* sig-cmp.c */ -#define IMAGE_SIG_DIST_SCALE 30 - 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, struct fastbuf *fb); #endif -- 2.39.2