Open In App

Opening | Morphological Transformations in OpenCV in C++

Last Updated : 10 Feb, 2021
Improve
Improve
Like Article
Like
Save
Share
Report

In this article, a Morphological operation called Opening is discussed.

Opening operation is similar to erosion in the sense that it also removes foreground pixels from the edges of the image. Opening operation is erosion operation followed by dilation. It is usually used for removing internal noise present inside an image. This operator safeguards the foreground region that has similarity with the structuring component or the one that fits inside the structuring element while removing everything else.

Syntax:

morphologyEx (src, dst, op, kernel, anchor, iterations, borderType, borderValue)

Parameters:

  • src: It is the input image.
  • dst: It is the output image.
  • op: Type of morphological operation.
  • kernel: Structuring element used for Closing.
  • anchor: Anchor position inside the structuring element. The default value is [-1, -1} signifying position as the center of the structuring element.
  • iterations: Number of times Closing is applied.
  • borderType: Type of border ( BORDER_CONSTANT, BORDER_REPLICATE, etc.)
  • borderValue: Border value
  • Return: Output Image (Mat Object)

The opening operator is given by the expression:

The expression represents that AoB is a subset (sub-image of A). The opening operator removes internal noise and thin protrusions present inside an image.

Below is the C++ program to demonstrate the Opening Morphological Operation:

C++




// C++ program to demonstrate the
// opening morphological transformation
#include <iostream>
#include <opencv2/core/core.hpp>
  
// Library include for drawing shapes
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace cv;
using namespace std;
  
// Function to demonstrate the
// opening morphological operator
int openingMorphological()
{
    // 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) {
        cout << "Could not open or"
             << " find the image\n";
  
        return 0;
    }
  
    // Create a structuring element
    int morph_size = 2;
    Mat element = getStructuringElement(
        MORPH_RECT,
        Size(2 * morph_size + 1,
             2 * morph_size + 1),
        Point(morph_size,
              morph_size));
    Mat output;
  
    // Opening
    morphologyEx(image, output,
                 MORPH_OPEN, element,
                 Point(-1, -1), 2);
  
    // Display the image
    imshow("source", image);
    imshow("Opening", output);
    waitKey();
  
    return 0;
}
  
// Driver Code
int main()
{
  
    openingMorphological();
  
    return 0;
}


Output:



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads