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