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

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

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