Читать книгу Visión artificial - Tomás Domínguez Mínguez - Страница 12
3.3 CREACIÓN DE UNA IMAGEN A PARTIR DE UNA MATRIZ DE PÍXELES
ОглавлениеComo ya sabe, una imagen es un objeto ndarray que contiene una matriz cuyos elementos establecen el nivel de luz (o color) de cada píxel. Si la imagen fuera en blanco y negro, el valor de dichos elementos sería un entero comprendido entre el 0 (oscuridad absoluta) y el 255 (máximo nivel de luz). Para entenderlo mejor, en la siguiente figura se muestra una imagen negra de 5 × 5 píxeles y su representación como una matriz.
En Python, esta matriz de píxeles sería la siguiente:
Para convertir dicha matriz en un objeto de la clase ndarray, que es como realmente se representan las imágenes en OpenCV, tendría que utilizar la función array() de la propia librería NumPy. El código sería el siguiente:
Más abajo puede ver el resultado de la ejecución de este programa, que muestra en la shell la matriz que representa una imagen negra de 5 × 5.
Observe que una matriz NumPy no muestra sus elementos separados por comas.
Sin embargo, esta forma de trabajar no sería práctica cuando se manejan imágenes con una resolución de miles de píxeles. Por eso, la librería NumPy permite crear esta matriz de forma más sencilla, mediante la función:
zeros(dimensiones, tipo)
El primer argumento es una tupla con las dimensiones de la matriz. El segundo es el tipo de los elementos que contiene. Así, el programa anterior podría sustituirse por:
Antes de ejecutar la función que crea la imagen, es necesario importar la librería NumPy, ya que la clase ndarray pertenece a dicha librería, no a OpenCV. La imagen devuelta por la función zeros() es de 5 × 5 píxeles, mientras que la información almacenada en cada píxel son valores enteros sin signo entre 0 y 255 (uint8). El resultado de la ejecución de este programa sería el mismo que el anterior.
Una vez que ya tiene creada la imagen, solo resta visualizarla con la función imshow():
En este caso, la imagen creada es de 300 × 300 píxeles. El resultado de la ejecución de este programa puede verlo a continuación.
Para crear una imagen blanca, tal como se muestra gráficamente en la siguiente imagen, los valores de cada uno de los píxeles deben ser 255.
Con el fin de facilitar la creación de dicha matriz de píxeles, NumPy dispone de una función similar a zeros(), solo que ahora el valor de todos sus elementos es 1.
ones(dimensiones, tipo)
Así, para crear una imagen completamente blanca, solo habría que multiplicar por 255 cada uno de los elementos de la matriz generada por dicha función. Por lo tanto, el código del programa que mostraría una imagen blanca de 300 × 300 píxeles es:
El resultado de la ejecución del programa anterior es la siguiente ventana.
Si lo que se busca es una imagen en color, los píxeles deberán contener información del nivel de intensidad de cada uno de los colores primarios, los cuales pueden tomar un valor entre 0 y 255. Por lo tanto, para crear una imagen de color azul, el código que tendría que escribir sería:
Como puede observar, ahora la matriz tiene una nueva dimensión, ya que sus elementos se componen de tres valores, correspondientes a los niveles de intensidad de los tres colores primarios en cada píxel.
img = numpy.ones((alto, ancho, 3),numpy.uint8)*255
También podría haberse utilizado la función zeros(), ya que, posteriormente, se cambia el valor de todos los elementos de la matriz para colorear la imagen.
La siguiente sentencia asigna el mismo color a todos los píxeles (en este caso, el azul).
Aunque se ha usado una tupla para asignar el color, también se podría haber empleado una lista. Por ese motivo, la siguiente sentencia sería igualmente válida:
De las imágenes que hay más abajo, la de la izquierda corresponde al resultado de la ejecución de este programa. Las otras dos se obtendrían modificando la sentencia que asigna el color a los píxeles. En el caso del verde:
O si prefiere el rojo: