通过比较两幅图像的灰度直方图来确定相似性
一共四种方法
第一种:相关性比较
值的范围是-1~1相关性由小到大
第二种:卡方计算
越小表示相关性越强
第三种:十字交叉运算
第四种:巴氏距离计算
取值范围0~1,距离越小相关性越强
运算之前先要把rgb转化为hsv,然后将像素值归一化到0~1之间
#include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char**argv) { Mat base,test1,test2; base=imread("C:/Users/hs769/Desktop/1.jpg"); test1 = imread("C:/Users/hs769/Desktop/2.jpg"); imshow("demo", base); //cvtColor(base, test1, COLOR_RGB2GRAY); cvtColor(test1, test1, COLOR_RGB2HSV); cvtColor(base, test2, COLOR_RGB2HSV); int h_bin = 50; int s_bin = 60; int histSize[] = { h_bin,s_bin }; float h_range[] = { 0,180 }; float s_range[] = { 0,256 }; const float *range[] = { h_range,s_range }; int channels[] = { 0,1 }; MatND hist_test1; MatND hist_test2; calcHist(&test1, 1, channels, Mat(), hist_test1, 2, histSize, range, true, false); normalize(hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat()); calcHist(&test2, 1, channels, Mat(), hist_test2, 2, histSize, range, true, false); normalize(hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat()); double test1test2 = compareHist(hist_test1, hist_test2, HISTCMP_CORREL); cout << "method1 value" << test1test2 << endl; waitKey(0); return 0; }