[Wavelet-commit] Wavelet ImageComparison.cc,1.10,1.11
Status: Beta
Brought to you by:
herbert
From: Herbert M. D. <he...@us...> - 2009-06-19 14:46:53
|
Update of /cvsroot/wavelet/Wavelet In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv4434 Modified Files: ImageComparison.cc Log Message: added additional CLI tool ppmlq, added some more static methods to ImageComparison Index: ImageComparison.cc =================================================================== RCS file: /cvsroot/wavelet/Wavelet/ImageComparison.cc,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** ImageComparison.cc 13 Apr 2009 19:29:38 -0000 1.10 --- ImageComparison.cc 19 Jun 2009 13:45:54 -0000 1.11 *************** *** 14,17 **** --- 14,19 ---- #include <cmath> #include <cassert> + #include <iomanip> + #include <iostream> #include "WImage/miscdefs.h" *************** *** 20,23 **** --- 22,32 ---- #endif + #define MAX_WEIGHT_IDX 5 + static const float gl_weights[][MAX_WEIGHT_IDX + 1] = { + { 4.04, 0.79, 0.45, 0.42, 0.41, 0.32 }, + { 15.25, 0.92, 0.53, 0.26, 0.14, 0.07 }, + { 22.62, 0.40, 0.73, 0.25, 0.15, 0.38 } + }; + ImageComparison::ImageComparison (const Image &img1, const Image &img2) { *************** *** 44,55 **** } - double defaults[][6] = { { 4.04, 0.78, 0.46, 0.42, 0.41, 0.32 }, - { 5.00, 0.83, 1.01, 0.52, 0.47, 0.30 }}; - for (int row = 0; row < 2; row++) { ! for (int col = 0; col < 6; col++) { ! m_weights[row][col] = defaults[row][col]; } } --- 53,61 ---- } for (int row = 0; row < 2; row++) { ! for (int col = 0; col < MAX_WEIGHT_IDX + 1; col++) { ! m_weights[row][col] = gl_weights[3 * row][col]; } } *************** *** 172,176 **** { m_lqcache[i].init = true; ! m_lqcache[i].val = (int)floor (log ((double)i) / log ((double)2)); } return m_lqcache[i].val; --- 178,182 ---- { m_lqcache[i].init = true; ! m_lqcache[i].val = 1 + (int)floor (log ((double)i) / log ((double)2)); } return m_lqcache[i].val; *************** *** 241,244 **** --- 247,311 ---- } + double + ImageComparison::calcLqAverageScore (const Image &truncated1, + const Image &truncated2, int colorChannel) + { + //std::cout.setf (std::ios::fixed, std::ios::floatfield); + //std::cout << "abs1: " + // << std::setprecision (5) << std::setw (11) + // << truncated1.at (0) << ", abs2: " + // << std::setprecision (5) << std::setw (11) + // << truncated2.at (0) << std::endl; + return gl_weights[colorChannel][0] * ::fabs (truncated1.at (0) - + truncated2.at (0)); + } + + double + ImageComparison::calcLqDetailScore (const Image &truncated1, + const Image &truncated2, int colorChannel) + { + double res = 0; + coeff c1, c2; + int indexCacheSize = MAX (truncated1.rows (), truncated1.cols ()); + int *indexCache = new int[indexCacheSize]; + for (int i = 0; i < indexCacheSize; ++i) + { + indexCache[i] = -1; + } + int cacheEntry = 0; + int misses = 0; + for (int y = 0; y < truncated1.rows (); ++y) + { + for (int x = 0; x < truncated1.cols (); ++x) + { + if (x == 0 && y == 0) + { + continue; + } + c1 = truncated1.at (y, x); + c2 = truncated2.at (y, x); + if ((c1 < 0 && c2 < 0) || (c1 > 0 && c2 > 0)) + { + cacheEntry = MAX (y, x); + if (indexCache[cacheEntry] < 0) + { + indexCache[cacheEntry] = 1 + + (int)floor (log ((double)cacheEntry) / log ((double)2)); + } + res -= gl_weights[colorChannel][MIN (indexCache[cacheEntry], + MAX_WEIGHT_IDX)]; + } + else if (c1 != 0) + { + ++misses; + } + } + } + //std::cout << "detail misses in color channel " << colorChannel + // << ": " << misses << std::endl; + DELETEAR (indexCache); + return res; + } + Image * ImageComparison::truncateForLq (const Image &image, |