Las imágenes son matrices de números#

Numpy es una biblioteca para procesar listas multidimensionales de números, de las cuales las imágenes de microscopía (pilas, multicanal, lapsos de tiempo, etc.) son un ejemplo destacado. Aquí damos una introducción a esta biblioteca.

Ver también

import numpy as np
from matplotlib.pyplot import imshow

Matrices de Numpy#

Una imagen es simplemente una lista bidimensional de valores de píxeles, en otras palabras, una matriz, con un cierto número de filas y columnas. Por lo tanto, podemos definirla como una lista de listas, siendo cada lista una fila de píxeles:

raw_image_array = [
    [1, 0, 2, 1, 0, 0, 0],
    [0, 3, 1, 0, 1, 0, 1],
    [0, 5, 5, 1, 0, 1, 0],
    [0, 6, 6, 5, 1, 0, 2],
    [0, 0, 5, 6, 3, 0, 1],
    [0, 1, 2, 1, 0, 0, 1],
    [1, 0, 1, 0, 0, 1, 0]
]
raw_image_array
[[1, 0, 2, 1, 0, 0, 0],
 [0, 3, 1, 0, 1, 0, 1],
 [0, 5, 5, 1, 0, 1, 0],
 [0, 6, 6, 5, 1, 0, 2],
 [0, 0, 5, 6, 3, 0, 1],
 [0, 1, 2, 1, 0, 0, 1],
 [1, 0, 1, 0, 0, 1, 0]]
imshow(raw_image_array)
<matplotlib.image.AxesImage at 0x1f9fbdb4b80>
../_images/33579b8adbd4882cc6a8cf342ee2d65b004107c04199c41a019e636cdd7d5fc6.png

Esta salida es casi la misma que la anterior con la diferencia de que ahora se indica que estamos tratando con una array de Numpy. Estas matrices de Numpy ahora pueden tratarse como una sola entidad y podemos realizar los cálculos que antes no podíamos:

image = np.asarray(raw_image_array)
image - 2
array([[-1, -2,  0, -1, -2, -2, -2],
       [-2,  1, -1, -2, -1, -2, -1],
       [-2,  3,  3, -1, -2, -1, -2],
       [-2,  4,  4,  3, -1, -2,  0],
       [-2, -2,  3,  4,  1, -2, -1],
       [-2, -1,  0, -1, -2, -2, -1],
       [-1, -2, -1, -2, -2, -1, -2]])

Ten en cuenta que estos cálculos son muy eficientes porque están vectorizados, es decir, en principio pueden realizarse en paralelo.

Dos propiedades importantes#

Las matrices como image tienen diferentes propiedades. Dos de las más importantes son:

  • la shape de la matriz, es decir, el número de filas, columnas (y canales, planos, etc. para imágenes multidimensionales)

  • el dtype de la matriz, es decir, una imagen de tipo int64 tiene 2 elevado a la potencia de 64 valores de gris diferentes.

image.shape
(7, 7)
image.dtype
dtype('int32')

Otras formas de crear matrices#

Cuando trabajamos con imágenes, a menudo creamos imágenes artificiales para ver qué hacen los filtros con ellas. Por ejemplo, podemos crear una imagen donde todos los píxeles tienen valor 0 excepto uno usando la función de Numpy np.zeros. Requiere especificar un tamaño de imagen.

image_size = (6, 5)

image1 = np.zeros(image_size)
image1
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
imshow(image1)
<matplotlib.image.AxesImage at 0x1f9fc000f10>
../_images/09ab260b13e1180841a9b181822ccdb5209c5d97e5dc706f824ab54453d51510.png

Como las imágenes son solo matrices, simplemente establecemos los valores de los píxeles como si estuviéramos accediendo a matrices. De esto también aprendes que el primer eje (coordenada 0) va de arriba a abajo mientras que el segundo eje (coordenada 3) va de izquierda a derecha.

image1[0,3] = 1

imshow(image1)
<matplotlib.image.AxesImage at 0x1f9fbe7ad90>
../_images/6c0bf2b62d8284502bf59c08097c2d117beb30ee0ab6ec71ee180f0b186cf857.png

Para estudiar el ruido, podemos, por ejemplo, crear una imagen con valores aleatorios usando np.random.random.

image_random = np.random.random((6, 5))
imshow(image_random)
<matplotlib.image.AxesImage at 0x1f9fbef72e0>
../_images/285da33e574aa7a0a1b7dd67933652ded803861171b3da6713e7cb11154f2dae.png