Pirámides de Imágenes con OpenCV

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.

Comentarios

  1. Hola,

    Lo primero felicitarte por tu blog que es muy completo e instructivo.

    Ahora viene mi pequeña duda: estoy trabajando con pirámides laplacianas, he realizado la pirámide laplaciana de 3 fotografías con distinta exposición. Recorro las imagenes cogiendo el maximo pixel de cada nivel de las pirámides laplacianas. Finalmente tengo una piramide maximos pixeles y la reconstruyo con el fin de lograr un HDR. Ahora bien, una vez que la reconstruyo aunque la imagen este en BGR no se ve a color, y mi pregunta es si hay alguna forma de ponderar cada pixel para asignarle un color autentico.

    Gracias, no se si me he expresado correctamente.

    ResponderEliminar

Publicar un comentario

Temas relacionados

Entradas populares de este blog

tkinter Grid

Conectar SQL Server con Java

Histogramas OpenCV Python

Controles y Contenedores JavaFX 8 - I