7

Using @SS_Rebelious very useful answer, I am trying to reclassify rasters using GDAL and Python.

I have a grayscale raster (with values ranging from 0 to 255) and I want to reclassify it to a binary raster.

From the answer I referenced, I'm using the following line:

# reclassify raster values equal 16 to 7 using Numpy
temp = numpy.equal(raster, 16)
numpy.putmask(raster, temp, 7)

I'm experimented with something like this:

temp = numpy.greater_equal(raster, 1)

This seems to work fine, but is this best way of reclassifying a raster using Python?

PolyGeo
65.5k29 gold badges115 silver badges350 bronze badges
asked Oct 7, 2014 at 18:19
3
  • @gene I have looked at it - but I could not find any references to reclassifying rasters. Commented Oct 7, 2014 at 18:24
  • 1
    There are others as GDAL performance: raster classification using NumPy Commented Oct 7, 2014 at 18:55
  • It depends if your raster can fit in your memory. For very large raster numpy arrays might be an issue. Commented Oct 7, 2014 at 19:41

3 Answers 3

11

Yes another way exists.

Just use gdal_calc.py

For example, below will convert the values below 3 to 0 and above 3 to 1. You can use equals as well.

gdal_calc.py -A C:temp\raster.tif --outfile=result.tiff --calc="0*(A<3)" --calc="1*(A>3)"
answered Oct 7, 2014 at 18:55
1
  • Are you sure that this works? In my case it seem that only last --calc is being processed, even though I made sure that new values from previous --calc didn't fall into new condition. Commented Dec 13, 2018 at 9:50
4

to accomplish what your code is doing,

# reclassify raster values equal 16 to 7 using Numpy
temp = numpy.equal(raster, 16)
numpy.putmask(raster, temp, 7)

another, perhaps more intuitive way is:

# reclassify raster values equal 16 to 7 using Numpy
temp = raster == 16 #gives you a numpy array of bools with same shape
raster[temp] = 7
#or a short cut way:
raster[raster == 16] = 7

for compound logic:

#reclassify values 15 and 16 to 7
#first way
mask15 = raster == 15
mask16 = raster == 16
raster[mask15] = 7
raster[mask16] = 7
#shortcut way:
raster[(raster == 15) | (raster == 16)] = 7 #note brackets are needed and the logic is not the usual || 

for a 0-255 raster being converted to binary:

#pick your own threshold other than 150
raster[raster < 150] = 0
raster[raster >= 150] = 1

I hope this helps.

answered Oct 14, 2014 at 4:51
1

Yet another way with numpy is to use the numpy.select method. Which I find really intutive.

The select method takes two lists as arguments. The first expression in the first list will be reclassified to the first value in the second list. This then follows with the second expression being reclassified to the second value in the second list and so on.

The following example reclassifies an aspect raster. Classifying north facing slopes as 1 and everything else as NoData. data is a numpy array of the aspect tif.

outData = numpy.select([data == -9999, (data >= 0) & (data <= 67.5), 
 (data > 67.5) & (data < 292), data >=272],[-9999,1,-9999,1])

The first expression:

 data == -9999

matches the first value -9999 in the second list preserving NoData values.

The second expression in the list:

(data >= 0) & (data <= 67.5)

Corresponds to the second value in the second list 1 and will be reclassify as 1.

The third expression in the first list:

(data > 67.5) & (data < 292)

Corresponds with the third value in te second list -9999 and classify the data as -9999.

The fourth expression in the list:

data >=272

Corresponds with the fourth value in the second list 1 and will be reclassied it as 1.

answered Nov 23, 2016 at 3:02

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.