Manipulación básica de imágenes

Existen una serie de métodos de la clase Mat, que OpenCV pone a disposición del programador para realizar operaciones básicas sobre las imágenes. Ya se ha visto, en apartados anteriores, cómo crear y visualizar una imagen de OpenCV (contenida en un objeto de tipo Mat). En este apartado se describen otros métodos básicos de esta clase, que permiten copiar imágenes, convertir su formato o realizar sobre ellas operaciones matriciales. Para una descripción más detallada de cualquiera de estos métodos, puede accederse a la API de OpenCV.

C++: Mat Mat::clone() const

Este método crea un clon (una copia exacta) de la imagen. La nueva imagen es totalmente independiente de la anterior. Esto es, ocupa un espacio de memoria distinto.

En el apartado de creación de imágenes, en esta misma unidad, se vio cómo era posible asignar unos datos a una imagen, al crearla con un cierto constructor. Sin embargo, tal y como se dijo, en ese caso lo que se hace es apuntar el atributo uchar *data de la nueva imagen a una zona de memoria donde ya están los datos, de forma que posteriores modificaciones sobre estos datos afectarán a la nueva imagen, y viceversa. El método clone, por el contrario, crea una nueva imagen, idéntica a la original, pero independiente, en una nueva zona de memoria.

Mat nueva_imagen = imagA.clone(); // crea en nueva_imagen, un clon de la imagen imagA



C++: void Mat::copyTo(OutputArray m) const

C++: void Mat::copyTo(OutputArray m, InputArray mask) const

En este caso, se realiza una copia de la imagen original en la imagen que se pasa como parámetro (m). Es similar al método clone, explicado anteriormente, pero incorpora una interesante novedad: es posible pasar, como segundo parámetro, una imagen de máscara. Los pixeles que NO están a cero en la imagen de máscara indican los píxeles que se van a copiar a la imagen de salida m. El resto de píxeles (los que en la imagen de máscara están a cero) estarán a cero (=negro) en la imagen de salida.

La imagen de salida (m) se redimensionará para que se ajuste a las medidas y configuración de la imagen que se va a copiar, lo que quiere decir que cualquier contenido que tuviese se pierde.

Mat imag2;
image.copyTo(imag2,image_mask); // crea una copia de image, usando image_mask como máscara, y la guarda en imag2

La siguiente figura muestra el efecto del código de arriba al utilizar una cierta imagen de entrada y una cierta imagen de máscara.

C++: void Mat::convertTo(OutputArray m, int rtype, double alpha=1, double beta=0 ) const

Este método convierte la imagen a un cierto formato, especificado por el parámetro rtype. Algunos ejemplos de valores para este parámetros son los siguientes (la lista completa de opciones se puede ver aquí):

    CV_8U: Cada canal se codifica con un uchar (8 bits).
    CV_16U: Cada canal se codifica con un entero sin signo de 16 bits.
    CV_32F: Cada canal se codifica con un flotante de 32 bits.
    CV_64F: Cada canal se codifica con un flotante de 64 bits.
    ...

Es importante tener en cuenta que, en este método, la imagen original y la convertida tienen siempre el mismo número de canales.

Si se suministran (no es necesario hacerlo), los parámetros alpha y beta alteran el valor de los canales copiados, según la siguiente ecuación (donde m1 es la imagen original y m2 la convertida):

Tal y como se indica en la API de OpenCV, en realidad a esta fórmula se le añade un control de saturación, para que los valores de los canales no excedan el máximo permitido (por ejemplo, 255 si se utiliza un byte para codificar cada canal).

MÉTODOS PARA ACCEDER A LOS PARÁMETROS DE LA IMAGEN

Existen una serie de métodos que permiten consultar diferentes parámetros de configuración de la imagen: tamaño, número de canales, profundidad de canal, etc...

Algunos de estos métodos son:

C++: int Mat::depth() const

Devuelve el valor de profundidad de canal de la imagen.

C++: int Mat::channels() const

Devuelve el número de canales de la imagen.

C++: Size Mat::size() const

Devuelve el tamaño de la imagen en una estructura de tipo Size.

Size tam; tam = image.size(); printf("Tamaño de la imagen: Ancho: %d y Alto %d\n",tam.width,tam.height);

Este código muestra, en la terminal donde se ejecuta el programa, el ancho y el alto de la imagen image.

C++: bool Mat::empty() const

Devuelve un booleano indicando si la imagen esta vacía o no.

OPERACIONES MATRICIALES SOBRE IMÁGENES

No hay que olvidar que las imágenes, en OpenCV, se almacenan en un contenedor de tipo Mat... que es un contenedor genérico de matrices.

La clase Mat incluye muchos métodos destinados a realizar operaciones sobre matrices. Estos métodos permiten invertir una matriz, igualarla a la identidad, multiplicarla, etc.

Dado que las imágenes no son más que una forma de matriz, todos estos métodos se pueden utilizar sobre una imagen, si es necesario. Algunos ejemplos de operaciones matriciales ofrecidas por la clase Mat son:

C++: MatExpr Mat::inv(int method=DECOMP_LU) const

Invierte una matriz.

```C++: static MatExpr Mat::eye(int rows, int cols, int type)

C++: static MatExpr Mat::eye(Size size, int type)```

Crea una matriz identidad.

C++: MatExpr Mat::mul(InputArray m, double scale=1) const

Multiplica la matriz por la matriz m indicada como parámetro. El parámetro scale es opcional.

Actividad

En el programa de ejemplo que se utilizó en la Unidad Práctica 1, añadir instrucciones para hacer lo siguiente:

Mostrar en la terminal (usando printf) el tamaño, número de canales y profundidad de canal de la imagen cargada.
Copiar una imagen, usando otra imagen como máscara (las imágenes que se utilicen como original y máscara tienen que tener el mismo tamaño. Todos los píxeles que estén a cero en la imagen de máscara producirán un píxel negro en la imagen copiada).

Incluid, en el foro de esta Unidad Práctica 2, una captura de pantalla que muestre tanto la terminal con la información requerida, como las imágenes original, de máscara y copiada.

results matching ""

    No results matching ""