前言
单波段灰度
以“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) ;
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) ;
layer-> setRenderer ( renderer) ;
}
测试效果如下
总结