Новосибирский Государственный Университет
Опубликован: 20.08.2013 | Доступ: свободный | Студентов: 861 / 36 | Длительность: 14:11: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; 
} 
      

Далее на рисунке (рис. 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).

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