Опубликован: 02.09.2013 | Доступ: свободный | Студентов: 431 / 54 | Длительность: 19:27:00

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

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

Первые три задачи из выбранных нами средствами OpenCV решаются очень просто. Рассмотрим их подробнее.

2.5.1. Функция медианной фильтрации

Медианная фильтрация в библиотеке OpenCV реализуется с помощью функции medianBlur(). Ее подробное описание может быть найдено в лабораторной работе "Базовые операции обработки изображений" настоящего курса. Здесь же лишь отметим, что в экспериментах мы будем использовать размер ядра, равный 3, но предусмотрим возможность его изменения.

double median_opencv(const Mat &srcImg, Mat &dstImg,  
  const int kSize = 3); 
 
double median_opencv(const Mat &srcImg, Mat &dstImg, 
  const int kSize) 
{ 
  clock_t start, finish; 
   start = clock(); 
  medianBlur(srcImg, dstImg, kSize); 
  finish = clock(); 
 
  return double(finish - start) / CLOCKS_PER_SEC; 
} 
2.5.2. Функция вычисления эрозии

Эрозия изображения выполняется в OpenCV с помощью функции erode(). Используем простейший вариант ее вызова с тремя параметрами, при котором применяется квадратный шаблон 3x3.

double erode_opencv(const Mat &srcImg, Mat &dstImg) 
{ 
  clock_t start, finish; 
 
  start = clock(); 
  Mat element = Mat(); 
  erode(srcImg, dstImg, element); 
  finish = clock(); 
 
  return double(finish - start) / CLOCKS_PER_SEC; 
} 
2.5.3. Функция вычисления дилатации

Полностью аналогично обстоит дело с функцией дилатации.

double dilate_opencv(const Mat &srcImg, Mat &dstImg) 
{ 
  clock_t start, finish; 
 
  start = clock(); 
  Mat element = Mat(); 
  dilate(srcImg, dstImg, element); 
  finish = clock(); 
 
  return double(finish - start) / CLOCKS_PER_SEC; 
} 

За описанием функций erode() и dilate() также отсылаем к лабораторной работе "Базовые операции обработки изображений".

2.5.4. Функция вычисления гистограммы

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

double hist_opencv(const Mat &srcImg, Mat &dstImg) { 
  Mat bgrChannels[3], bHist, gHist, rHist; 
  // количество бинов гистограммы 
  int kBins = 256; 
  // интервал изменения значений бинов 
  float range[] = {0.0f, 256.0f}; 
  const float* histRange = { range }; 
  // равномерное распределение интервала по бинам 
  bool uniform = true;  
  // запрет очищения перед вычислением гистограммы 
  bool accumulate = false;  
  clock_t start, finish; 
 
  start = clock(); 
  split(srcImg, bgrChannels); 
  // вычисление гистограммы для каждого канала 
  calcHist(&bgrChannels[0], 1, 0, Mat(), bHist, 1,  
    &kBins, &histRange, uniform, accumulate); 
  calcHist(&bgrChannels[1], 1, 0, Mat(), gHist, 1,  
    &kBins, &histRange, uniform, accumulate); 
  calcHist(&bgrChannels[2], 1, 0, Mat(), rHist, 1,  
    &kBins, &histRange, uniform, accumulate); 
  finish = clock(); 
 
  return double(finish - start) / CLOCKS_PER_SEC; 
} 
Андрей Терёхин
Андрей Терёхин

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

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

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

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