Эрозия и дилатация | Морфологические преобразования в OpenCV на C++

Опубликовано: 15 Сентября, 2022

Морфологические преобразования — это простые операции, основанные на форме изображения, обычно выполняемые над бинарным изображением. Он принимает наше входное изображение и структурирующий элемент (ядро), который определяет характер операции.

В этой статье мы обсудим два основных морфологических фильтра: эрозию и расширение. Эрозия размывает границу и уменьшает размер объекта переднего плана, тогда как расширение расширяет границу и, следовательно, увеличивает размер объекта переднего плана. Прежде чем подробно остановиться на них, давайте сначала поймем, что такое структурирующий элемент:

Структурирующий элемент: структурирующий элемент — это форма, используемая для взаимодействия с данным изображением. Это помогает нам делать выводы на основе того, насколько он отсутствует или соответствует изображению. Он используется в морфологических операциях, таких как эрозия, расширение, открытие, закрытие, градиент, преобразование черной шляпы / цилиндра. Open CV предоставляет 3 формы ядра: прямоугольную, крестообразную и эллиптическую.

Синтаксис:

getStructuringElement (shape, ksize, anchor)

Параметры: Ниже приведены параметры, необходимые для приведенного выше синтаксиса:

  • shape: Форма элемента структурирования может быть любой из MORPH_RECT , MORPH_ELLIPSE , MORPH_CROSS .
  • ksize: Размер элемента структурирования
  • якорь: положение якоря внутри структурирующего элемента. Значение по умолчанию — [-1, -1}, обозначающее позицию в качестве центра структурного элемента.

Возвращаемое значение: структурирующий элемент заданного размера и формы (объект Mat).

эрозия

Эрозия — это морфологическая операция, используемая для уменьшения размера объекта переднего плана. Это похоже на эрозию почвы и размывает границы объекта переднего плана.

В этой операции ядро скользит по изображению и считает значение пикселя равным 1 только тогда, когда все пиксели в структурирующем элементе имеют значение 1 . В противном случае он изнашивается. Таким образом, пиксели рядом с границей будут отброшены, и получится уменьшенный объект переднего плана внутри изображения.

Синтаксис:

erode (src, dst, kernel, anchor, iterations, borderType, borderValue)

Параметры:

  • источник: входное изображение
  • dst: выходное изображение
  • ядро: структурирующий элемент, используемый для эрозии.
  • якорь: положение якоря внутри структурирующего элемента. Значение по умолчанию — [-1, -1}, обозначающее положение как центр структурного элемента.
  • iterations: количество применений эрозии.
  • borderType: тип границы ( BORDER_CONSTANT , BORDER_REPLICATE и т. д.)
  • borderValue: Значение границы

Возвращаемое значение: выходное изображение (матовый объект)

Расширение

Расширение противоположно эрозии, вместо сжатия оно расширяет объект переднего плана. В этой операции структурирующий элемент (ядро) перемещается по изображению. Но здесь значение пикселя равно 1, если хотя бы один пиксель имеет значение 1. Следовательно, объект расширяется вокруг границы и приводит к расширенному изображению.

Синтаксис:

dilate (src, dst, kernel, anchor, iterations, borderType, borderValue)

Параметры:

  • источник: входное изображение
  • dst: выходное изображение
  • ядро: структурный элемент, используемый для расширения.
  • якорь: положение якоря внутри структурирующего элемента. Значение по умолчанию — [-1, -1}, обозначающее позицию в качестве центра структурного элемента.
  • iterations: количество применений расширения.
  • borderType: тип границы ( BORDER_CONSTANT , BORDER_REPLICATE и т. д.)
  • borderValue: Значение границы

Возвращаемое значение: выходное изображение (матовый объект)

Ниже приведена программа C++ для реализации вышеуказанных концепций:

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 ";
        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;
}

Выходное изображение:

C++