OpenCV中直方图对比
对于两幅图片先求得其直方图然后在对两个直方图进行比较。而两幅直方图相似度的标准为
d
(
H
1
,
H
2
)
\color{#f00}d(H1,H2)
d(H1,H2),而对于该值的计算有四种方式:
相关性比较
卡方比较
十字交叉性
巴氏距离
而对于OpenCV来说已经提供了相应的API:
compareHist(
输入直方图1,
输入直方图2,
选择使用的计算方式
);
具体的步骤:
a、将载入的图像从RGB转化为HSV
b、计算直方图并归一化处理
c、直方图比较
d、得到比较结果
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
int main()
{
Mat src1,src2,temp;
temp = imread("/home/dynamicw/Project/C++_Project/opencvtest/src/lesson01/source/src1.png");
src2 = imread("/home/dynamicw/Project/C++_Project/opencvtest/src/lesson01/source/src2.png");
src1 = Mat(temp.rows,temp.cols/2,temp.type());
for(int row = 0;row < temp.rows;row++)
{
for(int col = 0;col < temp.cols/2;col++)
{
src1.at<Vec3b>(row,col) = temp.at<Vec3b>(row,col);
}
}
imshow("src1",src1);
imshow("src2",src2);
Mat src1_hsv,src2_hsv;
cvtColor(src1,src1_hsv,CV_BGR2HSV);
cvtColor(src2,src2_hsv,CV_BGR2HSV);
imshow("src1_hsv",src1_hsv);
imshow("src2_hsv",src2_hsv);
int h_bins = 50,s_bins = 60;
int histsize[] = {h_bins,s_bins};
float h_range[] = {0,256};
float s_range[] = {0,180};
const float* ranges[] = {h_range,s_range};
int channels[] = {0,1};
Mat hist_src1,hist_src2;
calcHist(&src1_hsv,1,channels,Mat(),hist_src1,2,histsize,ranges,true,false);
normalize(hist_src1,hist_src1,0,1,NORM_MINMAX,-1,Mat());
calcHist(&src2_hsv,1,channels,Mat(),hist_src2,2,histsize,ranges,true,false);
normalize(hist_src2,hist_src2,0,1,NORM_MINMAX,-1,Mat());
cout << "CV_COMP_CORREL" << CV_COMP_CORREL << endl;
cout << "CV_COMP_CHISQR" << CV_COMP_CHISQR << endl;
cout << "CV_COMP_INTERSECT" << CV_COMP_INTERSECT << endl;
cout << "CV_COMP_BHATTACHARYYA" << CV_COMP_BHATTACHARYYA << endl;
for(int i = 0;i < 4;i++)
{
int mode = i;
double value = compareHist(hist_src2,hist_src2,mode);
cout << "the " << i << " mode is:" << value << endl;
}
waitKey(0);
return 0;
}