2016-07-15 5 views
0

Landsat-8 이미지 처리 및 분석을 위해 Scala 및 Geotrellis 라이브러리를 사용하고 있지만 밴드 2, 3 및 4 (빨간색landsat에서 RGB 채널을 결합하고 png로 변환하면 끔찍한 결과가 발생합니다

http://imgur.com/a/aA4XW

singleband tiffs을 결합하는 코드이다 : 또한

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) 
    } 

} 

여기서, 녹색, 청색)과 왼쪽 (그것으로부터 생성 된 결과적인 다중 대역 TIFF (오른쪽) 및 PNG) 인 , 이것은 내 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()합니다. (bwPath를) 쓰기, 내가 얻을 모두 왼쪽 그림의 다채로운 버전입니다.

죄송합니다. 멍청한 질문 일 뿐이며 사전에 도움을 주셔서 감사합니다.

답변

3

바이트처럼 취급하려는 경우 landsat 픽셀 값을 0 - 255로 정규화해야합니다. 0xFF 마스크를 사용하는 렌더링 코드는 바이트와 같은 값을 처리합니다. 여기 https://github.com/ardilgulez/gt-1/pull/1

웹에 대한 PNG 파일로 렌더링하기 위해 표준화 및 탐사 위성 이미지의 약간의 색상 보정을 수행 다른 코드의 예입니다 : 여기

은 당신의 코드 작업을 만들기 위해 변화를 보여주는 PR이다 지도 : https://github.com/geotrellis/geotrellis-landsat-emr-demo/blob/57353688471805b133a04a97ff86b26021e8d7b5/server/src/main/scala/demo/Render.scala#L22