Новосибирский Государственный Университет
Опубликован: 20.08.2013 | Доступ: свободный | Студентов: 865 / 38 | Длительность: 14:11:00
Самостоятельная работа 1:

Сборка и установка библиотеки OpenCV. Использование библиотеки в среде Microsoft Visual Studio

< Лекция 5 || Самостоятельная работа 1: 12345678910 || Самостоятельная работа 2 >
4.2.4. Отображение изображения

Безусловно, после обработки изображения необходимо посмотреть результат. Для корректного отображения изображения необходимо последовательно выполнить три действия:

  1. Создать окно для отображения с помощью функции namedWindow. Функция принимает на вход название окна, которое служит идентификатором окна, и флаги. Отметим, что если окно с аналогичным идентификатором уже существует, то функция не выполняет никаких действий.

    void namedWindow(const string& winname, int flags)       
              

    Параметр flags может принимать следующие значения или их комбинации, полученные в результате применения оператора "OR":

    • CV_WINDOW_NORMAL или CV_WINDOW_AUTOSIZE, первое значение позволяет пользователю вручную изменять размеры окна в процессе работы приложения, в то время, как второе автоматически подгоняет размеры окна под размеры изображения, запрещая пользователю изменять размер вручную;
    • CV_WINDOW_FREERATIO или CV_WINDOW_KEEPRATIO, CV_WINDOW_FREERATIO подгоняет изображение под окно без сохранения пропорций, CV_WINDOW_KEEPRATIO позволяет сохранять пропорции;
    • CV_GUI_NORMAL или CV_GUI_EXPANDED, первое значение обеспечивает отрисовку окна без дополнительных компонент таких, например, как строка состояний и панель инструментов, второе же, напротив, предоставляет более новые возможности по созданию графических интерфейсов пользователя наряду с отображением изображений.

    По умолчанию для окна устанавливаются свойства CV_WINDOW_AUTOSIZE, CV_WINDOW_KEEPRATIO, и CV_GUI_EXPANDED.

  2. Отобразить изображение посредством вызова функции imshow. Для отображения необходим идентификатор окна winname, в которое будет помещено изображение, а также само изображение image.
    void imshow(const string& winname, const Mat& image)       
            
  3. Дождаться нажатия какой-либо клавиши, чтобы закрыть окно. Ожидание реализуется посредством вызова функции waitKey, которая принимает на вход время ожидания delay в миллисекундах. По умолчанию delay=0, что означает ожидание в течение бесконечного промежутка времени, т.е. исполнение приложения будет продолжено после нажатия какой-либо клавиши. Отметим, что отсутствие вызова указанной функции приведет к тому, что по завершении программы окно будет автоматически закрыто.
    int waitKey(int delay=0)       
            
4.2.5. Копирование изображения

В некоторых случаях при разработке приложений необходимо работать не с самим изображением, а с его полной копией, чтобы повторно использовать исходное изображение. Напомним, что изображение представляется объектом класса Mat. В состав методов данного класса входит метод clone, который решает указанную задачу.

Mat clone() const;       
      

Есть еще пара полезных методов копирования copyTo: первый (см. прототип ниже) выделяет память для хранения полностью аналогичной матрицы m и копирует в нее содержимое текущей матрицы, второй метод выполняет копирование в соответствии с передаваемой маской mask (копируются только элементы, которым соответствуют ненулевые элементы маски).

void copyTo(Mat& m) const; 
void copyTo(Mat& m, const Mat& mask) const;       
      
4.2.6. Конвертирование изображения в другое цветовое пространство

Конвертирование изображения из одного цветового пространства в другое – это еще одна достаточно важная операция, т.к., например, многие алгоритмы компьютерного зрения работают на изображениях в оттенках серого, в то время как исходное изображение с камеры цветное. Функция cvtColor позволяет конвертировать изображение в другое цветовое пространство.

void cvtColor(const Mat& src, Mat& dst, 
    int code, int dstCn=0)       
      

Входными параметрами данной функции являются исходное изображение src, которое необходимо конвертировать в другое цветовое пространство, конвертированное изображение dst, код операции конвертирования code (из какого в какое пространство) и количество каналов в результирующем изображении dstCn. По умолчанию параметр dstCn принимает значение 0, это означает, что количество каналов результирующего изображения будет определено автоматически. Отметим, что в случае, когда исходное изображение цветное, явно указывается порядок сохранения каналов (RGB или BGR). Рассмотрим подробнее возможные значения, которые принимает параметр code [15]:

  • CV_RGB2GRAY, CV_GRAY2RGB – конвертирование из RGB-пространства в оттенки серого (значение интенсивности вычисляется как взвешенная линейная свертка интенсивностей по всем трем каналам) и наоборот (дублирование интенсивности по трем каналам);
  • CV_BGR2XYZ, CV_RGB2XYZ, CV_XYZ2BGR, CV_XYZ2RGB – преобразование из RGB/BGR-пространств в линейное трехкомпонентное пространство CIE XYZ, основанное на результатах измерения характеристик человеческого глаза, и обратно;
  • CV_BGR2YCrCb, CV_RGB2YCrCb – конвертирование изображения из BGR/RGB в пространство YC_{r}C_{b} (первый канал – линейная комбинация интенсивностей по трем каналам исходного изображения, второй/третий – функции разностей интенсивностей красного/синего и полученного значения интенсивности первого канала), CV_YCrCb2BGR, CV_YCrCb2RGB – обратное конвертирование;
  • CV_BGR2HSV, CV_RGB2HSV, CV_HSV2BGR, CV_HSV2RGB – коды операций преобразования из RGB/BGR пространств в HSV и наоборот;
  • CV_BGR2HLS, CV_RGB2HLS, CV_HLS2BGR, CV_HLS2RGB – коды операций конвертирования из RGB/BGR-пространств в HLS и наоборот;
  • CV_BGR2Lab, CV_RGB2Lab, CV_Lab2BGR, CV_Lab2RGB – коды, обеспечивающие преобразование из BGR/RGB-пространств в CIE L*a*b* и обратно;
  • CV_BGR2Luv, CV_RGB2Luv, CV_Luv2BGR, CV_Luv2RGB – коды, обеспечивающие преобразование из BGR/RGB пространства в CIE L*u*v* и обратно;
  • CV_BayerBG2BGR, CV_BayerGB2BGR, CV_BayerRG2BGR, CV_BayerGR2BGR, CV_BayerBG2RGB, CV_BayerGB2RGB, CV_BayerRG2RGB, V_BayerGR2RGB. Шаблон Байера (Bayer pattern) – это широко используемый формат хранения изображений в CCD и CMOS камерах. Интенсивности по всем каналам хранятся в одной плоскости, конвертирование в RGB/BGR пространство выполняется посредством интерполяции значений интенсивностей пикселей, принадлежащих некоторой окрестности и содержащих интенсивность соответствующего канала.
4.2.7. Масштабирование изображения

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

void resize(const Mat& src, Mat& dst, Size dsize, 
  double fx=0, double fy=0, 
  int interpolation=INTER_LINEAR)       
      

Функция resize в качестве входных параметров принимает исходное изображение src, матрицу dst, куда будет записан результат масштабирования, размер dsize результирующего изображения, масштабирующие коэффициенты fx и fy по горизонтали и вертикали соответственно и идентификатор метода интерполяции. Если dsize=0, тогда fx и fy должны быть ненулевыми, и dsize вычисляется по формуле dsize = Size(round(fx*src.cols), round(fy*src.rows))

Если хотя бы один из масштабирующих коэффициентов принимает нулевое значение, тогда его значение определяется в соответствии с одной из формул в зависимости от направления масштабирования (горизонталь или вертикаль): fx=(double)dsize.width/src.cols, fy=(double)dsize.height/src.rows.

Разработчики библиотеки поддерживают следующие методы интерполяции:

  • INTER_NEAREST – интерполяция по методу ближайшего соседа;
  • INTER_LINEAR – билинейная интерполяция (используется по умолчанию);
  • INTER_AREA – интерполяция посредством использования отношения пикселей в некоторой области. Приближение изображения показывает, что результат данной интерполяции очень похож на INTER_NEAREST;
  • INTER_CUBIC – бикубическая интерполяция с использованием окрестности 4x4 пикселя;
  • INTER_LANCZOS4 – интерполяция Ланшоца (Lanczos) с окрестностью 8x8 пикселей.
4.2.8. Выделение подобласти изображения

Существует значительный класс алгоритмов, которые работают не на всем изображении, а только на некоторой его подобласти – области интереса (region of interests). Поэтому на данном этапе рассмотрим функции для выделения такой подобласти. По существу это операция выделения подматрицы в матрице Mat. Класс Mat имеет два перегруженных оператора круглые скобки, которые и позволяют получить подобласть изображения.

Mat operator()( Range rowRange, Range colRange ) const; 
Mat operator()( const Rect& roi ) const;       
      

Разница между указанными методами лишь в том, что в первом случае на вход отдаются интервалы изменения индексов по горизонтали rowRange и по вертикали colRange, а во втором – прямоугольник roi, который необходимо выделить из изображения.

< Лекция 5 || Самостоятельная работа 1: 12345678910 || Самостоятельная работа 2 >
Александра Максимова
Александра Максимова

При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка?
 

Алена Борисова
Алена Борисова

В лекции по обработке полутоновых изображений (http://www.intuit.ru/studies/courses/10621/1105/lecture/17979?page=2) увидела следующий фильтр:


    \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 2 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array} - \frac{1}{9} \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 1 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array}

В описании говорится, что он "делает изображение более чётким, потому что, как видно из конструкции фильтра, в однородных частях изображение не изменяется, а в местах изменения яркости это изменение усиливается".

Что вижу я в конструкции фильтра (скорее всего ошибочно): F(x, y) = 2 * I(x, y) - 1/9 I(x, y) = 17/9 * I(x, y), где F(x, y) - яркость отфильтрованного пикселя, а I(x, y) - яркость исходного пикселя с координатами (x, y). Что означает обычное повышение яркости изображения, при этом без учета соседних пикселей (так как их множители равны 0).

Объясните, пожалуйста, как данный фильтр может повышать четкость изображения?