我正在使用Scala和Geotrellis库来执行Landsat-8图像的处理和分析,但是当我尝试组合2,3和4(红色,绿色和蓝色)时,这就是产生的多波段tiff(右)和从它生成的png(左):
组合单频段tiff的代码是:
class Tiler ( outputPath : String, bandIds : Array[String] ){
def bandPath(b: String) = s"data/landsat/LC81750342016185LGN00_B${b}.TIF"
def obtainBands() : (ArrayMultibandTile, SinglebandGeoTiff) = {
var tileArrayBuffer = ArrayBuffer[Tile]()
var geoTiff : SinglebandGeoTiff = null
bandIds.foreach((bandId) => {
geoTiff = SinglebandGeoTiff(bandPath(bandId))
tileArrayBuffer += geoTiff.tile
})
(ArrayMultibandTile(tileArrayBuffer), geoTiff)
}
def writeResultToFS(multiBand : MultibandTile, extent : Extent, crs : CRS) : Unit = {
MultibandGeoTiff(multiBand, extent, crs).write(outputPath)
}
def parseTiles() : Unit = {
val (multiBandTileArray, geotiff) = obtainBands()
writeResultToFS(multiBandTileArray, geotiff.extent, geotiff.crs)
}
}
另外,这是我的png转换器代码:
class PngTest() {
val tiffPath = "data/output/output.tif"
val bwPath = "data/output/bw.png"
def makepng(): Unit = {
println("Rendering PNG and saving to disk...")
val conversionMap = {
val multibandTile = MultibandGeoTiff(tiffPath).tile.convert(IntConstantNoDataCellType)
multibandTile.combine(0, 1, 2) { (rBand, gBand, bBand) =>
val r = if (isData(rBand)) { rBand } else 0
val g = if (isData(gBand)) { gBand } else 0
val b = if (isData(bBand)) { bBand } else 0
if(r + g + b == 0) 0
else {
val color = ( r + g + b ) / 3
((color & 0xFF) << 24) | ((color & 0xFF) << 16) | ((color & 0xFF) << 8) | 0xFF
}
}
}
conversionMap.renderPng().write(bwPath)
}
}
当我删除转换地图并执行MultibandGeoTiff(tiffPath).tile.convert(IntConstantNoDataCellType).renderPng()。write(bwPath)时,我得到的只是左图的彩色版本。
很抱歉,如果这是一个菜鸟问题,请提前感谢您的帮助。
答案 0 :(得分:4)
如果要将它们视为字节,则需要将landsat像素值标准化为0 - 255。带有0xFF掩码的渲染代码将值视为字节。
这是一个PR,它显示了使代码有效的更改:https://github.com/ardilgulez/gt-1/pull/1
以下是一些其他代码的示例,它们对标志图像进行标准化和轻微颜色校正,以便将它们渲染为网络地图的PNG:https://github.com/geotrellis/geotrellis-landsat-emr-demo/blob/57353688471805b133a04a97ff86b26021e8d7b5/server/src/main/scala/demo/Render.scala#L22