直方图比较
是用一定的标准来判断两个直方图的相似度方法。对输入的两张图像计算得到直方图H1与H2,归一化到相同的尺度空间然后可以通过计算H1与H2的之间的距离得到两个直方图的相似程度进而比较图像本身的相似程度。
OpenCV中提供的API是:
-
函数说明
函数cv::comparehist使用指定的方法比较两个密集直方图或两个稀疏直方图。虽然该函数在处理1、2、3维密集直方图时效果良好,但它可能不适合处理高维稀疏直方图。
-
函数声明
double compareHist( InputArray H1, InputArray H2, int method ); double compareHist( const SparseMat& H1, const SparseMat& H2, int method );
-
函数参数
H1:第一个参加比较的直方图
H2:第二个参加比较的直方图
method:比较的方法- 相关性比较,Correlation(method=CV_COMP_CORREL)
- 卡方比较,Chi-Square(HISTCMP_CHISQR)=1
- 十字交叉性比较,Intersection(method=CV_COMP_INTERSECT=2)
- 巴氏距离比较,Bhattacharyya(method=CV_COMP_BHATTACHARYYA=3)
-
比较的步骤
- 首先把图像从RGB色彩空间转换到HSV色彩空间: cvtColor()
- 计算图像的直方:calcHist()
- 归一化到[0~1]之间: normalize()
- 进行比较: compareHist()
Mat src1 = imread("D:/test/src1.jpg"); Mat src2 = imread("D:/test/src1.jpg"); Mat src3 = imread("D:/test/src1.jpg"); //步骤一:转化成hsv空间 Mat hsv1,hsv2,hsv3; cvtColor(src1, hsv1, COLOR_BGR2HSV); cvtColor(src2, hsv2, COLOR_BGR2HSV); cvtColor(src3, hsv3, COLOR_BGR2HSV); /* const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize,const float** ranges, bool uniform = true, bool accumulate = false ) */ //步骤二:直方图统计 int h_bins = 50; int s_bins = 60; int histSize[] = { h_bins,s_bins }; float h_ranges[] = { 0,180 }; float s_ranges[] = { 0,256 }; const float* rangHist[] = { h_ranges,s_ranges }; int channels[] = { 0,1 }; Mat hsv1Hist, hsv2Hist, hsv3Hist; calcHist(&hsv1, 1, channels, Mat(), hsv1Hist, 2, histSize, rangHist); calcHist(&hsv2, 1, channels, Mat(), hsv2Hist, 2, histSize, rangHist); calcHist(&hsv3, 1, channels, Mat(), hsv3Hist, 2, histSize, rangHist); //步骤三: 归一化 normalize(hsv1Hist, hsv1Hist, 0, 1, NORM_MINMAX, -1, Mat()); normalize(hsv2Hist, hsv2Hist, 0, 1, NORM_MINMAX, -1, Mat()); normalize(hsv3Hist, hsv3Hist, 0, 1, NORM_MINMAX, -1, Mat()); //步骤四: 比较直方图,并返回值 double cp1 = compareHist(hsv1Hist, hsv1Hist, HISTCMP_BHATTACHARYYA); double cp2 = compareHist(hsv1Hist, hsv2Hist, HISTCMP_BHATTACHARYYA); double cp3 = compareHist(hsv1Hist, hsv3Hist, HISTCMP_BHATTACHARYYA); double cp4 = compareHist(hsv2Hist, hsv2Hist, HISTCMP_BHATTACHARYYA); cout <<"cp1:" << cp1 << endl; cout <<"cp2:" << cp2 << endl; cout <<"cp3:" << cp3 << endl; cout <<"cp4:" << cp4 << endl;