Новосибирский Государственный Университет
Опубликован: 20.08.2013 | Доступ: свободный | Студентов: 858 / 36 | Длительность: 14:11:00
Самостоятельная работа 2:

Базовые операции обработки изображений

2.3. Морфологические преобразования

2.3.1. Дилатация и эрозия

Дилатация (морфологическое расширение) – свертка изображения или выделенной области изображения с некоторым ядром. Ядро может иметь произвольную форму и размер [1, 2]. При этом в ядре выделяется единственная ведущая позиция (anchor), которая совмещается с текущим пикселем при вычислении свертки. Во многих случаях в качестве ядра выбирается квадрат или круг с ведущей позицией в центре. Ядро можно рассматривать как шаблон или маску. Применение дилатации сводится к проходу шаблоном по всему изображению и применению оператора поиска локального максимума к интенсивностям пикселей изображения, которые накрываются шаблоном. Такая операция вызывает рост светлых областей на изображении (рис. 7.3, c). На рисунке серым цветом отмечены пиксели, которые в результате применения дилатации будут белыми.

Эрозия (морфологическое сужение) – обратная операция. Действие эрозии подобно дилатации, разница лишь в том, что используется оператор поиска локального минимума (рис. 7.3, d), серым цветом залиты пиксели, которые станут черными в результате эрозии.

Применение морфологических операций

Рис. 7.3. Применение морфологических операций

Рассмотрим прототипы соответствующих функций эрозии и дилатации, реализованных в OpenCV [7].

void dilate(const Mat& src, Mat& dst, const Mat& element, 
  Point anchor=Point(-1, -1), int iterations=1, 
  int borderType=BORDER_CONSTANT, 
  const Scalar& borderValue = 
    morphologyDefaultBorderValue()) 
 
void erode(const Mat& src, Mat& dst, const Mat& element, 
  Point anchor=Point(-1, -1), int iterations=1, 
  int borderType=BORDER_CONSTANT, 
  const Scalar& borderValue = 
  morphologyDefaultBorderValue())   
      

Параметры:

  • src – исходное изображение.
  • dst – результирующее изображение, имеет такой же размер, что и входное изображение. Отметим, что результат операции может записываться в исходное изображение.
  • element – шаблон, который используется в процессе дилатации. Если element=Mat(), то применяется квадратный шаблон размером 3x3.
  • anchor – позиция ведущего пикселя в структурном элементе. Значение по умолчанию (-1,-1) означает, что в качестве ведущего элемента выбирается центр шаблона.
  • interations – количество раз, которое применяется дилатация/эрозия.
  • borderType – параметр, определяющий метод дополнения границы, чтобы можно было применять дилатацию/эрозию к граничным пикселям исходного изображения. Принимает любое значение вида BORDER_* за исключением BORDER_TRANSPARENT и BORDER_ISOLATED.
  • borderValue – размер границы в случае, если она имеет постоянный размер. Значение по умолчанию равно morphologyDefaultBorderValue, преобразуется в –inf для дилатации и +inf для эрозии. При использовании значения по умолчанию операция применяется только к внутренним пикселям изображениям.

Далее приведен пример использования указанных функций. Сначала в программе выполняется чтение исходного изображения, название которого передается через аргументы командной строки. Затем применяются рассматриваемые операции. По окончании выполнения программы выполняется отображение результата применения эрозии и дилатации.

#include <stdio.h> 
#include <opencv2/opencv.hpp> 

using namespace cv; 
 
const char helper[] = 
  "Sample_erode_dilate.exe <img_file>\n\ 
  \t<img_file> - image file name\n"; 
 
int main(int argc, char* argv[]) 
{ 
  const char *initialWinName = "Initial Image", 
    *erodeWinName = "erode", 
    *dilateWinName = "dilate"; 
  Mat img, erodeImg, dilateImg, element; 
  if (argc < 2) 
  { 
    printf("%s", helper); 
    return 1; 
  } 
  // загрузка черно-белого изображения 
  img = imread(argv[1], 1); 
  // вычисление эрозии и дилатации 
  element = Mat(); 
  erode(img, erodeImg, element); 
  dilate(img, dilateImg, element); 

  // отображение исходного изображения и результата 
  // применения морфологических операций "эрозия" 
  // и "дилатация" 
  namedWindow(initialWinName, CV_WINDOW_AUTOSIZE); 
  namedWindow(erodeWinName, CV_WINDOW_AUTOSIZE); 
  namedWindow(dilateWinName, CV_WINDOW_AUTOSIZE); 
  imshow(initialWinName, img); 
  imshow(erodeWinName, erodeImg); 
  imshow(dilateWinName, dilateImg); 
  waitKey(); 
 
  // освобождение ресурсов 
  img.release(); 
  erodeImg.release(); 
  dilateImg.release(); 
  return 0; 
} 
      

Результат выполнения данной программы показан на примере некоторого черно-белого изображения (рис. 7.4). Как видно из рисунков, применение эрозии привело к сужению белых областей, дилатации – расширению (рис. 7.5).

Исходное черно-белое изображение

Рис. 7.4. Исходное черно-белое изображение
Результат применения эрозии (слева) и дилатации (справа)

Рис. 7.5. Результат применения эрозии (слева) и дилатации (справа)
Александра Максимова
Александра Максимова

При прохождении теста 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).

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