Używanie numpy do wydajnej konwersji 16-bitowych danych obrazu na 8 bitów do wyświetlenia, ze skalowaniem intensywności

Często konwertuję 16-bitowe dane obrazu w skali szarości na 8-bitowe dane obrazu do wyświetlenia. Prawie zawsze przydatne jest dostosowanie minimalnej i maksymalnej intensywności wyświetlania, aby wyróżnić „interesujące” części obrazu.

Poniższy kod robi mniej więcej to, czego chcę, ale jest brzydki i nieefektywny, i tworzy wiele pośrednich kopii danych obrazu.Jak mogę osiągnąć ten sam rezultat przy minimalnym zużyciu pamięci i czasie przetwarzania?

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)

questionAnswers(3)

yourAnswerToTheQuestion