Нахожу в тесте вопросы, которые в принципе не освещаются в лекции. Нужно гуглить на других ресурсах, чтобы решить тест, или же он всё же должен испытывать знания, полученные в ходе лекции? |
Самостоятельная работа 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; }