Added variance calculations

End condition now uses the variance with a delta
This commit is contained in:
William DURAND 2012-01-11 00:33:16 +01:00
parent cf3ec4c8ec
commit 09d2ecd49a

View File

@ -13,7 +13,10 @@
#include "Euclidean.hpp" #include "Euclidean.hpp"
#define NB_ITERATIONS 10 #define MAX_ITERATIONS 15
// Variance delta
#define DELTA 50
#define MIN(x,y) ((x)<(y)?(x):(y)) #define MIN(x,y) ((x)<(y)?(x):(y))
#define MAX(x,y) ((x)>(y)?(x):(y)) #define MAX(x,y) ((x)>(y)?(x):(y))
@ -260,27 +263,43 @@ CImg<float> decompose(const CImg<float> input)
*******************************************************************************/ *******************************************************************************/
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
char modeTitle[30], residueTitle[50];
double variance = 1000000;
if (argc != 2) { if (argc != 2) {
printf("Usage: ./emd <image>\n"); std::cout << "Usage: ./emd <image>" << std::endl;
return 1; return 1;
} }
char modeTitle[30], residueTitle[50]; CImgDisplay disp[MAX_ITERATIONS * 2 + 1];
CImgDisplay disp[NB_ITERATIONS * 2 + 1];
CImg<float> inputImg(argv[1]), imgMode; CImg<float> inputImg(argv[1]), imgMode;
disp[0].assign(inputImg, "Source Image"); disp[0].assign(inputImg, "Source Image");
for (int i = 1; i < NB_ITERATIONS + 1; i++) { for (int i = 1; i < MAX_ITERATIONS + 1; i++) {
sprintf(modeTitle, "BEMC-%d", i); sprintf(modeTitle, "BEMC-%d", i);
sprintf(residueTitle, "Residue %s", modeTitle); std::cout << "Decomposing " << modeTitle << std::endl;
fprintf(stdout, "Decomposing %s\n", modeTitle);
// Process
imgMode = decompose(inputImg); imgMode = decompose(inputImg);
inputImg = inputImg - imgMode; inputImg = inputImg - imgMode;
// Display BEMC i
disp[i].assign(imgMode, modeTitle); disp[i].assign(imgMode, modeTitle);
disp[NB_ITERATIONS + i].assign(inputImg, residueTitle);
// Display residue
sprintf(residueTitle, "Residue %s", modeTitle);
disp[MAX_ITERATIONS + i].assign(inputImg, residueTitle);
// Get variance
std::cout << "Variance: " << inputImg.variance() << std::endl;
if (fabs(variance - inputImg.variance()) < DELTA) {
std::cout << "Ended at iteration " << i << std::endl;
break;
} else {
variance = inputImg.variance();
}
} }
while (!disp[0].is_closed()) { while (!disp[0].is_closed()) {