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