Спонсор: Intel
Опубликован: 20.08.2013 | Уровень: для всех | Доступ: платный | ВУЗ: Новосибирский Государственный Университет
Самостоятельная работа 2:

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

2.2. Сглаживание изображений

Сглаживание или размытие изображения – это одна из самых простых и часто используемых операций обработки изображений. Как правило, размытие применяется, чтобы уменьшить шум или артефакты, которые обусловлены выбором камеры. Также сглаживание играет важную роль при необходимости уменьшить разрешение изображения и получить пирамиду изображений разного масштаба (image pyramids) [1].

Разработчики OpenCV реализовали несколько функций размытия изображения. Далее остановимся на некоторых из них, а именно рассмотрим функции blur, boxFilter, GaussianBlur и medianBlur [7]:

void blur(const Mat& src, Mat& dst, Size ksize, 
  Point anchor=Point(-1, -1), 
  int borderType=BORDER_DEFAULT) 
 
void boxFilter(const Mat& src, Mat& dst, int ddepth, 
    Size ksize, Point anchor=Point(-1, -1), 
    bool normalize=true, 
    int borderType=BORDER_DEFAULT) 
 
void GaussianBlur(const Mat& src, Mat& dst, Size ksize, 
    double sigmaX, double sigmaY=0, 
    int borderType=BORDER_DEFAULT) 
 
void medianBlur(const Mat& src, Mat& dst, int ksize)       
    

Приведем назначение общих параметров указанных функций:

  • src – исходное изображение.
  • dst – результирующее изображение, имеет такой же размер и тип, как и исходное изображение.
  • kSize – размер ядра для размытия.
  • anchor – ведущий элемент ядра. По умолчанию параметр принимает значение (-1, -1), ведущий элемент совпадает с центром ядра.
  • borderType – способ дополнения границы.

Функция blur выполняет размытие посредством вычисления свертки исходного изображения с ядром K:

K = \frac{1}{kSize.width \cdot kSize.height} \begin{bmatrix} 1 & \ldots & 1 \\ \vdots & \ddots & \vdots \\ 1 & \ldots & 1 \end{bmatrix}

Функция boxFilter использует ядро более общего вида:

K = \alpha \begin{bmatrix} 1 & \ldots & 1 \\ \vdots & \ddots & \vdots \\ 1 & \ldots & 1 \end{bmatrix},
где\ \alpha=\begin{cases}
\frac{1}{kSize.width \cdot kSize.height},\ normolize=true\\
1,\ в\ противном\ случае\\
\end{cases}

Параметр normalize по существу представляет флаг, который указывает, является ли ядро нормализованным или нет. Вызов функции blur эквивалентен вызову boxFilter(src, dst, src.type(), anchor, true, borderType).

Функция GaussianBlur осуществляет размытия с помощью вычисления свертки изображения с дискретным ядром Гаусса со стандартными отклонениями, равными sigmaX и sigmaY по осям Ox и Oy соответственно. Заметим, что при вызове данной функции накладывается ограничение на параметр kSize. Ширина и высота ядра должны быть положительными и нечетными, либо нулевыми, если размер ядра определяется из стандартных отклонений.

Функция medianBlur обеспечивает размытие посредством применения медианного фильтра. Медианный фильтр строится подобно линейному фильтру. Выбирается некоторый шаблон, который накладывается на все пиксели изображения. Набор интенсивностей пикселей, которые накрыты шаблоном, сортируются, и выбирается интенсивность, находящаяся в середине отсортированного множества. По сути, определяется медиана в отсортированном наборе данных. Исходное изображение src может представляться 1-, 3-, либо 4-канальной матрицей. В случае нескольких каналов медианный фильтр применяется независимо к каждому из них. Размер апертуры определяется параметром kSize. Если размер шаблона составляет 3 или 5, то глубина изображения должна иметь тип CV_8U, CV_16U или CV_32F. Для большей величины kSize поддерживается только CV_8U.

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

#include <stdio.h> 
#include <opencv2/opencv.hpp> 
 
using namespace cv; 
 
const char helper[] = 
  "Sample_blur.exe <img_file>\n\ 
  \t<img_file> - image file name\n"; 
 
int main(int argc, char* argv[]) 
{ 
  const char *initialWinName = "Initial Image", 
      *blurWinName = "blur"; 
  Mat img, blurImg; 
  if (argc < 2) 
  { 
    printf("%s", helper); 
    return 1; 
  } 
  // загрузка изображения 
  img = imread(argv[1], 1); 
  // сглаживание 
  blur(img, blurImg, Size(5, 5)); 
 
  // отображение исходного изображения 
  // и результата размытия 
  namedWindow(initialWinName, CV_WINDOW_AUTOSIZE); 
  namedWindow(blurWinName, CV_WINDOW_AUTOSIZE); 
  imshow(initialWinName, img); 
  imshow(blurWinName, blurImg); 
  waitKey(); 
 
  // закрытие окон 
  destroyAllWindows(); 
  // освобождение ресурсов 
  img.release(); 
  blurImg.release(); 
  return 0; 
}       
    
Результат размытия с квадратным ядром со стороной в 5 пикселей

Рис. 7.2. Результат размытия с квадратным ядром со стороной в 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).

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

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