jueves, 9 de febrero de 2017

Una pirámide de imágenes es un conjunto de imágenes con tamaño decreciente o creciente, se les llama de este modo por la forma de pirámide que se origina el organizarlas en forma consecutiva una sobre la otra.

Entre los métodos más conocidos para la generación de las pirámides de imagen tenemos:  Pirámides Gaussianas y Pirámides Laplacianas.

pyramid

La imagen original se encuentra en la base de la pirámide, mientras que la mas pequeña estará en lo mas alto, en el mundo de los gráficos 3D a estas pirámides se les conoce con el nombre de mipmap.

Pirámides Gaussianas

En una pirámide Gaussiana cada nivel de la pirámide es suavizado por un kernel Gaussiano simétrico y submuestrado para obtener la siguiente capa. En OpenCV las generamos usando las funciones cv::pyrDown y cv::pyrUp.

void pyrDown(InputArray src, OutputArray dst, const Size& dstsize = Size(), int borderType = BORDER_DEFAULT)

Esta función calcula la siguiente imagen más pequeña en la pirámide, debemos indicarle la imagen de entrada y el destino donde de almacenará, los dos últimos parámetros son opcionales, si no indicamos el tamaño este será un cuarto de la imagen original, calculado de la siguiente manera: Size((src.cols+1)/2, (src.rows+1)/2). 

void pyrUp(InputArray src, OutputArray dst, const Size& dstsize = Size(), int borderType = BORDER_DEFAULT)

Esta función actúa de manera similar a la anterior, salvo que no calcula la imagen siguiente más pequeña, si no la mas grande, generando la pirámide en orden inverso.

El siguiente ejemplo de código genera una pirámide de imágenes de cinco elementos, para generarla solo debemos ejecutar pyrDown sobre la imagen anterior.

Mat image = imread(R"(..\opencv-3.2.0\samples\data\lena.jpg)", CV_LOAD_IMAGE_COLOR);
imshow("Original Image", image);

for (size_t i = 0; i < 5; i++)
{
      pyrDown(image, image); 
      imshow(to_string(image.size().width), image);
}

píramide gaussiana opencv

La función pyrUp al contrario de pyrDown va a generar imágenes de más grandes que la original, lo demás funciona igual.

Pirámides Laplacianas

Cada una de las capas finas de la pirámide Laplaciana es la diferencia entre una capa de pirámide Gaussiana y una predicción obtenida sobre muestreando la siguiente capa Gaussiana de la pirámide.

Mat temp1, temp2, temp3;
image.copyTo(temp1);

for (size_t i = 0; i < 4; i++)
{
    pyrDown(temp1, temp2);
    pyrUp(temp2, temp3, temp1.size());

    Mat lap = temp1 - temp3;

    imshow(to_string(lap.size().width), lap);
    temp1 = temp2;
}

pirámide laplaciana opencv

En próximos tutoriales veremos las aplicaciones que podemos darle a las pirámides de imágenes con OpenCV 3.x.

Código en GitHub: Pirámide de Imágenes.

Ver Categoria:

0 comentarios :

Publicar un comentario en la entrada