From: Pavel Charvat Date: Sat, 16 Sep 2006 09:06:15 +0000 (+0200) Subject: better comparision method selection X-Git-Tag: holmes-import~547 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=5c62f53d3cc21d624a99214fc21643a80d7c1696;p=libucw.git better comparision method selection --- diff --git a/cf/images b/cf/images index e27df704..2e38ee0e 100644 --- a/cf/images +++ b/cf/images @@ -22,9 +22,21 @@ BorderBonus 50 TexturedThreshold 0.32 -CompareMethod 2 - -# Array of multiplicative constants in feature vectors distance computation +# Signatures comparision method (integrated|fuzzy) - based on: +# +# integrated +# James Z. Wang, Jia Li and Gio Wiederhold, +# "SIMPLIcity: Semantics-Sensitive Integrated Matching for Picture Libraries", +# IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 23, no. 9, pp. 947-963, 2001. +# +# fuzzy +# Yixin Chen and James Z. Wang, +# "A Region-Based Fuzzy Feature Matching Approach to Content-Based Image Retrieval", +# IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 24, no. 9, pp. 1252-1267, 2002. +# +CompareMethod integrated + +# Array of multiplicative constants in feature vectors distance computation # (L, u, v, LH, HL, HH, H0, H1, H2). Each one must be in range 0..15. CompareFeaturesWeights 1 2 2 1 1 1 1 1 1 diff --git a/images/config.c b/images/config.c index 3bda5ed6..3d9a326a 100644 --- a/images/config.c +++ b/images/config.c @@ -22,7 +22,7 @@ uns image_sig_postquant_threshold; double image_sig_border_size; int image_sig_border_bonus; double image_sig_textured_threshold; -uns image_sig_compare_method; +int image_sig_compare_method; uns image_sig_cmp_features_weights[IMAGE_VEC_F + IMAGE_REG_H]; static struct cf_section sig_config = { @@ -36,7 +36,7 @@ static struct cf_section sig_config = { CF_DOUBLE("BorderSize", &image_sig_border_size), CF_INT("BorderBonus", &image_sig_border_bonus), CF_DOUBLE("TexturedThreshold", &image_sig_textured_threshold), - CF_UNS("CompareMethod", &image_sig_compare_method), + CF_LOOKUP("CompareMethod", &image_sig_compare_method, ((byte *[]){"intergrated", "fuzzy", NULL})), CF_UNS_ARY("CompareFeaturesWeights", image_sig_cmp_features_weights, IMAGE_VEC_F + IMAGE_REG_H), CF_END } diff --git a/images/sig-cmp-gen.h b/images/sig-cmp-gen.h index e6164d53..5c18fc9a 100644 --- a/images/sig-cmp-gen.h +++ b/images/sig-cmp-gen.h @@ -4,7 +4,7 @@ #define LINE do{}while(0) static uns -image_signatures_dist_2(struct image_signature *sig1, struct image_signature *sig2) +image_signatures_dist_integrated(struct image_signature *sig1, struct image_signature *sig2) #else @@ -35,7 +35,7 @@ explain_signature(struct image_signature *sig, void (*msg)(byte *text, void *par } static uns -image_signatures_dist_2_explain(struct image_signature *sig1, struct image_signature *sig2, void (*msg)(byte *text, void *param), void *param) +image_signatures_dist_integrated_explain(struct image_signature *sig1, struct image_signature *sig2, void (*msg)(byte *text, void *param), void *param) #endif { @@ -118,7 +118,7 @@ image_signatures_dist_2_explain(struct image_signature *sig1, struct image_signa q[i] = reg2->wb; /* Sort entries in distance matrix */ - image_signatures_dist_2_sort(n, dist); + image_signatures_dist_integrated_sort(n, dist); /* Compute significance matrix and resulting distance */ uns sum = 0; diff --git a/images/sig-cmp.c b/images/sig-cmp.c index 3d22a1f3..fef29407 100644 --- a/images/sig-cmp.c +++ b/images/sig-cmp.c @@ -18,7 +18,7 @@ #include static uns -image_signatures_dist_1(struct image_signature *sig1, struct image_signature *sig2) +image_signatures_dist_fuzzy(struct image_signature *sig1, struct image_signature *sig2) { DBG("image_signatures_dist_1()"); @@ -112,7 +112,7 @@ image_signatures_dist_1(struct image_signature *sig1, struct image_signature *si return (1 << (3 + 3 + 8 + 16)) - measure; } -#define ASORT_PREFIX(x) image_signatures_dist_2_##x +#define ASORT_PREFIX(x) image_signatures_dist_integrated_##x #define ASORT_KEY_TYPE uns #define ASORT_ELT(i) items[i] #define ASORT_EXTRA_ARGS , uns *items @@ -127,20 +127,26 @@ image_signatures_dist(struct image_signature *sig1, struct image_signature *sig2 { switch (image_sig_compare_method) { + case 0: + return image_signatures_dist_integrated(sig1, sig2); case 1: - return image_signatures_dist_1(sig1, sig2); - case 2: - return image_signatures_dist_2(sig1, sig2); + return image_signatures_dist_fuzzy(sig1, sig2); default: - die("Invalid image signatures compare method."); + ASSERT(0); } } uns image_signatures_dist_explain(struct image_signature *sig1, struct image_signature *sig2, void (*msg)(byte *text, void *param), void *param) { - if (image_sig_compare_method == 2) - return image_signatures_dist_2_explain(sig1, sig2, msg, param); - return image_signatures_dist(sig1, sig2); + switch (image_sig_compare_method) + { + case 0: + return image_signatures_dist_integrated_explain(sig1, sig2, msg, param); + case 1: + return image_signatures_dist_fuzzy(sig1, sig2); + default: + ASSERT(0); + } } diff --git a/images/signature.h b/images/signature.h index 57867848..4d7f7bc5 100644 --- a/images/signature.h +++ b/images/signature.h @@ -8,7 +8,8 @@ extern uns image_sig_postquant_min_steps, image_sig_postquant_max_steps, image_s extern double image_sig_border_size; extern int image_sig_border_bonus; extern double image_sig_textured_threshold; -extern uns image_sig_compare_method, image_sig_cmp_features_weights[]; +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