原理说明:
以下为程序测试说明其工作原理:1.模板图像tempImg,测试图像testImg分别进行直方图统计 2.计算测试图像在模板图像直方图下的反向投影 3.归一化模板图像的直方图,在进行前一步(2)后又有什么结果。 实验结果如下截图:
// back_projection.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
Mat tempImg(3,4,CV_8UC1);
tempImg=(Mat_<uchar>(3,4)<<4,11,5,8,6,7,9,10,11,10,9,11);
cout<<"tempImg:"<<tempImg<<endl;
Mat testImg(5,5,CV_8UC1);
testImg=(Mat_<uchar>(5,5)<<0,1,1,1,3,4,10,11,6,10,5,8,9,10,9,7,4,8,11,8,10,8,9,11,10);
cout<<"testImg:"<<testImg<<endl;
MatND tempHist,testHist,VHist;
int dims=1;
float range[]={0,12};
const float *ranges[]={range};
int size=3;
int channels=0;
calcHist(&tempImg,1,&channels,Mat(),tempHist,1,&size,ranges);
cout<<"tempHist:"<<tempHist<<endl;
calcHist(&testImg,1,&channels,Mat(),testHist,1,&size,ranges);
cout<<"testHist:"<<testHist<<endl;
MatND backproj,normalbackpro;
calcBackProject(&testImg,1,&channels,tempHist,backproj,ranges,1,true);
cout<<"backprojection:"<<backproj<<endl;
normalize(tempHist,tempHist,255,0,CV_MINMAX);
calcBackProject(&testImg,1,&channels,tempHist,normalbackpro,ranges,1,true);
cout<<"normalbackprojection:"<<normalbackpro<<endl;
return 0;
}
具体实施解析:
1.对tempImg进行直方图统计,bin分为了[0,3],[4,7],[8,11]三个组进行统计。
2.对于testImg里的每一个像素统计其属于哪一个区间内,例如第二行第二个位置处像素为10,查看后发现属于第二组。
3.对于tempImg的直方图来说第二组[4,7]的统计值为4,所以反向投影图中该位置像素为4,按此规律对tempImg中每一位置进行该操作赋值得到反向投影图。