Опубликован: 20.08.2013 | Уровень: для всех | Доступ: платный | ВУЗ: Новосибирский Государственный Университет
Самостоятельная работа 1:

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

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

4. Разработка приложения для демонстрации базовых операций работы с изображениями

4.1. Задача определения контуров объектов

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

Резкое изменение яркости изображения представляет интерес по нескольким причинам [20]:

  1. Такие изменения, как правило, возникают на границах объектов, например, при изображении светлого объекта на темном фоне или наоборот.
  2. Резкие изменения яркости могут быть следствием изменения отражательной способности на достаточно характерных структурах, таких, как разметка пешеходного перехода или пятна на шкуре леопарда.
  3. Резкие изменения ориентации поверхности – это еще одна возможная причина изменения яркости.

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

4.2. Базовые операции

4.2.1. Создание изображения

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

  1. Конструктор класса Mat.
    // _rows – количество строк 
    // _cols – количество столбцов 
    // _type – тип матрицы (CV_8UC1, CV_64FC3 и другие) 
    Mat(int _rows, int _cols, int _type); 
    Mat(Size _size, int _type); 
     
    // _s - заполнитель 
    Mat(int _rows, int _cols, int _type, const Scalar& _s); 
    Mat(Size _size, int _type, const Scalar& _s);       
            
  2. Метод create.
    void create(int _rows, int _cols, int _type); 
    void create(Size _size, int _type);       
            

По сути это два эквивалентных способа создания, выбор, что использовать, безусловно, принадлежит разработчику.

После выполнения всех операций с объектом типа Mat необходимо освободить память, вызвав метод release.

void release();       
      
4.2.2. Загрузка изображения

Загрузка изображения – это одна из основных операций. Ниже приведен прототип функции OpenCV, которая отвечает за загрузку изображений.

Mat imread(const string& filename, int flags=1)       
      

Как отмечалось в предыдущем разделе, изображение представляет собой двумерную матрицу интенсивностей, поэтому функция imread возвращает объект типа Mat. В качестве входных параметров функция принимает название файла filename и целочисленный флаг flags, определяющий правило загрузки:

  • flags>0 означает, что изображение загружается как цветное трехканальное. Отметим, что в OpenCV каналы хранятся в порядке BGR;
  • flags<0 – изображение загружается так, как есть, т.е. автоматически определяется количество каналов;
  • flags=0 используется для загрузки изображения в оттенках серого, что позволяет сразу получить из цветного изображение в оттенках серого без дополнительной конвертации.

Класс Mat имеет набор полей и методов, часть из которых представляет интерес с точки зрения работы с изображением:

  • uchar* data – поле, содержащее значение интенсивностей для каждого пикселя изображения. Если данное поле после загрузки изображения имеет значение NULL, значит, произошла ошибка в процессе загрузки изображения. Типичными ошибками является неправильный путь или название изображения, неподдерживаемый или неправильный формат, некорректные права доступа к файлу;
  • int rows, cols – количество строк и столбцов в матрице;
  • int channels() const – метод, который возвращает количество каналов в изображении;
  • Size size() const – метод для получения размера изображения (width, height – поля класса Size). Обратим внимание читателя, что rows и cols совпадают с width, height соответственно.

Описание назначения других полей и методов можно найти в документации [14].

4.2.3. Сохранение изображения

Естественным образом раз есть операция чтения изображения, необходима и противоположная операция сохранения. Сохранение изображения в файл осуществляется посредством вызова функции imwrite, прототип которой приведен далее.

bool imwrite(const string& filename, 
    const Mat& img, 
    const vector<int>& params=vector<int>())       
      

Функция в качестве параметров принимает название файла filename, в который необходимо сохранить изображение, само изображение img, а также вектор целочисленных параметров params. Указанный вектор определяет параметры сохранения в файл, специфичные для выбранного формата сохранения. Формат определяется расширением файла filename. Вектор параметров представляет собой единую последовательность пар <идентификатор_параметра> и <значение_параметра>. На данный момент доступны следующие идентификаторы:

  • CV_IMWRITE_JPEG_QUALITY – качество сохранения изображения в формате JPEG, принимает значения от 0 до 100%, по умолчанию значение равно 95%.
  • CV_IMWRITE_PNG_COMPRESSION – уровень сжатия изображения при сохранении в формате PNG, принимает значения от 0 до 9 (чем больше уровень, тем мельче результирующее изображение), по умолчанию используется уровень сжатия, равный 3.
  • CV_IMWRITE_PXM_BINARY – флаг, который определяет тип хранения (бинарный или нет) изображения в форматах PPM, PGM, PBM, принимает значение 0 или 1, по умолчанию используется 1.
< Лекция 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).

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

Сергей Кротов
Сергей Кротов
Россия
Дмитрий Донсков
Дмитрий Донсков
Россия, Москва, Московский Авиационный Институт