Uso de numpy para convertir eficientemente datos de imagen de 16 bits a 8 bits para visualización, con escala de intensidad

Con frecuencia convierto datos de imagen en escala de grises de 16 bits a datos de imagen de 8 bits para su visualización. Casi siempre es útil ajustar la intensidad de visualización mínima y máxima para resaltar las partes "interesantes" de la imagen.

El siguiente código hace aproximadamente lo que quiero, pero es feo e ineficiente, y hace muchas copias intermedias de los datos de la imagen.¿Cómo puedo lograr el mismo resultado con una huella de memoria y un tiempo de procesamiento mínimos?

import numpy

image_data = numpy.random.randint( #Realistic images would be much larger
    low=100, high=14000, size=(1, 5, 5)).astype(numpy.uint16)

display_min = 1000
display_max = 10000.0

print(image_data)
threshold_image = ((image_data.astype(float) - display_min) *
                   (image_data > display_min))
print(threshold_image)
scaled_image = (threshold_image * (255. / (display_max - display_min)))
scaled_image[scaled_image > 255] = 255
print(scaled_image)
display_this_image = scaled_image.astype(numpy.uint8)
print(display_this_image)

Respuestas a la pregunta(3)

Su respuesta a la pregunta