Опубликован: 20.08.2013 | Уровень: для всех | Доступ: платный | ВУЗ: Новосибирский Государственный Университет
Самостоятельная работа 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) показаны результаты выполнения данной программы.


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

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

При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка?
 

Алена Борисова
Алена Борисова

В лекции по обработке полутоновых изображений (http://www.intuit.ru/studies/courses/10621/1105/lecture/17979?page=2) увидела следующий фильтр:


    \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 2 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array} - \frac{1}{9} \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 1 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array}

В описании говорится, что он "делает изображение более чётким, потому что, как видно из конструкции фильтра, в однородных частях изображение не изменяется, а в местах изменения яркости это изменение усиливается".

Что вижу я в конструкции фильтра (скорее всего ошибочно): F(x, y) = 2 * I(x, y) - 1/9 I(x, y) = 17/9 * I(x, y), где F(x, y) - яркость отфильтрованного пикселя, а I(x, y) - яркость исходного пикселя с координатами (x, y). Что означает обычное повышение яркости изображения, при этом без учета соседних пикселей (так как их множители равны 0).

Объясните, пожалуйста, как данный фильтр может повышать четкость изображения?

Сергей Кротов
Сергей Кротов
Россия
Дмитрий Донсков
Дмитрий Донсков
Россия, Москва, Московский Авиационный Институт