上一篇为最大最小值拉伸,本篇为百分比截断拉伸,简单理解即是,使用百分比范围内的数据作为极值,然后做线性拉伸,也就是数据范围的前n% 和后 n% 的像素映射到极值上即可,算法如下:
template<typename T>
inline int CImageCorrectionDlg::PercentLinearTension(const T * poSrcData, T * poDstData, int nSizex, T smin, T smax, T dmin, T dmax, double percentMin, double percentMax)
{
double k = (double)(dmax - dmin) / (smax - smin);
double b = (double)(smax*dmin - smin*dmax) / (smax - smin);
double s = smax - smin;
double lowx = smin, lowy = smin + s*percentMin / 100;
double highx = smax - s*percentMin / 100, highy = smax;
#pragma omp parallel for
for (int i = 0; i < nSizex; i++)
{
if (poSrcData[i] == 0)
{
poDstData[i] = 0;
continue;
}
if ( lowx <= poSrcData[i] && poSrcData[i] < lowy)
{
poDstData[i] = 1;
continue;
}
if (highx <= poSrcData[i] && poSrcData[i] <highy)
{
poDstData[i] = 255;
continue;
}
int tmp = k*poSrcData[i] + b;
if (tmp <= 0)
{
if (poSrcData[i] == 0)
poDstData[i] = 0;
else
poDstData[i] = 1;//原来不是0的如果直接拉伸0将变为nodata
}
else if (tmp >= 255)
poDstData[i] = 255;
else
poDstData[i] = (T)tmp;
}
return 0;
}
拉伸结果对比图:
其中百分比截断拉伸可能效果稍好点。