Эрозия и дилатация | Морфологические преобразования в OpenCV на C++
Морфологические преобразования — это простые операции, основанные на форме изображения, обычно выполняемые над бинарным изображением. Он принимает наше входное изображение и структурирующий элемент (ядро), который определяет характер операции.
В этой статье мы обсудим два основных морфологических фильтра: эрозию и расширение. Эрозия размывает границу и уменьшает размер объекта переднего плана, тогда как расширение расширяет границу и, следовательно, увеличивает размер объекта переднего плана. Прежде чем подробно остановиться на них, давайте сначала поймем, что такое структурирующий элемент:
Структурирующий элемент: структурирующий элемент — это форма, используемая для взаимодействия с данным изображением. Это помогает нам делать выводы на основе того, насколько он отсутствует или соответствует изображению. Он используется в морфологических операциях, таких как эрозия, расширение, открытие, закрытие, градиент, преобразование черной шляпы / цилиндра. 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; } |
Выходное изображение: