Опубликован: 20.08.2013 | Уровень: для всех | Доступ: платный | ВУЗ: Новосибирский Государственный Университет
Самостоятельная работа 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).

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

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