资源简介
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
- 上一篇:自己写的手机仓库管理系统
- 下一篇:反问题的数值解法
相关资源
- 基于改进势场栅格法的移动机器人路
- 不同热处理工艺对LY12合金拉伸性能的
- Cu45Zr48Al4Nb3非晶复合材料的拉伸性能
- 1:10M全球地形高程光栅格图像
- 连续法沉积热解碳提高碳纤维拉伸强
- GDAL读写shp文件代码
- vc2010下编译好的gdal2.2.4库,支持wms、
- 使用GDAL库处理雷达影像
- gdal_ogr2.0.3.zip
- 使用gdal来显示图像
- 编译好的VS2012使用的gdal库
- 特征点提取Moravec、Forstner、Harris算法
- 占据栅格地图的构建内含数据
- AE栅格表面分析
- AE的栅格计算代码,供参考
- GeoserverTerrainProvider填坑简易教程
- 一套基于QT、GDAL、OpenGL的遥感影像显
- GDAL,geos联合编译的库,版本为1.8.0
- 安徽沈巷镇谷歌地球栅格格式数据
- 图像的点运算(包括图像反色,灰度
- 栅格数据矢量化工具R2V
- 全球气候分带图栅格数据.zip
- 2015年江西省行政区划图
- Qt+GDAL图像显示基本功能
- CHM格式的GDAL的帮助文档
- GDAL源码剖析(李民录).pdf
- 道路可达性分析
- VS2010下编译的GDAL1.9.1最新版
- 基于GDAL读写影像并做线性拉伸,调整
- gdal工具exe
评论
共有 条评论