目录
1 概念讲解及用处
图像直方图比较(Histogram Comparison)是一种用于比较两个图像直方图相似性的方法。它可以帮助我们量化地评估两幅图像之间的相似程度,常用于图像检索、拷贝检测等领域。
直方图比较的主要用处包括:
图像相似性度量:通过比较图像直方图的差异,可以量化地衡量两张图像之间的相似性。
图像匹配和分类:通过比较图像直方图,可以找到某个目标图像在数据库中的最佳匹配或类别。
2 函数详解
在OpenCV中,可以使用compareHist函数来比较两个图像直方图的相似性。
ouble compareHist(InputArray H1, InputArray H2, int method)
H1:第一个输入直方图。
H2:第二个输入直方图。
method:直方图比较方法,可选值为HISTCMP_CORREL、HISTCMP_CHISQR、HISTCMP_INTERSECT、HISTCMP_BHATTACHARYYA,分别对应相关性、卡方、交集、巴氏距离。
3 数学原理及数学推导公式
直方图比较方法有多种,常用的有相关性(Correlation)、卡方(Chi-Square)、交集(Intersection)以及巴氏距离(Bhattacharyya Distance)。
3.1 相关性的数学推导公式为
3.2 卡方的数学推导公式为
3.3 交集的数学推导公式为
3.4 巴氏距离的数学推导公式为
其中,H1(i)和H2(i)分别是第一个和第二个直方图的第i个bin的值,mean()和stddev()分别表示均值和标准差函数。
4 用C++编写代码进行实现
下面是一个使用OpenCV比较两个图像直方图相似性的示例代码:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 读取两幅图像
Mat image1 = imread("lena.png", IMREAD_GRAYSCALE);
Mat image2 = imread("lena.png", IMREAD_GRAYSCALE);
if (image1.empty() || image2.empty())
{
cout << "Failed to load images." << endl;
return -1;
}
// 计算直方图
Mat hist1, hist2;
const int histSize = 256;
float range[] = { 0, 256 };
const float* histRange = { range };
calcHist(&image1, 1, 0, Mat(), hist1, 1, &histSize, &histRange);
calcHist(&image2, 1, 0, Mat(), hist2, 1, &histSize, &histRange);
// 归一化直方图
normalize(hist1, hist1, 0, 1, NORM_MINMAX, -1, Mat());
normalize(hist2, hist2, 0, 1, NORM_MINMAX, -1, Mat());
// 比较直方图相似性
double correlation = compareHist(hist1, hist2,HISTCMP_CORREL);
double chi_square = compareHist(hist1, hist2, HISTCMP_CHISQR);
double intersection = compareHist(hist1, hist2, HISTCMP_INTERSECT);
double bhattacharyya_distance = compareHist(hist1, hist2,HISTCMP_BHATTACHARYYA);
// 输出相似性度量结果
cout << "Correlation: " << correlation << endl;
cout << "Chi-Square: " << chi_square << endl;
cout << "Intersection: " << intersection << endl;
cout << "Bhattacharyya Distance: " << bhattacharyya_distance << endl;
return 0;
}
在这个示例中,我们首先读取了两张灰度图像,并使用calcHist函数计算了它们的直方图。然后,使用normalize函数将直方图归一化到0-1范围内。最后,使用compareHist函数分别比较了四种直方图相似性指标(相关性、卡方、交集、巴氏距离),并输出结果。
请注意,这里的示例代码仅演示了如何使用OpenCV进行图像直方图比较,实际应用中可能需要对图像进行预处理、参数调整等操作以获得更好的比较结果。