Erosión y Dilatación | Transformaciones morfológicas en OpenCV en C++

Las transformaciones morfológicas son operaciones simples basadas en la forma de una imagen que generalmente se realizan en una imagen binaria. Toma nuestra imagen de entrada y un elemento estructurante (núcleo) que decide la naturaleza de la operación.

En este artículo, discutiremos los dos filtros morfológicos básicos: erosión y dilatación. La erosión erosiona el límite y reduce el tamaño del objeto en primer plano, mientras que la dilatación dilata el límite y, por lo tanto, aumenta el tamaño del objeto en primer plano. Antes, entrando en detalle sobre ellos, primero entendamos qué es un elemento estructurante:

Elemento estructurante: Un elemento estructurante es una forma que se utiliza para interactuar con una imagen dada. Nos ayuda a sacar conclusiones en función de cómo falta o encaja en la imagen. Se utiliza en operaciones morfológicas como erosión, dilatación, apertura, cierre, degradado, transformación de sombrero negro/sombrero de copa . Open CV proporciona 3 formas para kernel rectangular, en cruz y elíptica.

Sintaxis:

getStructuringElement (forma, tamaño k, ancla)

Parámetros: a continuación se muestran los parámetros necesarios para la sintaxis anterior:

  • forma: La forma del elemento estructurante puede ser cualquiera de MORPH_RECT , MORPH_ELLIPSE , MORPH_CROSS .
  • ksize: El tamaño del elemento estructurante
  • ancla: Posición del ancla en el interior del elemento estructurante. El valor predeterminado es [-1, -1} que significa posición como el centro del elemento de estructuración.

Valor devuelto: elemento estructurante de tamaño y forma especificados (objeto Mat).

Erosión

La erosión es la operación morfológica utilizada para disminuir el tamaño del objeto en primer plano. Es como la erosión del suelo y erosiona el límite del objeto de primer plano.

En esta operación, el núcleo se desliza por la imagen y considera un píxel de valor 1 sólo cuando todos los píxeles del elemento estructurante tienen valor 1 . De lo contrario, se erosiona. De esta forma, los píxeles cercanos al límite se descartarán y se obtendrá un objeto de primer plano reducido dentro de la imagen.

Sintaxis:

erosionar (src, dst, kernel, ancla, iteraciones, borderType, borderValue)

Parámetros:

  • src: imagen de entrada
  • dst: imagen de salida
  • Núcleo: El elemento estructurante utilizado para la erosión.
  • ancla: Posición del ancla en el interior del elemento estructurante. El valor predeterminado es [-1, -1} que significa posición como el centro del elemento de estructuración.
  • iteraciones: Número de veces que se aplica la erosión.
  • borderType: Tipo de borde ( BORDER_CONSTANT , BORDER_REPLICATE , etc.)
  • borderValue: valor del borde

Valor de retorno: imagen de salida (objeto Mat)

Dilatación

La dilatación es lo opuesto a la erosión, en lugar de encogerse, expande el objeto en primer plano. En esta operación, el elemento estructurante (núcleo) se desliza a través de la imagen. Pero, aquí un valor de píxel 1 si al menos un píxel tiene valor 1. Por lo tanto, el objeto se expande alrededor del límite y da como resultado una imagen expandida.

Sintaxis:

dilatar (src, dst, kernel, ancla, iteraciones, borderType, borderValue)

Parámetros:

  • src: imagen de entrada
  • dst: imagen de salida
  • Núcleo: Elemento estructurante utilizado para la dilatación.
  • ancla: Posición del ancla en el interior del elemento estructurante. El valor predeterminado es [-1, -1} que significa posición como el centro del elemento de estructuración.
  • iteraciones: número de veces que se aplica la dilatación.
  • borderType: Tipo de borde ( BORDER_CONSTANT , BORDER_REPLICATE , etc.)
  • borderValue: valor del borde

Valor de retorno: imagen de salida (objeto Mat)

A continuación se muestra el programa C++ para implementar los conceptos anteriores:

C++

// C++ program to implement the erosion
// and dilation
#include <iostream>
#include <opencv2/core/core.hpp>
  
// Library to include for drawing shapes
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace cv;
using namespace std;
  
// Driver Code
int main(int argc, char** argv)
{
    // Reading the Image
    Mat image = imread("C:/Users/harsh/Downloads/geeks.png",
                       IMREAD_GRAYSCALE);
  
    // Check if the image is created
    // successfully or not
    if (!image.data) {
        std::cout << "Could not open or find"
                  << " the image\n";
        return 0;
    }
  
    // Create a structuring element (SE)
    int morph_size = 2;
    Mat element = getStructuringElement(
        MORPH_RECT, Size(2 * morph_size + 1,
                         2 * morph_size + 1),
        Point(morph_size, morph_size));
    Mat erod, dill;
  
    // For Erosion
    erode(image, erod, element,
          Point(-1, -1), 1);
  
    // For Dilation
    dilate(image, dill, element,
           Point(-1, -1), 1);
  
    // Display the image
    imshow("source", image);
    imshow("erosion", erod);
    imshow("dilate", dill);
    waitKey();
  
    return 0;
}

Imagen de salida:

Publicación traducida automáticamente

Artículo escrito por Captain_JackSparrow y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *