Опубликован: 02.09.2013 | Доступ: свободный | Студентов: 423 / 54 | Длительность: 19:27:00
Самостоятельная работа 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=\frac 1 {kSize.width \cdot kSize.height}\begin{bmatrix}
1 & \cdots & 1 \\
\vdots & \ddots & \vdots \\
1 & \cdots & 1 
\end{bmatrix}

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

K=\alpha \begin{bmatrix}
1 & \cdots & 1 \\
\vdots & \ddots & \vdots \\
1 & \cdots & 1 
\end{bmatrix},где\,\,\alpha=\begin{cases}
{\frac 1 {kSize.width \cdot kSize.height},normalize=true}\\
\text{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 и результат выполнения приведенной программы (рис.9.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  пикселей

Рис. 9.2. Результат размытия с квадратным ядром со стороной в 5 пикселей
Андрей Терёхин
Андрей Терёхин

Нахожу в тесте вопросы, которые в принципе не освещаются в лекции. Нужно гуглить на других ресурсах, чтобы решить тест, или же он всё же должен испытывать знания, полученные в ходе лекции?

Демянчик Иван
Демянчик Иван

В главе 14 мы видим понятие фильтра, но не могу разобраться, чем он является в теории и практике.

" Искомый объект можно описать с помощью фильтра F= \lbrace f_{x',y'},x' \in \lbrace0, ...,w_f \rbrace , y' \in \lbrace 0,...,h_f \rbrace \rbrace "