【小白】Open-CV 学习笔记 - 9.3 直方图对比

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标准值越大表示相似度越高

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;

int main()
{
    //两张对比图像的矩阵
    Mat srcImage_base, hsvImage_base;
    Mat srcImage_test1, hsvImage_test1;
    Mat srcImage_test2, hsvImage_test2;
    Mat hsvImage_halfDown;
    //载入基准图像和两张测试图像
    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);

    //将图像BGR转化为HSV色彩图像
    cvtColor(srcImage_base, hsvImage_base, COLOR_BGR2HSV);
    cvtColor(srcImage_test1, hsvImage_test1, COLOR_BGR2HSV);
    cvtColor(srcImage_test2, hsvImage_test2, COLOR_BGR2HSV);

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

    //初始化计算直方图的参数
    //对hue通道使用30个bin对saturation通道使用32bin
    int h_bins = 50;
    int s_bins = 60;
    int histSize[] = { h_bins,s_bins };
    float h_ranges[] = { 0,256 };
    float s_ranges[] = { 0,180 };
    const float * ranges[] = { h_ranges,s_ranges };
    //使用0和1通道
    int channels[] = { 0,1 };

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

    //计算基准图像,两张测试图像,半身基准图像的HSV直方图
    calcHist(&hsvImage_base, 1, channels, Mat(), baseHist, 2, histSize, ranges, true, false);
    normalize(baseHist, baseHist, 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());

    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());

    //按照顺序是哦那个4中比较标准将基准图像与其余的直方图进行对比
    for (int i = 0; i < 4; i++)
    {
        //进行直方图对比
        int compare_method = i;
        double base_base = compareHist(baseHist, baseHist, compare_method);
        double base_half = compareHist(baseHist, halfDownHist, compare_method);
        double base_test1 = compareHist(baseHist, testHist1, compare_method);
        double base_test2 = compareHist(baseHist, testHist2, compare_method);

        //输出结果
        printf("方法 [%d] 的匹配结果如下:\n\n 【基准图-基准图】:%f, 【基准图-半身图】:%f,【基准图-测试图1】:%f,【基准图-测试图2】:%f\n---------------------------------------\n", i, base_base, base_half, base_test1, base_test2);


    }
    printf("检测结束。");
    waitKey(0);
    return 0;
}

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

发布了34 篇原创文章 · 获赞 8 · 访问量 1871

猜你喜欢

转载自blog.csdn.net/weixin_43583163/article/details/97809434