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

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

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