* **CV_COMP_HELLINGER** Synonym for ``CV_COMP_BHATTACHARYYA``
+ * **CV_COMP_KL_DIV** Kullback-Leibler divergence
+
The functions ``compareHist`` compare two dense or two sparse histograms using the specified method:
* Correlation (``method=CV_COMP_CORREL``)
d(H_1,H_2) = \sqrt{1 - \frac{1}{\sqrt{\bar{H_1} \bar{H_2} N^2}} \sum_I \sqrt{H_1(I) \cdot H_2(I)}}
+* Kullback-Leibler divergence (``method=CV_COMP_KL_DIV``).
+
+ .. math::
+
+ d(H_1,H_2) = \sum _I H_1(I) \log \left(\frac{H_1(I)}{H_2(I)}\right)
+
The function returns
:math:`d(H_1, H_2)` .
HISTCMP_INTERSECT = 2,
HISTCMP_BHATTACHARYYA = 3,
HISTCMP_HELLINGER = HISTCMP_BHATTACHARYYA,
- HISTCMP_CHISQR_ALT = 4
+ HISTCMP_CHISQR_ALT = 4,
+ HISTCMP_KL_DIV = 5
};
//! the color conversion code
s2 += b;
}
}
+ else if( method == CV_COMP_KL_DIV )
+ {
+ for( j = 0; j < len; j++ ){
+ double p = h1[j];
+ double q = h2[j];
+ if( p == 0.0 )
+ continue;
+ if( q == 0.0 )
+ q += 1e-10;
+ result += p * cv::log( p / q );
+ }
+ }
else
CV_Error( CV_StsBadArg, "Unknown comparison method" );
}
class CV_CompareHistTest : public CV_BaseHistTest
{
public:
- enum { MAX_METHOD = 5 };
+ enum { MAX_METHOD = 6 };
CV_CompareHistTest();
protected:
sq0 += v0*v0;
sq1 += v1*v1;
result0[CV_COMP_BHATTACHARYYA] += sqrt(v0*v1);
+ if( fabs(v0) > DBL_EPSILON )
+ {
+ if( fabs(v1) < DBL_EPSILON )
+ v1 += 1e-10;
+ result0[CV_COMP_KL_DIV] += v0 * cv::log( v0 / v1 );
+ }
}
}
else
s0 += v0;
sq0 += v0*v0;
result0[CV_COMP_BHATTACHARYYA] += sqrt(v0*v1);
+ if( fabs(v0) > DBL_EPSILON )
+ {
+ if( fabs(v1) < DBL_EPSILON )
+ v1 += 1e-10;
+ result0[CV_COMP_KL_DIV] += v0 * cv::log( v0 / v1 );
+ }
}
for( node = cvInitSparseMatIterator( sparse1, &iterator );
i == CV_COMP_CHISQR_ALT ? "Alternative Chi-Square" :
i == CV_COMP_CORREL ? "Correlation" :
i == CV_COMP_INTERSECT ? "Intersection" :
- i == CV_COMP_BHATTACHARYYA ? "Bhattacharyya" : "Unknown";
+ i == CV_COMP_BHATTACHARYYA ? "Bhattacharyya" :
+ i == CV_COMP_KL_DIV ? "Kullback-Leibler" : "Unknown";
if( cvIsNaN(v) || cvIsInf(v) )
{