[gdal-dev] How to map Int32 or Float32 GTiff to color map?
Stephen Woodbridge
woodbri at swoodbridge.com
Thu May 15 13:26:52 PDT 2014
Trent - thank you for your idea. That was another idea that I was
thinking about doing but your recipe makes it much clearer on how to do it.
Even - I tried the gdaldem method and after making the color mapping
table it gave me very good results.
Great feedback and suggestions! I think I'm able to move this along now.
Thanks,
-Steve
On 5/15/2014 3:45 PM, Hare, Trent wrote:
> Steve,
> You can think of this very much *as a hack* but I had some success.
> I was also testing how to colorize a DEM (or 32bit floating point image)
> outside of gdaldem. You would need a script to configure the "lut" line
> for each file min/max range though. It does seem to work and you can
> convert to other colorized graphical formats (e.g. PNG) using
> gdal_translate.
>
> example:
> (1) create a 3 band VRT of your original file.
> > ls dem.tif > mylist
> > ls dem.tif >> mylist
> > ls dem.tif >> mylist
> > gdalbuildvrt -separate -input_file_list mylist DEM_3bands.vrt
>
> (2) now manually add or script a <LUT> section for each band (see below
> for color mapping or [dest value]. Original DEM range was from -8.296 to
> 4.022)
>
> <LUT>[src value 1]:[dest value 1],[src value 2]:[dest value 2],...</LUT>
>
> example:
> <LUT>-8.296:75,-7:0,-3:0,-1.5:204,2:255,3.5:255,3.9:150,4.022:255</LUT>
> from: http://www.gdal.org/gdal_vrttut.html
>
>
> kind of crazy and really not tested much... Shows how convenient VRTs
> continue to be.
>
> Good luck,
> Trent
>
>
> example VRT and tiny DEM (1 MB, odd blip on the right):
> https://www.dropbox.com/s/kb8x2vlzmwtl52v/ColorMapping_DEM_toRainbow-BrownWhite_test.zip
>
> screenshot of DEM as converted to PNG:
> > gdal_translate -ot byte -of PNG DEM_3bands.vrt DEM_3bands.png
> https://www.dropbox.com/s/i1kldn7th7w5910/1MM3298IOLBYDEM08P2905_colorize.png
>
>
> -------------------
>
> The above "rainbow to brown to white" color-ramp in percent would be
> mapped at:
> # Red stretch pairs. The pattern is percentage:DN
> 0:75 10:0 40:0 55:204 70:255 85:255 99:150 100:255
>
> # Green stretch pairs. The pattern is percentage:DN
> 0:0 10:0 30:151 40:204 55:204 70:102 85:0 99:75 100:255
>
> # Blue stretch pairs. The pattern is percentage:DN
> 0:102 10:204 25:151 40:0 99:0 100:255
>
> ------------------
>
> Example VRT:
> <VRTDataset rasterXSize="373" rasterYSize="625">
> <GeoTransform>-5.0000000000000000e-001, 1.0000000000000000e+000,
> 0.0000000000000000e+000, 5.0000000000000000e-001,
> 0.0000000000000000e+000,-1.0000000000000000e+000</GeoTransform>
> <VRTRasterBand dataType="Float32" band="1">
> <NoDataValue>-3.40282265508890E+038</NoDataValue>
> <ColorInterp>Red</ColorInterp>
> <ComplexSource>
> <SourceFilename
> relativeToVRT="1">1MM3298IOLBYDEM08P2905.tif</SourceFilename>
> <SourceBand>1</SourceBand>
> <SourceProperties RasterXSize="373" RasterYSize="625"
> DataType="Float32" BlockXSize="373" BlockYSize="5" />
> <SrcRect xOff="0" yOff="0" xSize="373" ySize="625" />
> <DstRect xOff="0" yOff="0" xSize="373" ySize="625" />
>
> <LUT>-8.296:75,-7:0,-3:0,-1.5:204,2:255,3.5:255,3.9:150,4.022:255</LUT>
> </ComplexSource>
> </VRTRasterBand>
> <VRTRasterBand dataType="Float32" band="2">
> <NoDataValue>-3.40282265508890E+038</NoDataValue>
> <ColorInterp>Green</ColorInterp>
> <ComplexSource>
> <SourceFilename
> relativeToVRT="1">1MM3298IOLBYDEM08P2905.tif</SourceFilename>
> <SourceBand>1</SourceBand>
> <SourceProperties RasterXSize="373" RasterYSize="625"
> DataType="Float32" BlockXSize="373" BlockYSize="5" />
> <SrcRect xOff="0" yOff="0" xSize="373" ySize="625" />
> <DstRect xOff="0" yOff="0" xSize="373" ySize="625" />
>
> <LUT>-8.296:0,-7:0,-5:151,-3:204,-1.5:204,2:102,3.5:0,3.9:75,4.022:255</LUT>
> </ComplexSource>
> </VRTRasterBand>
> <VRTRasterBand dataType="Float32" band="3">
> <NoDataValue>-3.40282265508890E+038</NoDataValue>
> <ColorInterp>Blue</ColorInterp>
> <ComplexSource>
> <SourceFilename
> relativeToVRT="1">1MM3298IOLBYDEM08P2905.tif</SourceFilename>
> <SourceBand>1</SourceBand>
> <SourceProperties RasterXSize="373" RasterYSize="625"
> DataType="Float32" BlockXSize="373" BlockYSize="5" />
> <SrcRect xOff="0" yOff="0" xSize="373" ySize="625" />
> <DstRect xOff="0" yOff="0" xSize="373" ySize="625" />
> <LUT>-8.296:102,-6.5:204,-4.5:151,-3:0,3.9:0,4.022:255</LUT>
> </ComplexSource>
> </VRTRasterBand>
> </VRTDataset>
>
>
>
>
> On Thu, May 15, 2014 at 12:08 PM, Stephen Woodbridge
> <woodbri at swoodbridge.com <mailto:woodbri at swoodbridge.com>> wrote:
>
> On 5/15/2014 1:56 PM, Even Rouault wrote:
>
> Le jeudi 15 mai 2014 16:25:12, Stephen Woodbridge a écrit :
>
> Hi all,
>
> I'm trying to create a VRT file for a GTiff that is Int32 or
> Float32 to
> add a ColorTable but I seem to be missing a key piece of
> information.
> How are the pixel values mapped to the color table entries?
> via the
> histogram?
>
> My GTiff has noData=-32767 and good values the range from
> say -5 to 100.
> So do I create a color table that is based on the 256
> buckets in the
> histogram?
>
>
> No way you can use a GDAL color table to map negative values...
> Perhaps you should use gdaldem color-relief to generate a RGB
> output. Note
> that gdaldem color-relief is compatible with VRT output : it
> uses the LUT
> mechanism to do so.
>
>
> OK, I will look at gdaldem, but not wanting to give up on this yet,
> is there a way to change the NoData pixels from -32767 to say -20
> then scale 1.0 and offset the value by 10.
>
> This would make NoData=0
>
> old => new
> -5 5
> 0 10
> 1 11
> 100 110
>
> then I would have all positive values and the range would be manageable?
>
> The scale and offset are already supported in VRT, but I'm not sure
> if it is possible to remap -32767 values to a new value.
>
> Thanks for your response.
>
> -Steve
>
>
>
> So for example I get:
>
> Band 1 Block=256x256 Type=Float32, ColorInterp=Gray
> Min=-32767.000 Max=33.980 Computed Min/Max=-54.985,34.320
> Minimum=-32767.000, Maximum=33.980, Mean=-15887.345,
> StdDev=16386.592
> 256 buckets from -32831.1 to 98.0444:
> 1545169 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> 0 0 0 0 0 0
> 0 0 0 0 0 0 27375 1924356
> NoData Value=-32767
> Metadata:
> STATISTICS_MAXIMUM=33.__979999542236
> STATISTICS_MEAN=-15887.__344614501
> STATISTICS_MINIMUM=-32767
> STATISTICS_STDDEV=16386.__59208246
>
>
> It seems that the NoData value is included in the stats
> which really
> skews the numbers compressing all my values into two
> buckets! How can I
> avoid that? I want to ignore the NoData values and spread my
> good values
> into the remaining buckets. How can I do this?
>
>
> You can't. There's a ticket I think about the fact we should
> ignore nodata
> value in stats.
>
>
> Thanks,
> -Steve
>
> _________________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org <mailto:gdal-dev at lists.osgeo.org>
> http://lists.osgeo.org/__mailman/listinfo/gdal-dev
> <http://lists.osgeo.org/mailman/listinfo/gdal-dev>
>
>
>
> _________________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org <mailto:gdal-dev at lists.osgeo.org>
> http://lists.osgeo.org/__mailman/listinfo/gdal-dev
> <http://lists.osgeo.org/mailman/listinfo/gdal-dev>
>
>
More information about the gdal-dev
mailing list