При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка? |
Базовые операции обработки изображений
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; }
Далее на рисунке (рис. 7.6) показаны результаты выполнения данной программы.