|
При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка? |
Базовые операции обработки изображений
2.3. Морфологические преобразования
2.3.1. Дилатация и эрозия
Дилатация (морфологическое расширение) – свертка изображения или выделенной области изображения с некоторым ядром. Ядро может иметь произвольную форму и размер [1, 2]. При этом в ядре выделяется единственная ведущая позиция (anchor), которая совмещается с текущим пикселем при вычислении свертки. Во многих случаях в качестве ядра выбирается квадрат или круг с ведущей позицией в центре. Ядро можно рассматривать как шаблон или маску. Применение дилатации сводится к проходу шаблоном по всему изображению и применению оператора поиска локального максимума к интенсивностям пикселей изображения, которые накрываются шаблоном. Такая операция вызывает рост светлых областей на изображении (рис. 7.3, c). На рисунке серым цветом отмечены пиксели, которые в результате применения дилатации будут белыми.
Эрозия (морфологическое сужение) – обратная операция. Действие эрозии подобно дилатации, разница лишь в том, что используется оператор поиска локального минимума (рис. 7.3, d), серым цветом залиты пиксели, которые станут черными в результате эрозии.
Рассмотрим прототипы соответствующих функций эрозии и дилатации, реализованных в OpenCV [7].
void dilate(const Mat& src, Mat& dst, const Mat& element,
Point anchor=Point(-1, -1), int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue =
morphologyDefaultBorderValue())
void erode(const Mat& src, Mat& dst, const Mat& element,
Point anchor=Point(-1, -1), int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue =
morphologyDefaultBorderValue())
Параметры:
- src – исходное изображение.
- dst – результирующее изображение, имеет такой же размер, что и входное изображение. Отметим, что результат операции может записываться в исходное изображение.
- element – шаблон, который используется в процессе дилатации. Если element=Mat(), то применяется квадратный шаблон размером 3x3.
- anchor – позиция ведущего пикселя в структурном элементе. Значение по умолчанию (-1,-1) означает, что в качестве ведущего элемента выбирается центр шаблона.
- interations – количество раз, которое применяется дилатация/эрозия.
- borderType – параметр, определяющий метод дополнения границы, чтобы можно было применять дилатацию/эрозию к граничным пикселям исходного изображения. Принимает любое значение вида BORDER_* за исключением BORDER_TRANSPARENT и BORDER_ISOLATED.
- borderValue – размер границы в случае, если она имеет постоянный размер. Значение по умолчанию равно morphologyDefaultBorderValue, преобразуется в –inf для дилатации и +inf для эрозии. При использовании значения по умолчанию операция применяется только к внутренним пикселям изображениям.
Далее приведен пример использования указанных функций. Сначала в программе выполняется чтение исходного изображения, название которого передается через аргументы командной строки. Затем применяются рассматриваемые операции. По окончании выполнения программы выполняется отображение результата применения эрозии и дилатации.
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
const char helper[] =
"Sample_erode_dilate.exe <img_file>\n\
\t<img_file> - image file name\n";
int main(int argc, char* argv[])
{
const char *initialWinName = "Initial Image",
*erodeWinName = "erode",
*dilateWinName = "dilate";
Mat img, erodeImg, dilateImg, element;
if (argc < 2)
{
printf("%s", helper);
return 1;
}
// загрузка черно-белого изображения
img = imread(argv[1], 1);
// вычисление эрозии и дилатации
element = Mat();
erode(img, erodeImg, element);
dilate(img, dilateImg, element);
// отображение исходного изображения и результата
// применения морфологических операций "эрозия"
// и "дилатация"
namedWindow(initialWinName, CV_WINDOW_AUTOSIZE);
namedWindow(erodeWinName, CV_WINDOW_AUTOSIZE);
namedWindow(dilateWinName, CV_WINDOW_AUTOSIZE);
imshow(initialWinName, img);
imshow(erodeWinName, erodeImg);
imshow(dilateWinName, dilateImg);
waitKey();
// освобождение ресурсов
img.release();
erodeImg.release();
dilateImg.release();
return 0;
}
Результат выполнения данной программы показан на примере некоторого черно-белого изображения (рис. 7.4). Как видно из рисунков, применение эрозии привело к сужению белых областей, дилатации – расширению (рис. 7.5).



