《OpenCV3编程入门》学习笔记9 直方图与匹配(三)直方图对比

9.3 直方图对比

9.3.1 对比直方图:compareHist()函数

1.作用:
  比较两幅直方图
2.函数原型:

(1)double compareHist(InputArray H1,InputArray H2, int method)
(2)double compareHist(const SpareMat& H1, const SpareMat& H2, int method)

3.参数说明:
(1)直方图1
(2)直方图2
(3)距离标准,4种,其中Correlation和Intersection标准值越大表示相似度越高:
  1)相关,Correlation(method=CV_COMP_CORREL)
             在这里插入图片描述
    其中:
                    在这里插入图片描述
    N等于直方图中bin的个数
  2)卡方,Chi-Square(method=CV_COMP_CHISQR)
                 在这里插入图片描述
  3)直方图相交,Intersection(method-CV_COMP_INTERSECT)
  4)Bhattacharyya距离,(method=CV_COMP_BHATTACHARYYA)
    Bhattacaryya距离与Hellinger距离相关,也可写作method=CV_COMP_HELLINGER
              在这里插入图片描述

9.3.2 示例程序

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;

int main()
{
	//【1】声明储存基准图像和另外两张对比图象的矩阵(RGB和HSV)
	Mat srcImage_base, hsvImage_base;
	Mat srcImage_test1, hsvImage_test1;
	Mat srcImage_test2, hsvImage_test2;
	Mat hsvImage_halfDown;

	//【2】载入基准图像和两张测试图像并显示
	srcImage_base = imread("1.jpg", 1);
	srcImage_test1 = imread("2.jpg", 1);
	srcImage_test2 = imread("3.jpg", 1);
	imshow("基准图像", srcImage_base);
	imshow("测试图像1", srcImage_test1);
	imshow("测试图像2", srcImage_test2);

	//【3】将图像由BGR色彩空间转换到HSV色彩空间
	cvtColor(srcImage_base, hsvImage_base, COLOR_RGB2HSV);
	cvtColor(srcImage_test1, hsvImage_test1, COLOR_RGB2HSV);
	cvtColor(srcImage_test2, hsvImage_test2, COLOR_RGB2HSV);

	//【4】创建包含基准图像下半部的半身图像(HSV格式)
	hsvImage_halfDown = hsvImage_base(Range(hsvImage_base.rows / 2, hsvImage_base.rows - 1), Range(0, hsvImage_base.cols - 1));

	//【5】初始化计算直方图需要的实参
	//对hue通道使用30个bin,对saturation通道使用32个bin
	int h_bins = 50;
	int s_bins = 60;
	int histSize[] = { h_bins,s_bins };
	//hue取值范围0-256,saturation取值范围0-180
	float h_ranges[] = { 0,256 };
	float s_ranges[] = { 0,180 };
	const float* ranges[] = { h_ranges,s_ranges };
	//使用第0和1通道
	int channels[] = { 0,1 };

	//【6】创建存储直方图的MatND类实例
	MatND baseHist, testHist1, testHist2, halfDownHist;

	//【7】计算基准图像,两张测试图像,半身基准图像的HSV直方图
	calcHist(&hsvImage_base, 1, channels, Mat(), baseHist, 2, histSize, ranges, true, false);
	normalize(baseHist, baseHist, 0, 1, NORM_MINMAX, -1, Mat());
	calcHist(&hsvImage_test1, 1, channels, Mat(), testHist1, 2, histSize, ranges, true, false);
	normalize(testHist1, testHist1, 0, 1, NORM_MINMAX, -1, Mat());
	calcHist(&hsvImage_test2, 1, channels, Mat(), testHist2, 2, histSize, ranges, true, false);
	normalize(testHist2, testHist2, 0, 1, NORM_MINMAX, -1, Mat());
	calcHist(&hsvImage_halfDown, 1, channels, Mat(), halfDownHist, 2, histSize, ranges, true, false);
	normalize(halfDownHist, halfDownHist, 0, 1, NORM_MINMAX, -1, Mat());

	//【8】按顺序使用4种对比标准将基准图像的直方图与其余各直方图进行对比
	for (int i = 0; i < 4; i++)
	{
		//进行图像直方图的对比
		int compare_method = i;
		double base_base = compareHist(baseHist, baseHist, compare_method);
		double base_test1 = compareHist(baseHist, testHist1, compare_method);
		double base_test2 = compareHist(baseHist, testHist2, compare_method);
		double base_half = compareHist(baseHist, halfDownHist, compare_method);
		//输出结果
		printf("方法[%d]的匹配结果如下:\n\n【基准图-基准图】:%f,【基准图-测试图1】:%f,【基准图-测试图2】:%f,【基准图-半身图】:%f\n", i, base_base, base_test1, base_test2, base_half);
		printf("----------------------------------------------------------------------------------------------------------------------------------\n");
	}
	printf("检测结束\n");
	waitKey(0);
	return 0;
}

运行效果:

     在这里插入图片描述
            在这里插入图片描述
            在这里插入图片描述
            在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ccchenxi/article/details/86089773
今日推荐