Medidas e histogramas#

Bosquejo del capítulo

  • Se pueden realizar mediciones en imágenes calculando estadísticas a partir de los valores de píxeles

  • Los histogramas muestran la distribución de los valores de píxeles en una imagen y son extremadamente útiles para comparar imágenes y diagnosticar problemas.

Hide code cell content
%load_ext autoreload
%autoreload 2

# Default imports
import sys
sys.path.append('../../../')
from helpers import *
from matplotlib import pyplot as plt
from myst_nb import glue
import numpy as np
from scipy import ndimage

Introducción#

Imágenes y píxeles demostró cómo las apariencias pueden engañar: la apariencia visual de una imagen no es suficiente para determinar qué datos contiene.

Debido a que el análisis científico de imágenes depende, en primer lugar, de tener los valores de píxeles correctos, esto lleva a una importante advertencia:

¡Mantenga seguros sus valores de píxeles originales!

Los valores de píxeles de su imagen original son sus datos sin procesar: es esencial protegerlos de cambios no deseados.

Esto es realmente importante porque hay muchas maneras de comprometer accidentalmente los datos sin procesar de una imagen, como usar el software incorrecto para ajustar el brillo y el contraste, o guardar los archivos [en el formato incorrecto] (chap_files). Esto puede provocar que los resultados del análisis sean erróneos.

Lo que hace que esto sea especialmente complicado es que las imágenes confiables y las no confiables pueden parecer idénticas. Por lo tanto, necesitamos una forma de ver más allá de las LUT para comparar el contenido de las imágenes de manera fácil y eficiente.

Comparación de histogramas y estadísticas#

En principio, si queremos comparar dos imágenes podríamos comprobar que cada valor de píxel correspondiente es idéntico en ambas imágenes. Usaremos este enfoque más adelante, pero no siempre es necesario.

Hay otras dos cosas que podemos hacer, que suelen ser mucho más rápidas y sencillas:

  1. Calcule algunas estadísticas resumidas a partir de los valores de píxeles, como el valor promedio (media) de píxeles, la desviación estándar y los valores mínimo y máximo.

  2. Mira la imagen histograma. Esto representa gráficamente la distribución de los valores de píxeles en la imagen.

Al activar estos elementos, podemos recrear Figura 4 pero esta vez agrega

  1. la LUT (que se muestra como una barra de color debajo de la imagen)

  2. un histograma

  3. un resumen estadístico

Hide code cell content
# Create 4 images with different values that look the same

im = load_image('sunny_cell.tif')
assert im.dtype == np.uint16

fig = create_figure(figsize=(12, 5))
colorbar_params = dict(shrink=0.9, orientation='horizontal')

# Original image, with 1% clipped for display
vmin = np.percentile(im, 1)
vmax = np.percentile(im, 99)
show_image(im, cmap='gray', title='Original 16-bit image', vmin=vmin, vmax=vmax, pos=241)
add_colorbar(**colorbar_params)

# 32-bit, rescaled
im2 = (im.astype(np.float32) - im.mean()) / im.std() * 50
vmin2 = np.percentile(im2, 1)
vmax2 = np.percentile(im2, 99)
show_image(im2, cmap='gray', title='32-bit processed', vmin=vmin2, vmax=vmax2, pos=242)
add_colorbar(**colorbar_params)

# 8-bit, clipped
im3 = im.astype(np.float32)
im3 = (im3 - vmin) / (vmax - vmin) * 255
im3 = np.clip(im3, 0, 255)
im3 = im3.astype(np.uint8)
show_image(im3, cmap='gray', title='8-bit clipped', vmin=0, vmax=255, pos=243)
add_colorbar(**colorbar_params)

# 8-bit, clipped, then inverted with inverted LUT
im4 = 255 - im3
show_image(im4, cmap='gray_r', title='Inverted with inverted LUT', vmin=0, vmax=255, pos=244)
add_colorbar(**colorbar_params)

# Show corresponding histograms
bins = 128
show_histogram(im, pos=245, stats='right', bins=bins)
show_histogram(im2, pos=246, stats='right', bins=bins)
show_histogram(im3, pos=247, stats='right', bins=bins)
show_histogram(im4, pos=248, stats='left', bins=bins)

plt.tight_layout()
glue_fig('fig_images_look_same_histograms', fig)
../../../_images/8022658a121f93e1e9b368ac858c91ad7f3ef3729eb1983bcfd4f2ee149d63a4.png

Figura 11 Recreación de Figura 4 que muestra imágenes que lucen iguales, pero contienen valores de píxeles diferentes, esta vez con medidas e histogramas incluidos.#

Con la información adicional a nuestra disposición, podemos ver inmediatamente que las imágenes realmente contienen valores subyacentes diferentes y, por lo tanto, información potencialmente bastante diferente, a pesar de su apariencia inicial similar. También podemos ver que las LUT son diferentes; muestran los mismos colores (tonos de gris), pero en cada caso se asignan a valores diferentes.

Por el contrario, cuando aplicamos los mismos pasos a Figura 5 vemos que los histogramas y las estadísticas son idénticos: solo se ha cambiado la LUT en cada caso. Esto sugiere que cualquier análisis que realicemos en cada una de estas imágenes debería dar los mismos resultados, ya que los valores de los píxeles permanecen intactos.

Hide code cell content
# Display the same image in 4 different ways by changing the LUT/colormap

im = load_image('sunny_cell.tif')
assert im.dtype == np.uint16

# Create 5 images with the same values that look different
fig = create_figure(figsize=(12, 5))
cbar_params = dict(shrink=0.9, orientation='horizontal')

# Original image, with 1% clipped for display
vmin = np.percentile(im, 1)
vmax = np.percentile(im, 99)
show_image(im, cmap='gray', title='Original 16-bit image', vmin=vmin, vmax=vmax, pos=241)
add_colorbar(**colorbar_params)

# Original image, with 10% clipped for display
vmin2 = np.percentile(im, 10)
vmax2 = np.percentile(im, 90)
show_image(im, cmap='gray', title='Enhanced contrast LUT', vmin=vmin2, vmax=vmax2, pos=242)
add_colorbar(**colorbar_params)

# Invert the LUT (in matplotlib, just add '_r' at the end)
show_image(im, cmap='gray_r', title='Inverted LUT', vmin=vmin, vmax=vmax, pos=243)
add_colorbar(**colorbar_params)

# Use an alternative LUT
show_image(im, cmap='magma', title='Magma LUT', vmin=vmin, vmax=vmax, pos=244)
add_colorbar(**colorbar_params)

# Show corresponding histograms
bins = 128
show_histogram(im, pos=245, stats='right', bins=bins)
show_histogram(im, pos=246, stats='right', bins=bins)
show_histogram(im, pos=247, stats='right', bins=bins)
show_histogram(im, pos=248, stats='right', bins=bins)

plt.tight_layout()
glue_fig('fig_images_look_different_histograms', fig)
../../../_images/7346afa7cf9a64f715e0a396f557378389c14217ca06a8a3aa072adb6b751709.png

Figura 12 Recreación de Figura 5 que muestra imágenes que parecen diferentes, pero contienen los mismos valores de píxeles, esta vez con medidas e histogramas incluidos.#

Si dos imágenes tienen histogramas y estadísticas resumidas idénticas (media, mínimo, máximo, desviación estándar), ¿esto prueba que las imágenes son idénticas?

¡No! Por ejemplo, podríamos tener los mismos valores de píxeles en una disposición diferente. Si mezclo aleatoriamente los píxeles de la imagen, las estadísticas básicas y el histograma permanecen sin cambios, pero la imagen en sí es muy diferente.

../../../_images/129e52b214006beea3918a635bc9ef4fb07fe02c6b8f583f55060a4bfe2da1d2.png

Esto significa que, técnicamente, sólo podemos usar histogramas y mediciones resumidas para demostrar que las imágenes definitivamente no son iguales.

Sin embargo, en la práctica esto suele ser suficiente. Si dos imágenes tienen histogramas y estadísticas resumidas idénticas y parecen similares, es muy probable que sean iguales.

Es posible que alguien intente engañarnos haciendo algún cambio muy sutil en una imagen que conserve las estadísticas, como intercambiar dos píxeles entre millones para que no notemos la diferencia. Más adelante veremos cómo superar incluso eso comprobando cada píxel, pero un engaño tan elaborado probablemente no sea un riesgo muy real para la mayoría de nosotros.

La mayoría de las veces, cuando las cosas van mal con las imágenes científicas, el histograma y las estadísticas se verán comprometidos de manera obvia; sólo debemos recordar verificar estos cambios.

La capacidad de generar e interpretar histogramas rápidamente es una habilidad esencial para cualquier analista de imágenes. Usaremos mucho histogramas a lo largo de este texto, tanto para ayudar a diagnosticar problemas con los datos como para determinar qué técnicas debemos usar.

¡Haz de los histogramas un hábito!

Cuando se trabaja con imágenes nuevas, es un buen hábito siempre comprobar los histogramas. Esto puede brindar una comprensión más profunda de los datos y ayudar a detectar problemas potenciales.