Tuve el mismo problema hace varios años y luego hice mi propio programa Imhof usando Python y numérico. El truco consiste en seleccionar un rango de altitudes y aplicar una paleta de colores lineal. Al final debes combinar los diferentes resultados. Este es un fragmento de mi código (muy simplificado)
......
abajos = nrange(dtm, 0,500)
amedias = nrange(dtm, 499, 4000)
amaximas = where (dtm > 4000, dtm, 0)
.......
abajos_i = convert.num2img(abajosbin)
abajos_ic = ImageOps.colorize(abajos_i, (147, 160, 150),(215, 210, 188))
amedias_i = convert.num2img(amediasbin)
amedias_ic = ImageOps.colorize(amedias_i, (215, 210, 188), (206, 187, 173))
amaximas_i = convert.num2img(amaximasbin)
amaximas_ic = ImageOps.colorize(amaximas_i, (206, 187, 173), (255,255,255))
ImageOps es parte del paquete Python Image.
La conversión de tiff (16b) a numérico fue una locura usando pynumeric (creo, no recuerdo muy bien).
Las tuplas como (147, 160, 150), (215, 210, 188) significan de qué color a qué color quiero que mi rampa de color y esos RGB reflejen la paleta de Imhof.
El resultado es un DTM con una paleta Imhof muy detallada, mucho más de 256 colores.
Si alguien quiere hacer un plugin Imhof, estoy muy contento de pasar el código.