下面代码使用灰度图像而不是HSV空间图像,下面将对比与官方文档结果的不同
#include "cv.h"
#include "highgui.h"
using namespace cv;
using namespace std;
int main(int argc,char *argv[])
{
Mat temp,tempGray,halfTempGray,test1,test1Gray,test2,test2Gray;
temp=imread("temp.jpg");
test1=imread("test1.jpg");
test2=imread("test2.jpg");
cvtColor(temp,tempGray,CV_BGR2GRAY);
cvtColor(test1,test1Gray,CV_BGR2GRAY);
cvtColor(test2,test2Gray,CV_BGR2GRAY);
halfTempGray=tempGray(Range(tempGray.rows/2,tempGray.rows-1),Range(0,tempGray.cols-1));
imshow("tempGray",tempGray);
imshow("halfTempGray",halfTempGray);
imshow("test1Gray",test1Gray);
imshow("test2Gray",test2Gray);
int channels=0;
int histSize=256;
float range[]={0,255};
const float *histRange={range};
Mat histTemp,histHalfTemp,histTest1,histTest2;
calcHist(&tempGray,1,&channels,Mat(),histTemp,1,&histSize,&histRange,true,false);
normalize(histTemp,histTemp,0,1,NORM_MINMAX);
calcHist(&halfTempGray,1,&channels,Mat(),histHalfTemp,1,&histSize,&histRange,true,false);
normalize(histHalfTemp,histHalfTemp,0,1,NORM_MINMAX);
calcHist(&test1Gray,1,&channels,Mat(),histTest1,1,&histSize,&histRange);
normalize(histTest1,histTest1,0,1,NORM_MINMAX);
calcHist(&test2Gray,1,&channels,Mat(),histTest2,1,&histSize,&histRange);
normalize(histTest2,histTest2,0,1,NORM_MINMAX);
Mat matchValues(4,4,CV_64F);
for (int i=0;i<4;i++)
{
matchValues.at<double>(0,i)=compareHist(histTemp,histTemp,i);
matchValues.at<double>(1,i)=compareHist(histTemp,histHalfTemp,i);
matchValues.at<double>(2,i)=compareHist(histTemp,histTest1,i);
matchValues.at<double>(3,i)=compareHist(histTemp,histTest2,i);
}
cout<<"matchValues=\n "<<matchValues<<endl;
waitKey(0);
destroyAllWindows();
return 0;
}
结果:
直接使用灰度空间结果:(不同行代表不同图像的匹配,不同列代表不同比较方法)
使用HSV空间得到到的结果:
直接使用灰度图像而不是HSV图像时test1与temp相似度提升!
可知直方图匹配对光照是十分敏感的,匹配效果不十分好。