|
Нахожу в тесте вопросы, которые в принципе не освещаются в лекции. Нужно гуглить на других ресурсах, чтобы решить тест, или же он всё же должен испытывать знания, полученные в ходе лекции? |
Базовые операции обработки изображений
2.3.2. Дополнительные морфологические операции
При обработке бинарных изображений, как правило, базовых операций эрозии и дилатации достаточно. В процессе работы с цветными изображениями или изображениями в оттенках серого могут быть полезными более сложные морфологические операции. Библиотека OpenCV поддерживает ряд дополнительных морфологических операций, которые реализуется в функции morphologyEx [7].
void morphologyEx(const Mat& src, Mat& dst, int op,
const Mat& element,
Point anchor=Point(-1, -1),
int iterations=1, int borderType=BORDER_CONSTANT,
const Scalar& borderValue =
morphologyDefaultBorderValue())
Рассмотрим параметры функции morphologyEx.
- src, dst, element, anchor, borderType, borderValue имеют такой же смысл, что и в функциях вычисления эрозии и дилатации.
- op – тип морфологической операции.
Данная функция обеспечивает выполнение следующих морфологических операций:
- MORPH_OPEN – размыкание. Результатом размыкания является дилатации, которая применяется к эрозии исходного изображения. Условно можно записать в виде выражения dst = open(src, element) = dilate(erode(src, element)). Операция эрозия позволяет удалить все мелкие объекты и шум на изображении, но ее применение приводит к значительному уменьшению размеров оставшихся объектов. Чтобы увеличить размер объектов, выделенных с помощью эрозии, достаточно применить дилатацию.
- MORPH_CLOSE – замыкание. Замыкание – операция обратная размыканию, dst = close(src, element) = erode(dilate(src, element)). Операция замыкания позволяет удалить небольшие внутренние "дырки" и убрать зернистость по краям области. "Дырки" удаляются за счет начального применения дилатации, но дилатация приводит к росту границы. Последующее применение эрозии обеспечивает обратное уменьшение границы.
- MORPH_GRADIENT – морфологический градиент. Результатом применения данной операции является разница дилатации и эрозии исходного изображения с одинаковым ядром dst = morph_grad(src, element) = dilate(src, element) - erode(src, element). Морфологические градиент обеспечивает поиск контуров объектов, размер которых превышает размер ядра.
- MORPH_TOPHAT – "верх шляпы" ("top hat"), dst = tophat(src, element) = src – open(src, element). Применение данной операции позволяет выделить наиболее яркие области на изображении.
- MORPH_BLACKHAT – "черная шляпа" ("black hat"), dst = tophat(src, element) = close(src, element)- src. Использование указанного морфологического преобразования обеспечивает выделение наиболее темных областей.
Ниже представлен пример использования функции morphologyEx, показывающий применение всех перечисленных продвинутых операций. Приложение обеспечивает загрузку изображения и последовательное применение описанных морфологических преобразований.
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
const char helper[] =
"Sample_morphologyEx.exe <img_file>\n\
\t<img_file> - image file name\n";
int main(int argc, char* argv[])
{
const char *initialWinName = "Initial Image",
*morphologyOpenWinName = "MORPH_OPEN",
*morphologyCloseWinName = "MORPH_CLOSE",
*morphologyGradientWinName = "MORPH_GRADIENT",
*morphologyTopHatWinName = "MORPH_TOPHAT",
*morphologyBlackHatWinName = "MORPH_BLACKHAT";
Mat img, morphologyOpenImg, morphologyCloseImg,
morphologyGradientImg, morphologyTopHatImg,
morphologyBlackHatImg, element;
if (argc < 2)
{
printf("%s", helper);
return 1;
}
// загрузка изображения
img = imread(argv[1], 1);
// применение морфологических операций
element = Mat();
morphologyEx(img, morphologyOpenImg,
MORPH_OPEN, element);
morphologyEx(img, morphologyCloseImg,
MORPH_CLOSE, element);
morphologyEx(img, morphologyGradientImg,
MORPH_GRADIENT, element);
morphologyEx(img, morphologyTopHatImg,
MORPH_TOPHAT, element);
morphologyEx(img, morphologyBlackHatImg, MORPH_BLACKHAT, element);
// отображение исходного изображения
//и результата выполнения операций
namedWindow(initialWinName, CV_WINDOW_AUTOSIZE);
namedWindow(morphologyOpenWinName, CV_WINDOW_AUTOSIZE);
namedWindow(morphologyCloseWinName,
CV_WINDOW_AUTOSIZE);
namedWindow(morphologyGradientWinName,
CV_WINDOW_AUTOSIZE);
namedWindow(morphologyTopHatWinName,
CV_WINDOW_AUTOSIZE);
namedWindow(morphologyBlackHatWinName,
CV_WINDOW_AUTOSIZE);
imshow(initialWinName, img);
imshow(morphologyOpenWinName, morphologyOpenImg);
imshow(morphologyCloseWinName, morphologyCloseImg);
imshow(morphologyGradientWinName,
morphologyGradientImg);
imshow(morphologyTopHatWinName, morphologyTopHatImg);
imshow(morphologyBlackHatWinName,
morphologyBlackHatImg);
waitKey();
// закрытие окон
destroyAllWindows();
// осовобождение памяти
img.release();
morphologyOpenImg.release();
morphologyCloseImg.release();
morphologyGradientImg.release();
morphologyTopHatImg.release();
morphologyBlackHatImg.release();
return 0;
}
Далее на рисунке (рис.9.6) показаны результаты выполнения данной программы.

"