1

Scala と Geotrellis ライブラリを使用して、Landsat-8 画像の処理と分析を実行していますが、バンド 2、3、および 4 (赤、緑、青) を結合しようとすると、結果のマルチバンド tiff (右) とそれから生成されたpng(左):

http://imgur.com/a/aA4XW

シングルバンド 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) を実行すると、左側の画像のカラフルなバージョンしか得られません。

これが初心者の質問である場合は申し訳ありません。事前に助けてくれてありがとう。

4

1 に答える 1

4

Landsat ピクセル値をバイトのように扱う場合は、それらを 0 ~ 255 に正規化する必要があります。0xFF マスクを使用したレンダリング コードは、値をバイトのように扱います。

コードを機能させるための変更を示す PR は次のとおりです: https://github.com/ardilgulez/gt-1/pull/1

以下は、ランドサット画像を Web マップの PNG としてレンダリングするために正規化とわずかな色補正を行う他のコードの例です: https://github.com/geotrellis/geotrellis-landsat-emr-demo/blob/ 57353688471805b133a04a97ff86b26021e8d7b5/server/src/main/scala/demo/Render.scala#L22

于 2016-07-15T15:31:51.400 に答える