opencv2 累积直方图

累计直方图代表图像组成成分在灰度级的累计概率分布情况,每一个概率值代表小于等于此灰度值的概率,P(rk)=n1+n2+n3+...Nk。 当图像中的特征不能取遍所有可能值时,颜色直方图中会出现很多零值。这些零值会影响直方图相交运算,从而使匹配值不能正确地反映两幅图像之间的颜色差别。由颜色直方图演化而来的累积直方图可以解决上述问题。( http://baike.baidu.com/view/2542861.htm
统计直方图 :   h(k)=nk/N  k=0,1  ---L-1, nk为图像特征取值k的象素个数
       累计直方图:    I(k)=ni/N 对i从0到k求和
详细参考: http://zh.wikipedia.org/wiki/%E7%9B%B4%E6%96%B9%E5%9B%BE%E5%9D%87%E8%A1%A1%E5%8C%96
   
     
     
     
     
void getCDF(cv::Mat image,cv::Mat &cdfHist) //获取累积直方图,输出1*256的矩阵cdfHist
{
if(image.channels()!=1)
cv::cvtColor(image,image,CV_BGR2GRAY);
int bins = 256;
int hist_size[] = {bins};
float range[] = { 0, 256 };
const float* ranges[] = { range};
cv::Mat hist;
 
int channels[] = {0};
//计算直方图
cv::calcHist( &image, 1, channels, Mat(), // do not use mask
hist, 1, hist_size, ranges,
true, // the histogram is uniform
false );
 
cdfHist.create(1,256,CV_32FC1);
hist=hist/image.total();
float temp=0;
for (int i=0;i<256;i++)
{
temp=temp+hist.at(i,0);
cdfHist.at(0,i)=temp;
}
 
cv::FileStorage fs3;
fs3.open("D:\\cdfHist.txt", cv::FileStorage::WRITE);
fs3 << "cdfHist" << cdfHist;
fs3.release();
}
累积直方图用途:
1.图像匹配
2.图像均衡(opencv函数 )

你可能感兴趣的:(CV,图像特征)