Visión artificial. Tomás Domínguez Mínguez
Чтение книги онлайн.
Читать онлайн книгу Visión artificial - Tomás Domínguez Mínguez страница 8
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:
3.4 MODIFICACIÓN DEL VALOR DE LOS PÍXELES DE UNA IMAGEN
Como sabe, una imagen se representa por una matriz de elementos, cada uno de los cuales es una tupla cuyos valores determinan la intensidad del color azul, verde y rojo de cada píxel (o únicamente el nivel de luz, en caso de tratarse de una imagen en blanco y negro). Para entender la forma de acceder a un píxel, tanto para obtener su valor como para asignarle otro diferente, observe la siguiente imagen, en la que hay un píxel negro situado en la posición (3, 1).
Puesto que la imagen está formada por una matriz, en la que sus elementos se distribuyen por filas y columnas, si estuviera almacenada en la variable img, la forma de obtener el valor de dicho píxel (nivel de luz) sería:
valor = img[fila, columna]
La fila viene dada por la coordenada y, mientras que la columna es la coordenada x. Por eso, para obtener el color del punto (3, 1), se deberá usar la expresión:
color = img[1, 3]
Esto suele ser motivo de confusión. Por eso, preste especial atención cada vez que tenga que acceder a un píxel de la imagen.
Una vez que se accede a un píxel, no solo es posible obtener su valor, sino también modificarlo. Eso es precisamente lo que hará en el siguiente programa, con el que, partiendo de la imagen blanca generada en el apartado anterior, dibujará una rejilla. La forma de hacerlo será recorriendo todos sus píxeles para asignarles el valor 0 (negro) a intervalos regulares. Puesto que dichos intervalos se tomarán tanto en el eje horizontal como en el vertical, las líneas que se dibujen conformarán una rejilla.
El código del programa es el siguiente.
La primera parte del programa crea una imagen en blanco de 300 × 300 píxeles de tamaño. Su código ya lo conoce, por lo que no se va a dar ninguna explicación al respecto.
Una vez creada dicha imagen, se asigna el valor 0 a cada píxel en las coordenadas x e y, a intervalos regulares de 50 píxeles. Es decir, se dibujan de color negro los píxeles situados en las filas o columnas 0, 50, 100, 150, 200 y 250. El resultado será una imagen formada por 6 cuadrados de lado.
La forma de recorrer todos los píxeles de una imagen es mediante un doble bucle, cada uno de los cuales se desplaza por un eje.
Por simplicidad del código, no se dibujan las últimas líneas horizontal y vertical de la rejilla.
Para identificar los píxeles que deben pintarse en negro, es decir, aquellos cuyas coordenadas x o y sean múltiplos de 50, se utiliza el operador ‘%’, que devolverá el valor 0 en esos casos.
La sentencia clave del programa es la que se ejecuta cuando se cumple la condición del if anterior, es decir, la que pinta de negro los píxeles de las líneas. Para ello, solo hay que acceder a ellos, tal como se ha explicado, y asignarles el valor 0.
Por último, se muestra la rejilla en pantalla con la función imshow().
cv2.imshow(‘Rejilla ‘, img)
Ejecute el programa. Cuando lo haga, obtendrá el resultado mostrado a continuación.
¿Y si hubiera querido pintar la rejilla en color? En ese caso, la imagen blanca de fondo se debería haber creado con tres canales. Suponiendo que se quiere dibujar las líneas de color rojo, el programa sería:
El código utilizado para crear una imagen blanca de tres canales (en vez de uno, como en el programa anterior) es el mismo desarrollado para crear ventanas con el fondo de color, solo que ahora ese color es el blanco.
Para la asignación del color rojo a los píxeles que forman parte de las líneas de la rejilla, ahora se utiliza una terna (en este caso la que identifica el color rojo), en vez de un nivel de luz.
El resultado de la ejecución de este programa será el mostrado a continuación.
3.5 ALMACENAMIENTO DE UNA IMAGEN EN UN ARCHIVO
Ya sabe cómo mostrar en pantalla las imágenes cargadas previamente de un archivo o creadas dentro del propio programa como un objeto de la clase ndarray. Ahora va a aprender a guardarlas en un fichero. Para ello, OpenCV proporciona la función:
imwrite(archivo, imagen)
El primer argumento de esta función es el nombre del archivo (o un path) en el que se va a guardar la imagen contenida en el segundo.
Para practicar con esta nueva función, completará el programa del apartado anterior, en el que dibujaba una rejilla, para que, en vez de mostrarla, se almacene en un archivo. El código del programa es el siguiente.