文章目錄
- 前言
- 單波段灰度
- 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);
}
- 測試效果如下
總結
- 介紹了柵格圖層單波段灰度渲染的使用