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

Сборка и установка Intel® Integrated Performance Primitives. Использование библиотеки в среде Microsoft® Visual Studio

4.5. Запуск приложения и проверка корректности

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

int compare(const Mat &srcImgOCV, const Mat &srcImgIPP) 
{ 
  int kPoints = 0; 
  int w = srcImgOCV.size().width, 
    h = srcImgOCV.size().height, i, j, idx; 
  for (i = 0; i < h; i++) 
  { 
    idx = 3 * i * w; 
    for (j = 0; j < w; j++, idx += 3) 
    { 
      if (srcImgOCV.data[idx] – 
          srcImgIPP.data[idx] != 0 || 
        srcImgOCV.data[idx + 1] – 
          srcImgIPP.data[idx + 1] != 0 || 
        srcImgOCV.data[idx + 2] – 
          srcImgIPP.data[idx + 2] != 0) 
      { 
        kPoints++; 
      } 
    } 
  } 
  return kPoints; 
}   
    

На данный момент можно выполнить запуск приложения, нажав сочетание клавиш Ctrl+F5. В результате работы программы будет показано три изображения: исходное и два отфильтрованных (рис. 10.11). Если приложение отработало корректно, то наряду с этим в консоли будет выведено соответствующее сообщение (рис. 10.12). В противном случае, в консоли появится сообщение об ошибке с указанием количества пикселей, в которых получены разные цвета.

Результат запуска приложения

Рис. 10.11. Результат запуска приложения
Сообщение командной строки

Рис. 10.12. Сообщение командной строки

5. Разработка приложения для поиска прямых линий на изображении с использованием Intel® Integrated Performance Primitives

5.1. Постановка задачи

Задача поиска заданных геометрических примитивов на изображении (прямых, эллипсов, окружностей и т.п.) – одна из актуальных задач компьютерного зрения. Данная задача возникает при разработке приложений в сфере робототехники и видеоаналитики в процессе поиска объектов, имеющих типичную геометрическую форму. Также существует опыт применения методов поиска примитивов при распознавании рукописных текстов.

Обобщенное преобразование Хафа – наиболее известный метод определения положения геометрических примитивов заданной формы на изображении. В настоящей работе предлагается использовать данное преобразование применительно к задаче поиска прямых линий.

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

  1. Поддержка возможности поиска прямых линий с использованием преобразования Хафа, реализованного в библиотеке OpenCV.
  2. Поддержка поиска прямых линий с использованием преобразования Хафа и других необходимых функций библиотеки Intel® IPP.
  3. Отображение полученных прямых линий на исходном изображении.

5.2. Преобразование Хафа

Преобразование Хафа – метод обнаружения прямых и более сложных кривых на бинарных изображениях. Метод позволяет определить параметры семейства кривых и обеспечивает поиск на изображении множества кривых указанного семейства [1]. Первоначально метод был разработан применительно к поиску прямых линий, впоследствии был обобщен на произвольное семейство кривых, заданных параметрически.

Рассмотрим схему работы преобразования Хафа для определения прямых линий на изображении [7]. Прямую на плоскости можно задать параметрически в виде (1), исходя из геометрического представления, показанного на рис. 10.13.

x cos \theta + y sin \theta = R, ( 1)

где R – величина перпендикуляра, опущенного из начала координат системы Oxy на прямую, \theta – угол наклона перпендикуляра относительно оси Ox, 0 \leq \theta < 2\pi.

Параметрическое представление прямой на плоскости

Рис. 10.13. Параметрическое представление прямой на плоскости

Тогда неявная функция, определяющая семейство прямых, может быть записана в форме (2).

F(R,\theta,x,y) = x cos \theta + y sin \theta - R = 0 ( 2)

Таким образом, через каждую точку (x,y) проходит несколько прямых, соответствующих разным значениям параметров R и \theta. По существу любой фиксированной точке (x_{0}, y_{0}) ставится в соответствие набор точек в пространстве параметров (R,\theta). В свою очередь каждой точке (R_{0},\theta_{0}) можно поставить в соответствие количество точек (x,y), лежащих на прямой x cos \theta_{0} + y sin \theta_{0} - R_{0} = 0. Дискретность представления данных в машине требует введения сетки на плоскости параметров \theta_{i} = i \Delta \theta, \;R_{j}=j \Delta R. И теперь каждой точке (R_{0}, \theta_{0}) будем ставить в соответствие количество точек, принадлежащих семейству прямых (3).

x cos \theta + y sin \theta = R, \;\;\; \theta_{i} \leq \theta \leq \theta_{i+1},R_{i} \leq R \leq R_{i+1} ( 3)

Выбрав ячейку сетки, которой соответствует максимальное количество точек, получим наиболее вероятную прямую. В качестве параметров этой прямой можно принять координаты центра ячейки сетки. Если необходимо выделить несколько прямых, то достаточно отсортировать множество ячеек сетки в порядке убывания числа точек и выбрать определенное количество первых ячеек.

Александра Максимова
Александра Максимова

При прохождении теста 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).

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