00001 00002 using namespace std; 00003 00004 double mean_skin[16][3] = 00005 { 00006 {73.53, 29.94, 17.76 }, 00007 {249.71, 233.94, 217.49}, 00008 {161.68, 116.25, 96.95 }, 00009 {186.07, 136.62, 114.40}, 00010 {189.26, 98.37, 51.18 }, 00011 {247.00, 152.20, 90.84 }, 00012 {150.10, 72.66, 37.76 }, 00013 {206.85, 171.09, 156.34}, 00014 {212.78, 152.82, 120.04}, 00015 {234.87, 175.43, 138.94}, 00016 {151.19, 97.74, 74.59 }, 00017 {120.52, 77.55, 59.82 }, 00018 {192.20, 119.62, 82.32 }, 00019 {214.29, 136.08, 87.24 }, 00020 {99.57, 54.33, 38.06 }, 00021 {238.88, 203.08, 176.91} 00022 }; 00023 00024 double mean_nskin[16][3] = 00025 { 00026 {254.37, 254.41, 253.82}, 00027 {9.39, 8.09, 8.52 }, 00028 {96.57, 96.95, 91.53 }, 00029 {160.44, 162.49, 159.06}, 00030 {74.98, 63.23, 46.33 }, 00031 {121.83, 60.88, 18.31 }, 00032 {202.18, 154.88, 91.04 }, 00033 {193.06, 201.93, 206.55}, 00034 {51.88, 57.14, 61.55 }, 00035 {30.88, 26.84, 25.32 }, 00036 {44.97, 85.96, 131.95 }, 00037 {236.02, 236.27, 230.70}, 00038 {207.86, 191.20, 164.12}, 00039 {99.83, 148.11, 188.17 }, 00040 {135.06, 131.92, 123.10}, 00041 {135.96, 103.89, 66.88 } 00042 }; 00043 00044 double covar_skin[16][3] = 00045 { 00046 { 765.40, 121.44, 112.80}, 00047 { 39.94, 154.44, 396.05}, 00048 { 291.03, 60.48, 162.85}, 00049 { 274.95, 64.60, 198.27}, 00050 { 633.18, 222.40, 250.69}, 00051 { 65.23, 691.53, 609.92}, 00052 { 408.63, 200.77, 257.57}, 00053 { 530.08, 155.08, 572.79}, 00054 { 160.57, 84.52, 243.90}, 00055 { 163.80, 121.57, 279.22}, 00056 { 425.40, 73.56, 175.11}, 00057 { 330.45, 70.34, 151.82}, 00058 { 152.76, 92.14, 259.15}, 00059 { 204.90, 140.17, 270.19}, 00060 { 448.13, 90.18, 151.29}, 00061 { 178.38, 156.27, 404.99} 00062 }; 00063 00064 double covar_nskin[16][3] = 00065 { 00066 { 2.77, 2.81, 5.46}, 00067 {46.84, 33.59, 32.48}, 00068 { 280.69, 156.79, 436.58}, 00069 { 355.98, 115.89, 591.24}, 00070 { 414.84, 245.95, 361.27}, 00071 { 2502.24, 1383.53, 237.18}, 00072 { 957.42, 1766.94, 1582.52}, 00073 { 562.88, 190.23, 447.28}, 00074 { 344.11, 191.77, 433.40}, 00075 { 222.07, 118.65, 182.41}, 00076 { 651.32, 840.52, 963.67}, 00077 { 225.03, 117.29, 331.95}, 00078 { 494.04, 237.69, 533.52}, 00079 { 955.88, 654.95, 916.70}, 00080 { 350.35, 130.30, 388.43}, 00081 { 806.44, 642.20, 350.36} 00082 }; 00083 00084 double weights_skin[16] = 00085 { 00086 0.0294, 00087 0.0331, 00088 0.0654, 00089 0.0756, 00090 0.0554, 00091 0.0314, 00092 0.0454, 00093 0.0469, 00094 0.0956, 00095 0.0763, 00096 0.1100, 00097 0.0676, 00098 0.0755, 00099 0.0500, 00100 0.0667, 00101 0.0749 00102 }; 00103 00104 double weights_nskin[16] = 00105 { 00106 0.0637, 00107 0.0516, 00108 0.0864, 00109 0.0636, 00110 0.0747, 00111 0.0365, 00112 0.0349, 00113 0.0649, 00114 0.0656, 00115 0.1189, 00116 0.0362, 00117 0.0849, 00118 0.0368, 00119 0.0389, 00120 0.0943, 00121 0.0477 00122 }; 00123 00124 double gaussian_mix_skin(int r, int g, int b) 00125 { 00126 double sum = 0.0; 00127 for(int i=0;i<16;i++) { 00128 sum += weights_skin[i] 00129 / sqrt(covar_skin[i][0] * covar_skin[i][1] * covar_skin[i][2]) 00130 * exp(-0.5 * ( (r - mean_skin[i][0]) * (r - mean_skin[i][0]) / covar_skin[i][0] 00131 + (g - mean_skin[i][1]) * (g - mean_skin[i][1]) / covar_skin[i][1] 00132 + (b - mean_skin[i][2]) * (b - mean_skin[i][2]) / covar_skin[i][2])); 00133 } 00134 return sum; 00135 } 00136 00137 double gaussian_mix_nskin(int r, int g, int b) 00138 { 00139 double sum = 0.0; 00140 for(int i=0;i<16;i++) { 00141 sum += weights_nskin[i] 00142 / sqrt(covar_nskin[i][0] * covar_nskin[i][1] * covar_nskin[i][2]) 00143 * exp(-0.5 * ( (r - mean_nskin[i][0]) * (r - mean_nskin[i][0]) / covar_nskin[i][0] 00144 + (g - mean_nskin[i][1]) * (g - mean_nskin[i][1]) / covar_nskin[i][1] 00145 + (b - mean_nskin[i][2]) * (b - mean_nskin[i][2]) / covar_nskin[i][2])); 00146 } 00147 return sum; 00148 } 00149 00150 double skin_likelihood(int r, int g, int b) 00151 { 00152 return gaussian_mix_skin(r, g, b) / 00153 gaussian_mix_nskin(r, g, b); 00154 }