|
Нахожу в тесте вопросы, которые в принципе не освещаются в лекции. Нужно гуглить на других ресурсах, чтобы решить тест, или же он всё же должен испытывать знания, полученные в ходе лекции? |
Опубликован: 02.09.2013 | Доступ: свободный | Студентов: 429 / 54 | Длительность: 19:27:00
Тема: Программирование
Специальности: Программист, Системный архитектор
Самостоятельная работа 2:
Базовые операции обработки изображений
4. Контрольные вопросы
- Какой эффект наблюдается в результате применения операции эрозии к бинарному изображению?
- Какой эффект наблюдается в результате применения операции дилатации к бинарному изображению?
- В каких ситуациях имеет смысл применять операции замыкания и размыкания?
- Какую информацию позволяет получить гистограмма изображения?
- Что позволяет получить применение оператора Собеля с ядром
? - Что позволяет получить применение оператора Собеля с ядром
? - Перечислите основные способы повышения контраста изображений. Приведите принципиальные отличия в вычислительных схемах.
- Перечислите некоторые способы выделения ребер на изображении, предложенные в настоящей работе. Приведите последовательность операций, которые необходимо выполнить для реализации каждого из рассмотренных способов.
5. Дополнительные задания
- Добавьте в разработанную структуру консольного графического редактора поддержку операций, описанных в данной лабораторной работе.
- Добавьте в разработанный консольный графический редактор возможность сохранения изображений, которые получены в результате применения различных операций.
- Добавьте возможность рисования геометрических примитивов в разработанный консольный редактор. Предусмотрите возможность удаления отрисованных примитивов.
- Разработайте редактор изображений с использованием графических компонент библиотеки OpenCV, реализованных на базе Qt.
7. Приложения
7.1. Приложение А. Исходный код основной функции консольного редактора изображений
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include "functions.h"
using namespace cv;
const int kMenuTabs = 12;
const char* menu[] =
{
"0 - Read image",
"1 - Apply linear filter",
"2 - Apply blur(...)", "3 - Apply medianBlur(...)",
"4 - Apply GaussianBlur(...)",
"5 - Apply erode(...)",
"6 - Apply dilate(...)",
"7 - Apply Sobel(...)",
"8 - Apply Laplacian(...)",
"9 - Apply Canny(...)",
"10 - Apply calcHist(...)",
"11 - Apply equalizeHist(...)"
};
const char* winNames[] =
{
"Initial image",
"filter2d",
"blur",
"medianBlur",
"GaussianBlur",
"erode",
"dilate",
"Sobel",
"Laplacian",
"Canny",
"calcHist",
"equalizeHist"
};
const int maxFileNameLen = 1000;
const int escCode = 27;
void printMenu();
void chooseMenuTab(int &activeMenuTab, Mat &srcImg);
void loadImage(Mat &srcImg);
int main(int argc, char** argv)
{
Mat srcImg; // исходное изображение
char ans;
int activeMenuTab = -1;
do
{
// choose menu item
chooseMenuTab(activeMenuTab, srcImg);
// apply operation
applyOperation(srcImg, activeMenuTab);
// ask a question
printf("Do you want to continue? ESC - exit\n");
// waiting for key will be pressed
ans = waitKey();
}
while (ans != escCode);
destroyAllWindows(); // destroy all windows // release memory allocated for storing image
srcImg.release();
return 0;
}
void printMenu()
{
int i = 0;
printf("Menu items:\n");
for (i; i < kMenuTabs; i++)
{
printf("\t%s\n", menu[i]);
}
printf("\n");
}
void loadImage(Mat &srcImg)
{
char fileName[maxFileNameLen];
do
{
printf("Input full file name: ");
scanf("%s", &fileName);
srcImg = imread(fileName, 1);
}
while (srcImg.data == 0);
printf("The image was succesfully read\n\n");
}
void chooseMenuTab(int &activeMenuTab, Mat &srcImg)
{
int tabIdx;
while (true)
{
// print menu items
printMenu();
// get menu item identifier to apply operation
printf(
"Input item identifier to apply operation: ");
scanf("%d", &tabIdx);
if (tabIdx == 0)
{
// read image
loadImage(srcImg);
}
else if (tabIdx >=1 && tabIdx < kMenuTabs &&
srcImg.data == 0)
{
// read image
printf("The image should be read\ to apply operation!\n");
loadImage(srcImg);
}
else if (tabIdx >=1 && tabIdx < kMenuTabs)
{
activeMenuTab = tabIdx;
break;
}
}
}
7.2. Приложение Б. Исходный код заголовочного файла функционального модуля консольного редактора изображений
#ifndef __FUNCTIONS_H__ #define __FUNCTIONS_H__ #include <opencv2/opencv.hpp> using namespace cv; extern const int kMenuTabs; extern const char* winNames[]; // TODO: добавить прототипы функций, реализующих // другие операции int applyMedianBlur(const Mat &src, Mat &dst); int applyOperation(const Mat &src, const int operationIdx); #endif
7.3. Приложение В. Исходный код функционального модуля консольного редактора изображений
#include "functions.h"
int applyMedianBlur(const Mat &src, Mat &dst)
{
int kSize = 3, minDim = -1;
minDim = min(src.size().height, src.size().width);
do
{
printf("Set kernel size (odd, > 3, \
< min(img.width, img.height)): ");
scanf("%d", &kSize);
}
while (kSize < 3 && kSize > minDim && kSize %2 == 0); medianBlur(src, dst, kSize);
return 0;
}
int applyOperation(const Mat &src, const int operationIdx)
{
char key = -1;
Mat dst;
switch (operationIdx)
{
case 1:
{
// TODO: "1 - Apply linear filter"
break;
}
case 2:
{
// TODO: "2 - Apply blur(...)"
break;
}
case 3:
{
// "3 - Apply medianBlur(...)"
applyMedianBlur(src, dst);
break;
}
case 4:
{
// TODO: "4 - Apply GaussianBlur(...)"
break;
}
case 5:
{
// TODO: "5 - Apply erode(...)"
break;
}
case 6:
{
// TODO: "6 - Apply dilate(...)"
break;
}
case 7:
{
// TODO: "7 - Apply Sobel(...)"
break;
}
case 8:
{
// TODO: "8 - Apply Laplacian(...)"
break; }
case 9:
{
// TODO: "9 - Apply Canny(...)"
break;
}
case 10:
{
// TODO: "10 - Apply calcHist(...)"
break;
}
case 11:
{
// TODO: "11 - Apply equalizeHist(...)"
break;
}
}
// show initial image
namedWindow(winNames[0], 1);
imshow(winNames[0], src);
// show processed image
namedWindow(winNames[operationIdx]);
imshow(winNames[operationIdx], dst);
return 0;
}
"