• 大小: 4.65MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-09-16
  • 语言: 其他
  • 标签: GDAL  拉伸  栅格  

资源简介

GDAL调整图像亮度之百分比截断拉伸。简介百分比截断拉伸原理,以及验证过的核心代码,相关注释,效果图

资源截图

代码片段和文件信息


/**
 * 百分比截断拉伸,使用百分比范围内的数据作为极值,然后做线性拉伸,也就是数据范围的前n% 和后 n% 的像素映射到极值上即可.
 * 百分比裁剪方法的原理:
       在很多情况下,你可以假设大部分像素都处于上限和下限范围内。你可以通过设置百分比把范围之外的像素值都推到端点处。
       然后在对范围内的像素值进行线性拉伸。比如你现在的影像像素值范围是30-210,并且最大最小裁剪比定义为2。
       假设低的2%表示30-35像素值,高的2%表示205-210之间的像素值。所有30-35之间的值变为0,205-210之间的像素值重新在0-255之间分配。
 */

/** 各波段的最小值列表和最大值列表*/
std::vector _vecBandedMinValues _vecBandedMaxValues ; // NOLINT

//打开影像后读取统计信息;初次会比较慢,但会自动保存aux.xml同影像目录文件,再次统计会先读取该文件,获取失败才会重新统计
void ReadRaster(GDALDataset* _poDataset int _width int _height int minU int minV int maxU int maxV)
{
    //gdal打开数据源_poDataset
    int rasterCount = _poDataset->GetRasterCount();
    for (int n = 1; n <= rasterCount; n++) {
        GDALRasterBand *poRasterBand = _poDataset->GetRasterBand(n);
        if (!poRasterBand) {
            continue;
        }

        //统计0-255灰度值
        int nBuckets = 256;
        GUIntBig *pBandHistogram = new GUIntBig[nBuckets];
        //正在统计直方图...
        poRasterBand->GetHistogram(-0.5 255.5 nBuckets pBandHistogram FALSE FALSE NULL 0);

        //设置最大最小裁剪比例
        double percentMin = 0.02 percentMax = 0.02;

        //8位图图像数据灰度值。
        int grayScale = 255;
        int countMin = 0 countMax = 0;
        percentMin = int(percentMin * _width * _height);
        percentMax = int(percentMax * _width * _height);

        //找出 percentMin的像素的灰度值
        for (int i = 0; i < nBuckets; i++) {
            countMin += pBandHistogram[i];
            if (countMin >= percentMin) {
                _vecBandedMinValues[n - 1] = i;
                break;
            }
        }

        //找出percnetMax的像素的灰度值
        for (int k = nBuckets - 1; k >= 0; k--) {
            countMax += pBandHistogram[k];
            if (countMax >= percentMax) {
                _vecBandedMaxValues[n - 1] = k;
                break;
            }
        }

        //读取指定范围栅格
        std::vector bandData((maxUds - minUds) * (maxVds - minVds));
        poRasterBand->RasterIO(GF_Read minU minV maxU - minU maxV - minV (void *)&bandData[0] maxUds - minUds maxVds - minVds GDT_Byte 0 0);
//读取完整影像
//poRasterBand->RasterIO(GF_Read 0 0 _width _height (void *)&bandData[0] _width _height GDT_Byte 0 0);

        //拉伸
        int minCount = 0 maxCount = 0 devCount = 0;
        for (int i = 0; i < bandData.size(); i++)
        {
            if (bandData[i] <= _vecBandedMinValues[n-1])
            {
                bandData[i] = 0;
            }
            else if (bandData[i] >= _vecBandedMaxValues[n-1])
            {
                bandData[i] = 256;
            }
            else if (bandData[i] > _vecBandedMinValues[n-1] && bandData[i] < _vecBandedMaxValues[n-1])
            {
                bandData[i] = double(bandData[i] - _vecBandedMinValues[n-1]) / (double)(_vecBandedMaxValues[n-1] - _vecBandedMinValues[n-1]) * 256;
            }
        }
    }
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       3680  2018-09-13 15:45  百分比截断拉伸.cpp

    .......   2703682  2018-09-13 14:45  Screenshot_2018-09-13-14-45-13.png

    .......   2166357  2018-09-07 18:25  Screenshot_2018-09-07-18-25-22.png

----------- ---------  ---------- -----  ----

              4873719                    3


评论

共有 条评论