直方图反向投影式通过给定的直方图信息,在图像找到相应的像素分布区域,opencv提供两种算法,一个是基于像素的,一个是基于块的。
使用方法不写了,可以参考一下几个网站:
测试例子1:灰度直方图反向投影
灰度直方图反向投影IplImage * image= cvLoadImage("22.jpg");
IplImage * image2= cvLoadImage("2.jpg");
int hist_size=256;
float range[] = {0,255};
float* ranges[]={range};
IplImage* gray_plane = cvCreateImage(cvGetSize(image),8,1);
cvCvtColor(image,gray_plane,CV_BGR2GRAY);
CvHistogram* gray_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
cvCalcHist(&gray_plane,gray_hist,0,0);
//cvNormalizeHist(gray_hist,1.0);
IplImage* gray_plane2 = cvCreateImage(cvGetSize(image2),8,1);
cvCvtColor(image2,gray_plane2,CV_BGR2GRAY);
//CvHistogram* gray_hist2 = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
//cvCalcHist(&gray_plane2,gray_hist2,0,0);
//cvNormalizeHist(gray_hist2,1.0);
IplImage* dst = cvCreateImage(cvGetSize(gray_plane2),IPL_DEPTH_8U,1);
cvCalcBackProject(&gray_plane2, dst ,gray_hist);
cvEqualizeHist(dst,dst);
//产生的图像太暗,做了一些直方图均衡
cvNamedWindow( "dst");
cvShowImage("dst",dst);
cvNamedWindow( "src");
cvShowImage( "src", image2 );
<