title: Using numpy to efficiently convert 16-bit image data to 8 bit for display, with intensity scaling
body: <p>I frequently convert 16-bit grayscale image data to 8-bit image data for display. It's almost always useful to adjust the minimum and maximum display intensity to highlight the 'interesting' parts of the image.</p>
  
  <p>The code below does roughly what I want, but it's ugly and inefficient, and makes many intermediate copies of the image data. <strong>How can I achieve the same result with a minimum memory footprint and processing time?</strong></p>
  
  <pre><code>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 &gt; display_min))
  print(threshold_image)
  scaled_image = (threshold_image * (255. / (display_max - display_min)))
  scaled_image[scaled_image &gt; 255] = 255
  print(scaled_image)
  display_this_image = scaled_image.astype(numpy.uint8)
  print(display_this_image)
  </code></pre>