int PercentLinearTension(const T * poSrcData, T * poDstData, int nSizex, T smin, T smax, T dmin, T dmax, double percentMin, double percentMax)
{
double s = smax - smin+ 0.5;
int lowx = smin, lowy = smin + s*percentMin / 100;
int highx = smax - s*percentMin / 100, highy = smax;
double k = (double)(dmax - dmin) / (highx - lowy);
double b = (double)(highx*dmin - lowy*dmax) / (highx - lowy);
for (int i = 0; i < nSizex; i++)
{
if (poSrcData[i] == 0)
{
poDstData[i] = 0;
continue;
}
if ( lowx <= poSrcData[i] && poSrcData[i] <= lowy)
{
poDstData[i] = 0;
continue;
}
if (highx <= poSrcData[i] && poSrcData[i] <=highy)
{
poDstData[i] = 255;
continue;
}
double at = k*poSrcData[i] + b;
int tmp = 0;
if (at - (int)at > 0.5)
tmp = at + 0.5;
else
tmp = at - 0.5;
if (tmp <= 0)
{
if (poSrcData[i] == 0)
poDstData[i] = 0;
else
poDstData[i] = 0;//原来不是0的如果直接拉伸0将变为nodata
}
else if (tmp >= 255)
poDstData[i] = 255;
else
poDstData[i] = (T)tmp;
}
return 0;
}
template<typename T>
int LinearTension(const T * poSrcData, T * poDstData, int nSizex, T smin, T smax, T dmin, T dmax)
{
double k = (double)(dmax - dmin) / (smax - smin);
double b = (double)(smax*dmin - smin*dmax) / (smax - smin);
for (int i = 0; i < nSizex; i++)
{
int tmp = k*poSrcData[i] + b;
if (tmp <= 0)
{
if(poSrcData[i] == 0)
poDstData[i] = 0;
else
poDstData[i] = 1;
}
else if (tmp >= 255)
poDstData[i] = 255;
else
poDstData[i] = (T)tmp;
}
return 0;
}
template<typename T>
int StandardDeviationTension(const T * poSrcData, T * poDstData, int nSizex,
T smin, T smax, T dmin, T dmax,
double StandardDeviation, double avg, int Kn)
{
//Kn 倍数,一般设为2.5
double ucMax = avg + Kn * StandardDeviation;
double ucMin = avg - Kn * StandardDeviation;
double k = (double)(dmax - dmin) / (ucMax - ucMin);
double b = (double)(ucMax*dmin - ucMin*dmax) / (ucMax - ucMin);
if (ucMin <= 0)
{
ucMin = 0;
}
for (int i = 0; i < nSizex; i++)
{
if (poSrcData[i] == 0)
{
poDstData[i] = 0;
continue;
}
if (poSrcData[i] <= ucMin)
{
poDstData[i] = 0;
continue;
}
else if (poSrcData[i] >= ucMax)
{
poDstData[i] = 255;
continue;
}
int tmp = k*poSrcData[i] + b;
if (tmp <= 0)
{
if (poSrcData[i] == 0)
poDstData[i] = 0;
else
poDstData[i] = 1;
}
else if (tmp >= 255)
poDstData[i] = 255;
else
poDstData[i] = (T)tmp;
}
return 0;
}