文章目录
- 前言
- 单波段灰度
- QGis设置为单波段灰度
- 二次开发代码实现单波段灰度
- 总结
前言
- 介绍栅格图层数据渲染之单波段灰度显示
- 说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps
单波段灰度
- 以“3420C_2010_327_RGB_LATLNG.tif”数据为例,在QGis中加载默认显示如下图
QGis设置为单波段灰度
- 在图层属性的“Symbology”选项卡中选择“Render type”为“Singleband gray”,如图所示
- 在“Gray band”中选择需要渲染的波段;在“Color gradient”中选择渐变方向,包括从黑色到白色(Black to white)和从白色到黑色(White to Black)两种方式。
- 在“Contrast enhancement”中选择对比度增强方法,包括无增强(No enhancement)、拉伸到最小值和最大值之间的范围(Stretch to MinMax)、拉伸并裁剪到最小值和最大值之间的范围(Stretch and clip to MinMax)、裁剪到最小值和最大值之间的范围(Clip to MinMax)。经过裁剪后,超出范围的像元将不显示在地图画布上;反之,则显示为黑色或白色。
- 在“Min”和“Max”中输入渐变区域的最小值和最大值,或者通过“Min / Max ValueSettings”中的四个选项进行自动设置。
- User defined:用户自定义最大值和最小值。
- Cumulative count Cut:按照数值从小到大排列,仅保留一定百分比内的数值,去除可能存在的异常值。
- Min / max:设置为波段内数值的最小值或最大值。
- Mean +/- standard deviation:取平均值左右两侧一个标准差范围内的数值,以及μ- σ与μ+σ之间的数值(μ表示平均值,σ表示标准差)。
- 在“Statistics extent”中选择上述设置的统计范围,包括整个影像(Whole raster)、当前范围(Current canvas)和随范围变化(Updated canvas)。随范围变化指当用户改变地图范围时,栅格数据渲染的最大值和最小值也随之变化。
- 在“Accuracy”中选择最大值和最小值的计算精度,包括估计(较快)[Estimate (faster)]和精确(较慢)[Actual (slower)]两种。
- “Layer Rendering”选项区域设置显示效果,包括混合模式(Blending mode)、亮度(Brightness)、对比度(Contrast)、饱和度(Saturation)、灰阶(Grayscale)等。
- 在“Resampling”选项区域可以设置显示效果的重采样方法,包括上采样(放大地图时插值数据)和下采样(缩小地图时抽取数据)两种。上采样(Zoom in)包括最邻近法(Nearest neighbour)、双线性法(Bilinear)和三次立方法(Cubic);下采样(Zoom out)包括最邻近法(Nearest neighbour)和平均值法(Average)。另外,还可以在“Oversampling”中选择过采样系数(默认为2,使用最邻近法时无效)。通常,默认的最邻近法渲染速度最快,但是使用双线性法(Bilinear)和三次立方法(Cubic)时渲染效果更好。
- 属性设置完成后,图层渲染效果如下图
二次开发代码实现单波段灰度
- 类
QgsSingleBandGrayRenderer
是单波段灰度渲染器,详情见文档,类图如下
- 其构造函数有两个参数:
QgsSingleBandGrayRenderer( QgsRasterInterface *input, int grayBand );
,分别传入dataProvider和波段序号,代码如下
const int grayBand = 1;
QgsSingleBandGrayRenderer *renderer = new QgsSingleBandGrayRenderer( layer->dataProvider(), grayBand );
- 调用类的成员函数setters,如
void setGradient( Gradient gradient )
设置参数,代码如下
renderer->setGradient(QgsSingleBandGrayRenderer::BlackToWhite);//
QgsContrastEnhancement *ce = new QgsContrastEnhancement( ( Qgis::DataType )(layer->dataProvider()->dataType( grayBand ) ) );
ce->setContrastEnhancementAlgorithm(QgsContrastEnhancement::StretchToMinimumMaximum);
ce->setMinimumValue(-1);
ce->setMaximumValue(2630);
renderer->setContrastEnhancement(ce);
QgsRasterMinMaxOrigin mmOrigin = renderer->minMaxOrigin();
renderer->setMinMaxOrigin(mmOrigin);
//QgsRasterLayer中有Layer Rendering和Resampling中的相应设置
- 最后设置图层的渲染器即可
- 完整测试代码如下
void MainWindow::rasterSinglebandGraySlot()
{
//添加测试图层
QgsRasterLayer *layer = addTestRaster("maps/raster/3420C_2010_327_RGB_LATLNG.tif");
//
const int grayBand = 1;
QgsSingleBandGrayRenderer *renderer = new QgsSingleBandGrayRenderer( layer->dataProvider(), grayBand );
renderer->setGradient(QgsSingleBandGrayRenderer::BlackToWhite);//
QgsContrastEnhancement *ce = new QgsContrastEnhancement( ( Qgis::DataType )(layer->dataProvider()->dataType( grayBand ) ) );
ce->setContrastEnhancementAlgorithm(QgsContrastEnhancement::StretchToMinimumMaximum);
ce->setMinimumValue(-1);
ce->setMaximumValue(2630);
renderer->setContrastEnhancement(ce);
QgsRasterMinMaxOrigin mmOrigin = renderer->minMaxOrigin();
renderer->setMinMaxOrigin(mmOrigin);
//QgsRasterLayer中有Layer Rendering和Resampling中的相应设置
layer->setRenderer(renderer);
}
- 测试效果如下
总结
- 介绍了栅格图层单波段灰度渲染的使用