Opencv学習:matlabにおけるstretchlim関数の実現
1458 ワード
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;
}