- •Задание
- •Выполнение задание 1: Выполните сглаживание изображений с помощью различных фильтров. Сравните результаты численно и количественно.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 2: Изучите морфологические операции над изображениями, выполните фильтрацию тонких линий с помощью морфологических фильтров.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 3: Работа с подобластями. Измените яркость и контраст заданной части изображения. Впишите в одно изображение другое меньшего размера.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 4: Постройте гистограмму изображения. Примените эквализацию гистограммы.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 5: Используйте преобразование Хау для поиска прямых на изображении.
- •Результаты:
- •Фрагмент кода выполнения
- •Задание 6: По найденным прямым постройте аффинное преобразование и выровняйте изображение.
- •Фрагмент кода выполнения
- •Список используемых источников
Задание 2: Изучите морфологические операции над изображениями, выполните фильтрацию тонких линий с помощью морфологических фильтров.
cvMorphologyEx(). обеспечивает более сложные морфологические преобразования изображения.
CVAPI(void) cvMorphologyEx( const CvArr* src, CvArr* dst,
CvArr* temp, IplConvKernel* element,
int operation, int iterations CV_DEFAULT(1) );
src — исходное изображение
dst — изображение для сохранения результата
temp — для промежуточного хранения результатов (размер изображения должен совпадать с размером исходного изображения) — требуется при определённом значении operation
operation — определяет тип морфологического преобразования:
#define CV_MOP_OPEN 2
#define CV_MOP_CLOSE 3
#define CV_MOP_GRADIENT 4
#define CV_MOP_TOPHAT 5
#define CV_MOP_BLACKHAT 6
CV_MOP_OPEN и CV_MOP_CLOSE — комбинация сужения и расширения:
CV_MOP_OPEN — сначала сужается, а затем расширяется. Обычно используется для подсчёта регионов на двоичном изображении.
CV_MOP_CLOSE — сначала расширяется, а затем сужается. Обычно используется для уменьшения шумовых выбросов на границах регионов.
CV_MOP_GRADIENT:
gradient(src) = Dilate(src)–Erode(src)
Результатом этой операции над двоичным изображением станет выделение периметров существующих пятен. На картинке с градациями серого градиент покажет как быстро меняется яркость (поэтому и называется — градиент).
CV_MOP_TOPHAT и CV_MOP_BLACKHAT:
TopHat(src) = src–Open(src)
BlackHat(src) = Close(src)–src
CV_MOP_TOPHAT — изолирует яркие локальные пики.
CV_MOP_BLACKHAT — изоляция тёмных регионов.
Результаты:
Рис.3-7. Результат морфологических преобразований
Фрагмент кода выполнения
//========================================================================================
// Создание окон
cv::namedWindow("Morphology Transformations", CV_WINDOW_AUTOSIZE);
// Create Trackbar to select Morphology operation
cv::createTrackbar("Operator:\n 0: Opening - 1: Closing \n 2: Gradient - 3: Top Hat \n 4: Black Hat", "Morphology Transformations",
&morph_operator, max_operator, MorphOperations);
// Create Trackbar to select kernel type
cv::createTrackbar("Element:\n 0: Rect - 1: Cross - 2: Ellipse", "Morphology Transformations",
&morph_elem, max_elem, MorphOperations);
// Create Trackbar to choose kernel size
cv::createTrackbar("Kernel size:\n 2n +1", "Morphology Transformations",
&morph_size, max_kernel_size, MorphOperations);
// Default start
MorphOperations(0, 0);
cvWaitKey(0);
cvDestroyWindow("Morphology Transformations");
//==========================================================================================
void MorphOperations(int, void*)
{
int operation = morph_operator + 2;
cv::Mat element = cv::getStructuringElement(morph_elem, cv::Size(2 * morph_size + 1, 2 * morph_size + 1), cv::Point(morph_size, morph_size));
morphologyEx(src, dst, operation, element);
imshow("Morphology Transformations", dst);
}
//==========================================================================================
Задание 3: Работа с подобластями. Измените яркость и контраст заданной части изображения. Впишите в одно изображение другое меньшего размера.
Почти все функции должны поддерживать работу с ROI, т.е. работу с выделенной областью изображения, что полезно для ускорения работы алгоритмов. Т.о. если нас интересует только определённая область изображения — можно её выделить и работать только с ней, не затрагивая всё изображение целиком.
Вот какие функции для работы с ROI предоставляет OpenCV:
CVAPI(void)cvSetImageROI(IplImage*image,CvRectrect)— установка интересующей области рисунка (COI не меняется)
image — указатель на изображение
rect — прямоугольник интересующей области
CVAPI(void)cvResetImageROI(IplImage*image)— сбрасывает область интересов (и COI)
image — указатель на изображение
CVAPI(CvRect)cvGetImageROI(constIplImage*image)— возвращает область интересов изображения
image — указатель на изображение
Если ROI не установлена функция вернёт cvRect(0,0,image->width,image->height). ROI можно использовать для вырезания части изображения или, наоборот, добавления изображения.