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

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

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