资源简介
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
- 上一篇:自己写的手机仓库管理系统
- 下一篇:反问题的数值解法
相关资源
- Qt+GDAL图像显示基本功能
- CHM格式的GDAL的帮助文档
- GDAL源码剖析(李民录).pdf
- 道路可达性分析
- VS2010下编译的GDAL1.9.1最新版
- 基于GDAL读写影像并做线性拉伸,调整
- gdal工具exe
- 编译好的GDAL库
- Cesium生成离线terrain地形数据所需所有
- 沉浸式状态栏+头部拉伸+一键置顶
- GDAL-2.2.4-cp27-cp27m-win32.whl
- GDAL读取SHP文件完美解决中文无乱码,
- qt结合gdal实现图像读取操作
- GDAL打开ESRI FileGDB格式数据
- GDAL1.11 X86 X64
- 2015年全国人口空间分布公里网格数据
- QTMinGw下已经编译好的gdal库
- 编译可调试版的GDAL 2.2.1,并且添加
- 栅格数据金字塔构建工具
- 《GDAL源码剖析与开发指南》书籍代码
- GDAL1.10编译完成版
- 编译好的gdal,仅适用于VS2017
- GDAL源码剖析与开发指南
- VLC.dotNet播放器-回调方式支持拉伸充满
- GDAL源码剖析与开发指南(高清版)
- GDAL源码剖析与开发指南中文高清完整
- OpenCL坡度提取GDAL
- 全球信息栅格通信能力建设研究
- ArcGIS模型构建器-分割栅格工具tbx格式
- ArcEngine栅格数据渲染
评论
共有 条评论