Опубликован: 02.09.2013 | Доступ: свободный | Студентов: 429 / 54 | Длительность: 19:27:00
Самостоятельная работа 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; 
} 

Далее на рисунке (рис.9.6) показаны результаты выполнения данной программы.

Результат применения продвинутых морфологических  операций (верхний ряд слева направо: исходное  изображение, размыкание, замыкание; нижний ряд слева  направо: морфологический градиент, «top hat», «black hat»)

Рис. 9.6. Результат применения продвинутых морфологических операций (верхний ряд слева направо: исходное изображение, размыкание, замыкание; нижний ряд слева направо: морфологический градиент, «top hat», «black hat»)
Андрей Терёхин
Андрей Терёхин

Нахожу в тесте вопросы, которые в принципе не освещаются в лекции. Нужно гуглить на других ресурсах, чтобы решить тест, или же он всё же должен испытывать знания, полученные в ходе лекции?

Демянчик Иван
Демянчик Иван

В главе 14 мы видим понятие фильтра, но не могу разобраться, чем он является в теории и практике.

" Искомый объект можно описать с помощью фильтра F= \lbrace f_{x',y'},x' \in \lbrace0, ...,w_f \rbrace , y' \in \lbrace 0,...,h_f \rbrace \rbrace "