opencv图片比较大法

  • 本程序做什么?

  • 加载基准图像和另一张做对比

  • 将图像转换到HSV格式。

  • 计算所有图像的H-S直方图,并归一化以便对比。

  • 将图像直方图作对比。

  • 显示计算所得的直方图相似度数值。

void CompareHist()
{
    imshow("input1", image);
    imshow("input2", temp);

    Mat hsv1, hsv2;
    cvtColor(image, hsv1, COLOR_BGR2HSV);
    cvtColor(temp, hsv2, COLOR_BGR2HSV);

    int h_bins = 60; int s_bins = 64;
    int histSize[] = { h_bins, s_bins };
    float h_ranges[] = { 0, 180 };
    float s_ranges[] = { 0, 256 };
    const float* ranges[] = { h_ranges, s_ranges };
    int channels[] = { 0, 1 };

    Mat hist1, hist2;
    calcHist(&hsv1, 1, channels, Mat(), hist1, 2, histSize, ranges, true, false);
    calcHist(&hsv2, 1, channels, Mat(), hist2, 2, histSize, ranges, true, false);

    normalize(hist1, hist1, 0, 1, NORM_MINMAX, -1, Mat());
    normalize(hist2, hist2, 0, 1, NORM_MINMAX, -1, Mat());

    //4 种比较方法
    for (int i = 0; i < 4; i++)
    {
        int compare_method = i;
        double src1_src2 = compareHist(hist1, hist2, compare_method);
        qDebug() << " Method" << i << ": src1_src2:" << src1_src2;
        printf(" Method [%d]  : src1_src2 : %f \n", i, src1_src2);
    }
    waitKey(0);
}
void calcHist(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);

images:输入的图像的指针;

nimages:输入图像个数;

channels:需要统计直方图的第几通道;

mask:掩模,mask必须是一个8位(CV_8U)的数组并且和images的数组大小相同;

hist:直方图计算的输出值;

dims:输出直方图的维度(由channels指定);

histSize:直方图中每个dims维度需要分成多少个区间(如果把直方图看作一个一个竖条的话,就是竖条的个数);

ranges:统计像素值的区间;

uniform = true:是否对得到的直方图数组进行归一化处理;

accumulate = false:在多个图像时,是否累积计算像素值的个数;

方法1:Correlation ( CV_COMP_CORREL )

相关性比较,取值范围[0,1],越接近1,直方图相似度越高

方法2:Chi-Square ( CV_COMP_CHISQR )

卡方检验,取值范围[0,1],越接近0,直方图相似度越高

方法3:Intersection ( method=CV_COMP_INTERSECT )

相交,取值高,直方图相似度越高

方法4:Bhattacharyya distance ( CV_COMP_BHATTACHARYYA )

巴氏距离在直方图比较中效果最佳,完全匹配为1,完全不匹配为0

你可能感兴趣的:(opencv,人工智能,计算机视觉)