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

Базовые операции обработки изображений

4. Контрольные вопросы

  1. Какой эффект наблюдается в результате применения операции эрозии к бинарному изображению?
  2. Какой эффект наблюдается в результате применения операции дилатации к бинарному изображению?
  3. В каких ситуациях имеет смысл применять операции замыкания и размыкания?
  4. Какую информацию позволяет получить гистограмма изображения?
  5. Что позволяет получить применение оператора Собеля с ядром \begin{bmatrix}
-1 & 0 & 1 \\
-2 & 0 & 2 \\
-1 & 0 & 1
\end{bmatrix}?
  6. Что позволяет получить применение оператора Собеля с ядром \begin{bmatrix}
-1 & -2 & 1 \\
0 & 0 & 0 \\
1 & 2 & 1
\end{bmatrix}?
  7. Перечислите основные способы повышения контраста изображений. Приведите принципиальные отличия в вычислительных схемах.
  8. Перечислите некоторые способы выделения ребер на изображении, предложенные в настоящей работе. Приведите последовательность операций, которые необходимо выполнить для реализации каждого из рассмотренных способов.

5. Дополнительные задания

  1. Добавьте в разработанную структуру консольного графического редактора поддержку операций, описанных в данной лабораторной работе.
  2. Добавьте в разработанный консольный графический редактор возможность сохранения изображений, которые получены в результате применения различных операций.
  3. Добавьте возможность рисования геометрических примитивов в разработанный консольный редактор. Предусмотрите возможность удаления отрисованных примитивов.
  4. Разработайте редактор изображений с использованием графических компонент библиотеки 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; 
}
Андрей Терёхин
Андрей Терёхин

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

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

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

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