
- •1 Наименование, шифр сч окр, основание, исполнитель и сроки выполнения
- •2 Цель выполнения окр, наименование и индекс изделия
- •3 Тактико-технические требования к изделию
- •4 Требования к видам обеспечения.
- •Обоснование метода
- •Сегментация и фрагментация изображений
- •Об автоматическом построении трехмерной сцены
- •Выбор и обоснование алгоритма
- •Сегментация в mathlab 7
- •Почему ошибки
- •Блок-схема метода
- •Метод делоне
- •Постановка задачи
- •Описание базового алгоритма триангуляции Делоне
- •Описание модифицированного алгоритма построения триангуляции Делоне
Об автоматическом построении трехмерной сцены
Рассматриваемый метод является механистическим и не может быть использован в реальных системах по причине того, что задача построения трехмерной сцены относится к задачам большой размерности.
Расстояние необходимо знать не только до объектов, но и до их фрагментов, только тогда восприятие будет объемным.
Для построения трехмерной сцены в автоматическом режиме должны быть разработаны математические методы и алгоритмы, обеспечивающие решение следующих задач:
-
автоматическое выделение контуров объектов;
-
автоматическая сегментация изображений (оптимизационная задача в экстремальной постановке);
-
фрагментация изображений (связывание сегментов по цвету и интенсивности с учетом границ и расстояний).
Только после решения вышеперечисленных задач можно приступить к решению задачи автоматического построения трехмерной сцены на основе двух моноскопических изображений.
Выбор и обоснование алгоритма
Еще раз кратко перечислим этапы построения трехмерной сцены:
-
чтение 2-х изображений в трехмерную матрицу;
-
выделение границ на изображениях;
-
прослеживание контуров по границам;
-
конвергирование;
-
составление многослойной матрицы;
-
вывод на экран многослойной матрицы.
Очевидно, что составление программы на любом самом современном языке программирования высокого уровня для данного метода даже для ручной правки трехмерной сцены требует месяцы сложнейшей работы и есть большая вероятность того, что за кодом можно не уловить сути самои идеи.
Чтобы проверить метод и прочувствовать саму идею, а «не потеряться» в коде, было принято следующее решение.
Для первых 4-х этапов будем использовать математический пакет MathLab 7, который является мощнейшим инструментом для математических расчетов в любой области проектирования. Это позволит существенно сократить количество времени за счет того, что написание кода, который требуется для работы с изображениями, сводится к минимуму. В MathLab 7 имеются все необходимые функции для данных этапов.
Этап 5 и 6 будет выполнен в 3D-редакторе «3DViewer», который позволяет построить многослойную матрицу, т.е. получить трехмерную сцену из фрагментированных изображений.
Забегая вперед можно сказать, что появится еще один этап 7 – помещение фрагментов на соответствующие слои – ручная правка. Ручная правка необходима, потому что, как станет ясно в дальнейшем, на 5 этапе возникает большое количество ошибок. Этап 7 также можно выполнить в 3D-редакторе.
Сегментация в mathlab 7
Как уже было сказано, для сегментации на изображениях часто необходимо обнаружить границы объектов – участки изображения, в которых есть перепад яркости.
Вообще, существует сотни алгоритмов сегментации изображения, рассмотрим некоторые из них.
Функция BW=edge(I, method) предназначена для выделения границ на исходном полутоновом изображении I. Данная функция возвращает бинарное изображение BW такого же размера, как исходное I. Пиксель BW(r, с) равен 1, если пиксель I(r, с) принадлежит границе. Для обнаружения границ может использоваться несколько методов. Применяемый метод задается в параметре method в виде одной из следующих строк: 'sobel', 'prewitt', 'roberts', 'log', 'zerocross', 'canny'. Если параметр method при вызове функции опущен, то по умолчанию он полагается равным 'sobel'.
Для каждого из методов определения границ можно задать дополнительные параметры. Для этого используется одна из функций BW=edge(I, method, thresh), BW=edge(I, method, thresh, P), где параметр thresh задает порог для определения того, принадлежит ли пиксель к границе, а в параметре Р передаются настройки, специфичные для каждого из методов.
Если при вызове функции параметр thresh опущен, то значение порога выбирается автоматически. Получить значение порога можно, дополнительно определив выходной параметр thresh: [BW, thresh]=edge(I, method,...).
Рассмотрим использование функции edge для каждого из методов выделения границ.
Функция BW=edge(I, 'sobel', thresh) для определения границ использует фильтрацию исходного изображения I фильтром Собеля; пиксель считается относящимся к границе, если соответствующий ему пиксель результата фильтрации имеет значение, большее thresh. Для данного метода можно указать дополнительный параметр direction: BW=edge(I, 'sobel', thresh, direction), который определяет, какие границы будут обнаруживаться. Параметр direction может принимать значения: 'horizontal' – выделение горизонтальных границ; 'vertical' – выделение вертикальных границ; 'both' – выделение границ во всех направлениях (данное значение используется по умолчанию, когда параметр direction не определен).
Функция BW=edge(I, 'prewitt', thresh) для определения границ использует фильтрацию исходного изображения I фильтром Превита; пиксель считается относящимся к границе, если соответствующий ему пиксель результата фильтрации имеет значение, большее thresh. Для данного метода можно указать дополнительный параметр direction: BW=edge(I, 'prewitt', thresh, direction), который определяет, какие границы будут обнаруживаться. Возможные значения параметра direction описаны выше.
Функция BW=edge(I, 'roberts', thresh) для определения границ использует фильтрацию исходного изображения I фильтром Робертса; пиксель считается относящимся к границе, если соответствующий ему пиксель результата фильтрации имеет значение, большее thresh.
Функция BW=edge(I, 'log', thresh) для определения границ использует фильтрацию исходного изображения I фильтром лапласиан–гауссиана; пиксель считается относящимся к границе, если соответствующий ему пиксель результата фильтрации имеет значение, большее thresh. Для формирования маски фильтра используется функция fspecial с параметрами sigma=2 (среднеквадратичное отклонение) и n=ceil(sigma3)2+1 (размер маски). Параметр sigma можно задать в параметре функции edge: BW=edge(I, 'log', thresh, sigma).
Функция BW=edge(I, 'zerocross', thresh, h) для определения границ использует фильтрацию исходного изображения I линейным фильтром с маской h; пиксель считается относящимся к границе, если соответствующий ему пиксель результата фильтрации имеет значение, большее thresh.
Функция BW=edge(I, 'canny', thresh) использует для определения границ метод Канни. Это достаточно сложный метод, состоящий из большого числа этапов. Суть метода состоит в поиске локальных участков с перепадами яркости. Перепады яркости ищутся с помощью фильтрации по каждой из осей одномерным фильтром лапласиан–гауссиана (см. функцию fspecial). В методе Канни для классификации перепадов на "слабые" и "сильные" используется два порога - нижний и верхний. "Слабые" границы отмечаются в результирующем изображении, только если они соединены с "сильными". Для зашумленных изображений данный метод обеспечивает наилучшее обнаружение границ по сравнению с остальными методами функции edge, но требует существенно большего времени.
Параметр thresh может являться двухэлементным вектором. В этом случае первый элемент вектора задает значение нижнего порога, а второй элемент - значение верхнего порога. Если параметр thresh является скалярным значением, то thresh задает значение верхнего порога, а для нижнего порога используется значение 0.4thresh. Если параметр thresh при вызове функции опущен или в качестве thresh передан пустой массив ([ ]), то значения порогов определяются автоматически.
В функцию BW=edge(I, 'canny', thresh, sigma) дополнительно передается параметр sigma, задающий среднеквадратичное отклонение распределения Гаусса, которое используется при формировании маски фильтра, выделяющего перепады яркости.