I need to normalize the values attained from a band ratio to 0-255. I'm using QGIS. How do I do this? Any ideas?
-
2Because it's a ratio, watch out! E.g., if it's a ratio of two 0-255 images with equalized histograms, then half the ratios will be between 0 and 1 while the other half will be between 1 and 255 (and some will be undefined): that's a huge discrepancy in ranges! Depending on your purpose, the logarithm of the ratio might be a better quantity to compute; better yet, compute log((1+band1)/(1+band2)) to avoid undefined quantities. At the very least this will produce a more readable map.– whuberCommented Jun 29, 2012 at 16:00
2 Answers
The following will stretch your data to 8-bit (0-255).
smin=0; smax=255
( x - min(x) ) * (smax - smin) / ( max(x) - min(x) ) + smin
It should be fairly easy to translate this to the raster algebra syntax in your software of choice. You will just need to know what the min and max values are in your raster. If the raster is the result of a band ratio then it is safe to assume -1 to 1 and the syntax should look something like this.
NewRaster = ( OldRaster - -1 ) * 255 / ( 1 - -1 ) + 0
-
1+1: General answers (syntax independent) have broad application. Welcome to our site, Jeffrey!– whuberCommented Jun 29, 2012 at 18:16
-
1The first
smax
term really should besmax - smin
- in the example (0-255) it doesn't matter, but does wheresmin
!= 0 Commented Jun 19, 2017 at 11:48
You can use gdal_translate utility. Use the option -scale [src_min src_max [dst_min dst_max]] with src_min and src_max as current min/max values from your data and 0,255 as dst_min,dst_max. Without the square brackets.
If you have installed QGIS with OSGeo4W package, you may have the terminal program called 'MSYS'. Open that and just use the gdal_translate command. If not, from within QGIS choose Raster -> Conversion - > Translate. Choose your files and options. At the bottom of the window the full gdal_translate command will be displayed. Click edit and add the -scale option.
-
When scaling to the 0-255 range, the bare -scale option can be used, the
src_min
andsrc_max
will be set from the input raster and 0 and 255 will be used asdst_min
anddst_max
Commented Nov 20 at 19:23