Opencv学習:matlabにおけるstretchlim関数の実現


matlabにおけるimadjust関数の第1の呼び出し方式は、imadjust(I)、Iが処理対象画像であり、パラメータパッケージ時にstretchlim関数が呼び出される.しかしopencvには対応する実装がないためmatlabのソースコードを参照してstretchlim関数を実現した.この関数は前の記事で実現したhist関数を用いて、
void stretchlim(const IplImage* img, vector tol, vector& low_high)
{
	//    
	double tol_low , tol_high;
	switch(tol.size())
	{
	case 0:	//     0.01, 0.99
		tol_low = 0.01;
		tol_high = 0.99;
		break;
	case 1:
		tol_low = tol[0];
		tol_high = 1-tol[0];
		break;
	case 2:		
		tol_low = tol[0];
		tol_high = tol[1];
		break;
	}

	int nbins = 255;
	if(img->depth == IPL_DEPTH_16U)
		nbins = 65535;

	//                      
	if(tol_low N = hist(img);

		//        
		vector cdp = cumsumativeDistribution(N);

		//  tol_low,tol_high     
		int ilow = lower_bound(cdp.begin(), cdp.end(), tol_low)-cdp.begin();
		int ihigh = upper_bound(cdp.begin(), cdp.end(), tol_high)-cdp.begin();
		cout< cumsumativeDistribution(vector vec)
{
	vector distr;

	vector cum;
	long sum = 0;
	
	//         
	for(vector::iterator it = vec.begin(); it != vec.end(); it++)
	{
		sum += *it;
		cum.push_back(sum);
	}

	//         
	for(vector::iterator it = cum.begin(); it != cum.end(); it++)
	{
		distr.push_back(*it*1.0/sum);
	}
	return distr;
}