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

Сборка и установка Intel® Integrated Performance Primitives. Использование библиотеки в среде Microsoft® Visual Studio

4. Разработка приложения для медианной фильтрации с использованием библиотеки Intel® Integrated Performance Primitives

4.1. Постановка задачи

Фильтрация изображения – одна из наиболее типичных операций обработки изображений. Медианный фильтр – простейший фильтр, который позволяет удалить шумы, либо выполнить размытие изображения. Медианный фильтр строится подобно линейному фильтру. Выбирается некоторый шаблон, который накладывается на каждый пиксель изображения, в соответствии с шаблоном определяется новое значение интенсивности. Набор интенсивностей пикселей, которые накрыты шаблоном, сортируются, и выбирается интенсивность, находящаяся в середине отсортированного множества. По сути, определяется медиана в отсортированном наборе данных.

Задача первой части лабораторной работы состоит в том, чтобы разработать приложение, которое отвечает следующим требованиям:

  1. Поддержка медианной фильтрации с использованием библиотеки OpenCV.
  2. Поддержка медианной фильтрации средствами библиотеки Intel® IPP.
  3. Проверка корректности результата медианной фильтрации, полученного с помощью реализации на базе Intel® IPP, посредством сравнения с результатом работы соответствующей функции библиотеки OpenCV.

Условимся, что на входе программы имеется цветное изображение в формате RGB и размер шаблона медианного фильтра.

4.2. Общая структура приложения и основной функции

Приложение состоит из основной функции и модуля median_filtering, содержащего пару функций-оберток, которые реализуют медианную фильтрацию средствами библиотек Intel® IPP и OpenCV соответственно.

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

  1. Загрузка исходного изображения с использованием функции imread библиотеки OpenCV.
  2. Вызов функции медианной фильтрации median_opencv, реализованной в модуле median_filtering, которая по существу является оберткой соответствующей операции OpenCV.
  3. Вызов функции median_ipp, также реализованной в модуле median_filtering. Функция выполняет медианную фильтрацию средствами библиотеки Intel® IPP.
  4. Попиксельное сравнение результатов медианной фильтрации с помощью функции compare, которая объявлена и реализована в модуле median_filtering. Функция возвращает количество пикселей с различающимися цветами (проверка выполняется по трем каналам).
  5. Отображение отфильтрованных изображений.
  6. Освобождение ресурсов, использованных для работы с изображениями.
#include <opencv2/opencv.hpp> 
#include "median_filtering.h" 
 
using namespace cv; 
 
char helper[] = 
"01_IPP_MedianFiltering.exe <image> [<kernel>]\n\ 
\t<image> - image name\n\ 
\t<kernel> - kernel size\n\ 
"; 
 
int main(int argc, char **argv) 
{ 
  Mat srcImgOCV, srcImgIPP, dstImgOCV, dstImgIPP; 
  int kDiffPoints, kSize = 5; 
  if (argc < 2) 
  { 
    printf("%s", helper); 
    return 1; 
  } 
  if (argc > 2) 
  { 
    kSize = atoi(argv[2]); 
  } 
  // 1. загрузить изображение 
  srcImgOCV = imread(argv[1]); 
  if (srcImgOCV.data == 0) 
  { 
    printf("ERROR!!! imread(...)"); 
    return 1; 
  } 
  srcImgOCV.copyTo(srcImgIPP); 
  // 2. отфильтровать с помощью OpenCV 
  median_opencv(srcImgOCV, dstImgOCV, kSize); 
  // 3. отфильтровать с помощью IPP 
  median_ipp(srcImgIPP, dstImgIPP, kSize); 
  // 4. сравнить результаты фильтрации 
  kDiffPoints = compare(dstImgOCV, dstImgIPP); 
  if (kDiffPoints == 0) 
  { 
    printf("OpenCV and IPP give the same result.\n"); 
  } 
  else 
  { 
    printf("Number of different points %d\n", 
      kDiffPoints); 
  } 
  // 5. отобразить то, что получилось 
  namedWindow("srcImg"); 
  imshow("srcImg", srcImgOCV); 
  namedWindow("dstImgOCV"); 
  imshow("dstImgOCV", dstImgOCV); 
  namedWindow("dstImgIPP"); 
  imshow("dstImgIPP", dstImgIPP); 
  waitKey(); 
  // 6. освободить память 
  srcImgOCV.release(); 
  srcImgIPP.release(); 
  dstImgOCV.release(); 
  dstImgIPP.release(); 
  return 0; 
}
    

4.3. Реализация с использованием функций библиотеки OpenCV

Перейдем к рассмотрению функции median_opencv. По существу функция представляет собой обертку для операции medianBlur библиотеки OpenCV. В качестве входных параметров функция принимает исходное и результирующее изображения srcImg и dstImg, а также размер шаблона медианного фильтра.

int median_opencv(const Mat &srcImg, Mat &dstImg, 
    const int kSize) 
{ 
  medianBlur(srcImg, dstImg, kSize); 
  return 0; 
}   
    
Александра Максимова
Александра Максимова

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

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