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

Сравнение производительности некоторых алгоритмов в библиотеках OpenCV и IPP

< Самостоятельная работа 5 || Самостоятельная работа 6: 1234567

2.4. Функция main

Перейдем теперь к разработке функции main(). Прежде всего необходимо подключить заголовочные файлы. Кроме функций из библиотек OpenCV и IPP нам потребуется также вывод сообщений на консоль с помощью printf() и замеры времени с использованием функции clock().

#include <stdio.h> 
#include <time.h> 
#include <opencv2/opencv.hpp> 
#include <ippi.h> 
#include <ippcc.h>   
    

Для более удобной работы с OpenCV подключим пространство имен cv.

using namespace cv;   
    

Имя файла с изображением будем передавать через командную строку.

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

Далее представлен начальный вариант функции main(), содержащий, кроме указанного выше, также вызовы функций, в которых необходимо будет разместить код, реализующий соответствующие алгоритмы.

char helper[] =   
  "01_OpenCVvsIPP.exe <img_name> <mode> <num_of_exp>\n\ 
  \t<img_name> - image filename\n\ 
  \t<mode>:\n\ 
  \t\t1 - median filtering\n\ 
  \t\t2 - erode\n\ 
  \t\t3 - dilate\n\ 
  \t\t4 - calc histogram\n\ 
  \t<num_of_exp> - number of experiments\n"; 
 
int main(int argc, char *argv[]) 
{ 
  Mat srcImgOCV, srcImgIPP, dstImgOCV, dstImgIPP; 
  int mode, i; 
  double ocv_time, ipp_time; 
 
  if (argc < 4) 
  { 
    printf("%s", helper); 
    return 1; 
  } 
 
  // загрузить изображение 
  srcImgOCV = imread(argv[1]); 
  if (srcImgOCV.data == 0) 
  { 
    printf("ERROR!!! imread(...)"); 
    return 1; 
  } 
  srcImgOCV.copyTo(srcImgIPP); 
 
  mode = atoi(argv[2]); 
  switch (mode) 
  { 
  case 1: 
    // отфильтровать с помощью OpenCV 
    ocv_time = median_opencv(srcImgOCV, dstImgOCV); 
    // отфильтровать с помощью IPP 
    ipp_time = median_ipp(srcImgIPP, dstImgIPP); 
    break; 
  case 2: 
    // выполнить эрозию с помощью OpenCV 
    ocv_time = erode_opencv(srcImgOCV, dstImgOCV); 
    // выполнить эрозию с помощью IPP 
    ipp_time = erode_ipp(srcImgIPP, dstImgIPP); 
    break; 
  case 3: 
    // выполнить дилатацию с помощью OpenCV 
    ocv_time = dilate_opencv(srcImgOCV, dstImgOCV); 
    // выполнить дилатацию с помощью IPP 
    ipp_time = dilate_ipp(srcImgIPP, dstImgIPP); 
    break; 
  case 4: 
    // вычислить гистограмму с помощью OpenCV 
    ocv_time = hist_opencv(srcImgOCV, dstImgOCV); 
    // вычислить гистограмму с помощью IPP 
    ipp_time = hist_ipp(srcImgIPP, dstImgIPP); 
    break; 
  } 
 
  printf("ocv time is %.3f\nipp time is %.3f", ocv_time, 
    ipp_time); 
 
  // освободить память 
  srcImgOCV.release(); 
  srcImgIPP.release(); 
  dstImgOCV.release(); 
  dstImgIPP.release(); 
 
  return 0; 
} 
    

Предполагается, что каждая из выделенных полужирным шрифтом функций принимает на вход изображение в виде объекта типа Mat из OpenCV, выполняет требуемый алгоритм и возвращает новое изображение также в виде объекта типа Mat. Кроме того считаем, что все эти функции возвращают время выполнения в секундах.

< Самостоятельная работа 5 || Самостоятельная работа 6: 1234567
Александра Максимова
Александра Максимова

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

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