Разработка методов совмещения фрагментов и инструментария на примере формирования панорамных изображений медицинских микроскопических препаратов

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    2,55 Мб
  • Опубликовано:
    2012-08-18
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка методов совмещения фрагментов и инструментария на примере формирования панорамных изображений медицинских микроскопических препаратов

Введение

Микроскопия как метод исследования постоянно развивается в зависимости от технических достижений в области точной механики и оптики <#"588174.files/image001.jpg">

Рис. 1.2 - Малое количество контрастных объектов на 2х последовательно снятых кадрах на большом количестве кадров;

Рис. 1.3 - Большая область с малым количеством контрастных объектов

Большой перепад яркости на двух смежных кадрах;

 

Рис. 1.4 - Два смежных кадра с большим перепадом яркости

Сильно разнящийся «шаг» при съемке (возможно наложение до 90%);

Последовательность кадров с недостаточной яркостью

Рис. 1.5 - Фрагмент с недостаточной яркостью

1.3 Анализ алгоритмов совмещения фрагментов

Процесс составления из ряда кадров единого изображения называется ститчингом (stitching - склеивание).

Для реализации процесса ститчинга существует несколько программ, основанных на различных алгоритмах, на данный момент наиболее широко используются следующие два алгоритма совмещения кадров:

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

Данный алгоритм используется в следующих программных продуктах CANON PhotoStitch, FlamingPearFlexify, PanoramaComposer, PanoramaMaker, PhotovistaPanorama, PixMakerPro, Pixtra, 3dPhotoBuilderProfessional, EasyPano Tourweaver, Panorama Factory

Все приведенные выше программы пасуют при необходимости сшивать сложные многорядные панорамы.

Революция в алгоритмах сшивания панорам произошла в 1998 году, когда профессор физики Хельмут Дерш (Helmut Dersch) из Технического Университета города Фюртванген (ФРГ) выложил на своем сайте www.fh-furtwangen.de/~dersch ряд разработанных им программ, которые и по сей день являются самым известным и популярным среди фотографов инструментом создания панорамных изображений. Главное достоинство подхода, лежащего в основе этих программ, заключалось в том, что он позволял получать панорамы любых типов из снимков, полученных с помощью практически любого объектива. С их помощью можно сшивать как однорядные, так и многорядные панорамы. Наличие на исходных снимках всякого рода геометрических искажений также не является препятствием для получения панорам хорошего качества. Еще одним немаловажным достоинством разработки Х. Дерша являлось то, что она распространялась и распространяется до сих пор совершенно бесплатно. Более того, автор сделал свой проект открытым и теперь любой может внести свою лепту в дальнейшее совершенствование его программ и методик.

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

Первоначально пакет программ Х.Дерша получил название Panorama Tools и представлял собой 4 плагина к Фотошопу или любому другому растровому графическому редактору, работающему со слоями. В дальнейшем, по мере совершенствования, пакет пополнился несколькими самостоятельными программами. В состав пакета входит также т.н. PTViewer - программа просмотра панорамный изображений. Сегодня весь этот пакет, состоящий из плагинов Panorama Tools, 8-ми самостоятельных программ и PTViewer'а, носит название PanoTools.

Пакет PanoTools мог бы, претендовать на роль той самой 'универсально-идеальной' программы сшивания, если бы не одно весьма существенное обстоятельство. Работа с PanoTools предусматривает весьма тщательную расстановку контрольных точек на одинаковых элементах смежных областей исходных изображений. Причем выходное качество, весьма чувствительно к количеству и точности их расстановки. В настоящее время предпринимаются попытки создания программ автоматического определения координат контрольных точек, но, но полностью обойтись без ручного вмешательства в работу этих программ (проблема ложных точек) вряд ли удастся. Изначально пакет не предусматривал наличие вообще какого-либо графического интерфейса пользователя (GUI). Однако сегодня эта проблема успешно решена как самим автором PanoTools (программа PTPicker), так другими разработчиками (программы PTGui, PTAssembler и PTMac). 3 последних программы уже не являются бесплатными. Следует отметить, что эти 3 программы не содержат какие-либо дополнения или усовершенствования к программам и методикам профессора Дерша. Они лишь предоставляют графический интерфейс для работы с созданными им средствами.

2. Разработка требований

.1 Разработка концептуальной модели

На основе анализа системы регистрации изображений АТЛАНТ-микро, самих изображений и описаний алгоритмов обработки цифровых изображений была предложена следующая концептуальная модель системы:

  







Рис. 2.1 - Концептуальная модель системы

Блок совмещения фрагментов - данный блок должен содержать в себе алгоритмы совмещения фрагментов.

Блок анализа работы алгоритмов - данный блок должен содержать в себе инструментарий для анализа работы алгоритмов совмещения фрагментов.

Блок ручной корректировки - данный блок должен содержать инструментарий для ручной коррекции положения панорамного изображения.

2.2 Разработка требований к системе

.2.1 Разработка требований к программному обеспечению

Из предложенной концептуальной модели системы, анализа алгоритмов обработки цифровых изображений и анализа исходных данных был сформулирован ряд требований, к программному обеспечению системы:

Наличие 1 исходного алгоритма и 3х разработанных;

Наличие средств анализа результатов работы алгоритмов;

Иметь понятный интерфейс с малкой степенью вложенности меню;

Иметь возможность ручной корректировки работы алгоритмов;

Совместимость с современными ОС, такими как: Windows XP, Windows 7, Windows Vista;

2.2.2 Разработка требований к методическому обеспечению

Помимо программного обеспечения, разработанная система должна включать в себя методическое обеспечение, которое должно содержать в себе:

Подробное руководство с описанием основных функций программы;

Методику проведения эксперимента с использованием разработанного программного обеспечения;

Лабораторный практикум с текстом трёх лабораторных работ, рассчитанных на три академических часа каждая;

2.2.3 Разработка требований к экспериментальному исследованию

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

Цель и задача эксперимента;

Проведение эксперимента;

Выводы по результатам эксперимента;

2.2.4 Разработка требований к аппаратному обеспечению

Проанализировав алгоритмы совмещения фрагментов, которые будут реализованы в программе были сформулированы следующие требования к аппаратному обеспечению:

Операционная система Windows XP (SP2 или выше) / Windows Vista / Windows 7;

Процессор Intel Pentium с тактовой частотой 3 ГГц или лучше;

Гб оперативной памяти;

Объём памяти видеоадаптера 256 Мб;

Мб свободного места на жестком диске;

Клавиатура и мышь.

3. Разработка алгоритмов совмещения фрагментов

.1 Базовый Алгоритм

























Рис. 3.1 - Базовый алгоритм совмещения фрагментов

На основе предпроэктного обследования и принципа работы данного алгоритма, становятся видны 3 глобальных недостатка:

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

Быстродействие. Алгоритм пробегает по всем пикселям области совмещения по несколько раз, по этой причине алгоритм работает крайне медленно.

Малоконтрастные области. С совмещение малоконтрастных областей алгоритм не справится по причине того, что значение средней разности по наложению будет крайне малым.

3.2 Повышения корректности совмещения

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

При загрузке изображений в программу обработать изображения маской выделяющей границы объектов.

Для сшиваемой пары изображений рассчитывать гистограмму по области перекрытия.

Рассчитывается порог бинаризации, при котором на изображении останется не более 70% черных пикселей, отбрасывая, таким образом, не информативные области изображения и повышая точность.

3.3 Повышения быстродействия

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

При загрузке изображений в программу обработать изображения маской выделяющей границы объектов.

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

Строится средний профиль изображений по оси X, т.е. X=(∑p(x,j))/H, где j меняется от 0 до H - высота изображения.

Оценка корректности наложения оценивается по минимальному значению разницы средних профилей.

.4 Совмещения малоконтрастных областей

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

Для решения этой проблемы были предложены следующие решения:

. После первичной обработки алгоритмом с использованием средних профилей провести оценку корректности сшивки, и если значение разницы средних профилей менее определенного опытным путем параметра, то считать сшивку фрагментов корректной, если выше этого парметра - не корректной и тогда этот фрагмент накладывать со средним по всей панораме наложением.

. Изначально сшивать не все кадры, а только те, которые возможно сшить корректно, а остальные кадры накладывать в пустующие области со средним наложением.

4. Разработка программного обеспечения

.1 Разработка структурной схемы

Главный модуль программы - данный модуль должен является средством управления остальными модулями и средством перехода между модулями программного комплекса.

Модуль чтения изображений из файла - данный модуль должен реализовывать собой загрузку изображений и их координат в панораме для дальнейшей работы с ними.

Загрузка изображений в программу - данный модуль должен реализовывать собой загрузку фрагментов панорамного изображения.

Загрузка координат фрагментов - данный модуль должен реализовывать собой возможность считывания координат фрагментов в панораме.

Модуль совмещения фрагментов - данный модуль формировать панорамное изображение микропрепарата выбранными и разработанными алгоритмами совмещения фрагментов.

Модуль сохранения панорамы в файл - данный модуль должен реализовывать сохранение панорамы и координат фрагментов в файл для дальнейшей работы с ними.

Сохранение панорамного изображения в файл

Сохранение координат фрагментов в файл

Модуль ручного редактирования - данный модуль должен реализовывать возможность ручной корректировки совмещения фрагментов и должен включать в себя следующие функции:

«Плавная» попиксельная корректировка положения фрагмента;

«Грубая» ручная корректировка положения фрагмента;

Выбор зоны корректировки;

Корректировка положения 1 кадра;

Корректировка положения нескольких кадров;

Корректировка положения нескольких горизонтальных полос;

Корректировка положения полосы левее выбранного кадра;

Корректировка положения полосы правее выбранного кадра;

Подсветка выбранной для корректировки зоны;

Модуль навигации - данный модуль должен реализовывать возможность быстрой навигации по панорамному изображению.

Модуль Исследования алгоритмов - данный модуль должен реализовывать собой функционал для исследования алгоритмов.

Модуль анализа результатов работы алгоритмов

Оценка параметров перекрытия

Увеличение выбранной области

4.2 Разработка пользовательского интерфейса системы

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

Малая степень вложенности меню;

Названия пунктов меню должны быть «говорящими»;

Число вспомогательных окон должно быть минимальным;

Информация для анализа работы алгоритмов должна быть максимально информативной и не перегружать интерфейс;

Главное окно программы - данный блок является реализацией главного модуля структурной схемы системы, представленной на рис.

Область отображения панорамного изображения - данный элемент предназначен для отображения в масштабе 1:1 изображение панорамы

Контекстное меню - данный элемент предназначен для функций, которые зависят применяются к определенному фрагменту

Обрезать по зоне перекрытия - обрезание фрагмента по зоне перекрытия.

Восстановить - отмена последнего обрезания фрагмента.

Оценка сшивки по перекрытию - вывод параметров перекрытия.

Зафиксировать положение - фиксирование положения фрагмента (необходимо для алгоритма со степенями жесткости).

Главное меню программы - данный элемент предназначен для управления программой, а так же для вызова вспомогательных окон программы, которые являются реализацией модулей представленных на рис. 5 и включает в себя следующие пункты

Файл - данный пункт меню предназначен для загрузки изображений в программу, сохранения панорамы в файл, сохранения координат фрагментов, загрузка координат фрагментов из файла, выхода из программы.

Сшивка панорамы - данный пункт меню предназначен для запуска алгоритмов совмещения фрагментов.

Список Загруженных файлов - данный пункт меню вызывает вспомогательное окно с списком всех загруженных фрагментов

Ручное редактирование - данный пункт меню вызывает вспомогательное окно с функционалом для ручного редактирования положений фрагментов.

Графики - построение графиков анализа работы алгоритмов

Увеличение - вызывает вспомогательное окно для увеличения необходимого участка.

Навигация - данный пункт меню вызывает окно навигации.

4.3 Технология разработки

Средой разработки была выбрана среда Borland С++ Builder 6.0.

Средой выполнения была выбрана операционная система Windows, версии от XP и новее. Критерием выбора данной системы являлись простота освоения для пользователя, распространенность, хорошая техническая поддержка, «богатый» API-интерфейс программирования приложений. Кроме всего прочего, данное семейство операционных систем широко используется в разработках кафедры 46, что даст большую совместимость разработанной системы с уже готовыми системами.

В качества основного языка программирования используется C++, обоснованиями выбора данного языка программирования являются скорость выполнения, надежность.

Для реализации интерфейса программы использовалась библиотека визуальных компонентов VCL.

Библиоте́ка визуа́льных компоне́нтов (англ. Visual Component Library, VCL) - объектно-ориентированная библиотека для разработки программного обеспечения, разработанная компанией Borland (на данный момент поддерживается Embarcadero) для поддержки принципов визуального программирования. VCL входит в комплект поставки Delphi, C++ Builder иEmbarcadero RAD Studio и является, по сути, частью среды разработки, хотя разработка приложений в этих средах возможна и без использования VCL. VCL предоставляет огромное количество готовых к использованию компонентов для работы в самых разных областях программирования, таких, например, как интерфейс пользователя (экранные формы и элементы управления - т. н. «контролы», «контроли»), работа с базами данных, взаимодействие с операционной системой, программирование сетевых приложений и прочее

Для работы с изображениями использовалась библиотека Layer.

Библиотека Layer является разработкой кафедры №46 «Компьютерные медицинские системы». Библиотека предоставляет удобные классы, которые называются леерами, для хранения изображений произвольной разрядности (и вообще матриц с элементами произвольного типа) с настраиваемым доступом к пикселям. В библиотеку входит набор алгоритмов (в понимании STL) обхода пикселей изображений, функции преобразования между изображениями различных разрядностей. Библиотека также поддерживает чтение-запись большого количества графических файлов и вывод изображений на экран. При этом от пользователя скрываются обращения к сторонним библиотекам ввода-вывода и к Windows GDI). Кроме этого в библиотеке содержится набор простейших функций распознавания объектов.

4.4 Реализация базового алгоритма

Особенностью данного алгоритма является то, что он работает с цветными необработанными изображениями.

Этапы работы алгоритма:

Сшивка полосы кадров по горизонтали:

Формируется цикл, в каждом шаге которого уменьшается зона перекрытия от W-10 до W-300, где W - ширина кадра.

По зоне перекрытия считается суммарный попиксельный дифференс, который потом делится на площадь перекрытия, тем самым получается средний дифференс по зоне перекрытия изображений по оси X (высота перекрытия остаётся постоянной и равна H - высоте изображения).

Далее ищется минимальное значение дифференса, которое соответствует положению второго кадра в первом.

После нахождения положения кадра в кадре по оси X, задаётся отклонение по оси Y и по такому же принципу ищется положение по оси Y, т.е. рассчитывается средний дифференс и ищется минимум.

Сшивка 2 полос по вертикали:

Задается перекрытие по вертикали по умолчанию равное 1\3 высоты кадра;

Формируется цикл, в каждом шаге которого уменьшается зона;

По зоне перекрытия считается суммарный попиксельный дифференс, который потом делится на площадь перекрытия, тем самым получается средний дифференс по зоне перекрытия изображений по оси X (высота перекрытия остаётся постоянной и равна H\3);

Далее для найденного X рассчитываем средний дифференс при смещении по оси Y;

Минимальное значение будет равно положению второй полосы в первой по вертикали;

4.5 Алгоритм с бинаризацией на основе гистограмм

Основные шаги алгоритма:

При загрузке изображений в программу обрабатываем каждое изображение маской:

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

Тем самым выделаем границы объектов для сшивки по горизонтали.

Для сшиваемой пары изображений рассчитывается гистограмма по области перекрытия

Далее рассчитывается порог бинаризации, при котором на изображении не более 70% черных пикселей.

Сшиваемые изображения бинаризируются с найденным порогом бинаризации.

Рассчитывается средний дифференс по зоне перекрытия для бинаризованной картинки

Ищется минимум, который соответствует положению кадра в кадре по оси X

Далее задаётся отклонение по оси Y, считается средний дифференс при смещении картинок относительно друг друга по оси Y на заданное отклонение. Ищется минимум.

Сшивка между полосами такая же, как и в алгоритме №2 с тем отличием, что тут дифферен считается для бинаризированных изображений.

.6 Алгоритм поиска минимальной разницы по среднему профилю

При загрузке изображений в программу обрабатываем каждое изображение маской:

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

Тем самым выделаем границы объектов для сшивки по горизонтали.

Проверяем наличие контрастных структур на верхней, нижней, правой и левой половинах кадра.

Сшиваемые изображения бинаризируются с порогом бинариазции = 7, чтобы убрать шум на изображении после обработки его маской. Бинаризация осуществляется по следующему принципу: значение ниже порога приравнивается к нулю, значения выше пороге бинаризации приравниваются к среднему из 3-х компонент.

Строится средний профиль изображений по оси X, т.е. X=(∑p(x,j))/H, где j меняется от 0 до H - высота изображения.

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

Полученный средний дифференс обрабатывается маской [-1 0 2 0 -1], чтобы выделить резкие перепады на графике среднего дифференса.

На полученной графике ищется максимальное значение, индекс которого соответствует истинному положению второго кадра в первом по оси X

Далее изображения обрабатываются маской

|-1 -1 -1 -1 -1|

| 0 0 0 0 0 |

| 0 0 0 0 0 |

| 0 0 0 0 0 |

| 1 1 1 1 1 |

Строится средний профиль по Y (аналогично среднему профилю по X)

Полученные профили вычитаются друз из друга с заданным перекрытием, и ищется минимум, который соответствует истинному положению второго кадра в первом по оси Y

После сшивки всех кадров по полосам оценивается значение максимума при сшивке по оси X. Если значение максимума больше 0,11 (значение получено опытным путём), то сшивка считается правильной и остаётся без изменений, если значение меньше, то сшивка считается неудачной и положение кадра в предыдущем кадре приравнивается среднему значению всех положений кадров в предыдущих.

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

Найденный кадр и кадр над ним обрабатывается маской для сшивки по оси X

Далее изображения бинаризируются с порогом 7

Формируется цикл, в котором для нижнего кадра строится средний профиль по X для полоски шиной в 90 пикселей от верхней границы кадра, а для верхнего кадра рассчитывается средний профиль по X для полоски шириной в 50 пикселей от нижней границы кадра. В каждом следующем шаге цикла полоска для верхнего кадра поднимается вверх на 25 пикселей и средний профиль строится для неё.

Так же в каждом шаге цикла считается средний дифференс, который потом обрабатывается маской и находится максимум, который соответствует истинному положению нижнего кадра в верхнем по оси X

Далее эта же пара изображений обрабатывается маскрой для вертикальной сшивки и бинаризируется с порогом 7

Рассчитывается средний профиль по оси Y для обоих изображений

Рассчитывается средний дифференс, который потом обрабатывается маской.

Ищется максимальное значение, которое соответствует правильному положению нижнего кадра в верхнем по оси Y

Все остальные кадры выстраиваются относительно новых координат только что сшитых кадров

.7 Алгоритм совмещения фрагментов со степенями жесткости кадров

Основные шаги алгоритма:

При загрузке изображений в программу обрабатываем каждое изображение маской:

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

Тем самым выделаем границы объектов для сшивки по горизонтали.

Проверяем наличие контрастных структур на верхней, нижней, правой и левой половинах кадра.

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

Сшиваемые изображения бинаризируются с порогом бинаризации = 7, чтобы убрать шум на изображении после обработки его маской. Бинаризация осуществляется по следующему принципу: значение ниже порога приравнивается к нулю, значения выше пороге бинаризации приравниваются к среднему из 3-х компонент.

Если у сшиваемых изображений площадь контрастных структур на зоне перекрытия больше 1000 (значение получено экспериментально), то считается, что сшивка будет выполнена корректно.

Строится средний профиль изображений по оси X, т.е. X=(∑p(x,j))/H, где j меняется от 0 до H - высота изображения.

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

Полученный средний дифференс обрабатывается маской [-1 0 2 0 -1], чтобы выделить резкие перепады на графике среднего дифференса.

На полученной графике ищется максимальное значение, индекс которого соответствует истинному положению второго кадра в первом по оси X

Далее изображения обрабатываются маской

|-1 -1 -1 -1 -1|

| 0 0 0 0 0 |

| 0 0 0 0 0 |

| 0 0 0 0 0 |

| 1 1 1 1 1 |

Строится средний профиль по Y (аналогично среднему профилю по X)

Полученные профили вычитаются друз из друга с заданным перекрытием и ищется минимум, который соответствует истинному положению второго кадра в первом по оси Y

После сшивки всех кадров по полосам оценивается значение максимума при сшивке по оси X. Если значение максимума больше 0,11 (значение получено опытным путём), то сшивка считается правильной и остаётся без изменений, если значение меньше, то сшивка считается неудачной и положение кадра в предыдущем кадре приравнивается среднему значению всех положений кадров в предыдущих.

Далее в каждой полосе формируются блоки с жёсткой сшивкой.

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

Найденный кадр и кадр над ним обрабатывается маской для сшивки по оси X

Далее изображения бинаризируются с порогом 7

Формируется цикл, в котором для нижнего кадра строится средний профиль по X для полоски шириной в 90 пикселей от верхней границы кадра, а для верхнего кадра рассчитывается средний профиль по X для полоски шириной в 50 пикселей от нижней границы кадра. В каждом следующем шаге цикла полоска для верхнего кадра поднимается вверх на 25 пикселей и средний профиль строится для неё.

Так же в каждом шаге цикла считается средний дифференс, который потом обрабатывается маской и находится максимум, который соответствует истинному положению нижнего кадра в верхнем по оси X

Далее эта же пара изображений обрабатывается маскрой для вертикальной сшивки и бинаризируется с порогом 7

Рассчитывается средний профиль по оси Y для обоих изображений

Рассчитывается средний дифференс, который потом обрабатывается маской.

Ищется максимальное значение, которое соответствует правильному положению нижнего кадра в верхнем по оси Y

Все остальные кадры блока выстраиваются относительно новых координат только что сшитых кадров.

Цикл повторяется для всех блоков в полосе.

4.8 Модуль ручной корректировки

От модуля ручной корректировки изображения требуется:

Возможность плавной(попиксельной) корректировки;

Возможность грубой корректировки;

Возможность выбора области корректировки;

фрагмент;

несколько фрагментов;

все фрагменты полосы левее выделенного;

все фрагменты правее выделенного;

несколько горизонтальных полос;






Рис. 4.1 - Схема работы модуля ручной корректировки

В ходе разработки данного модуля( смотри рис.) было решено добавить туда подсветку редактируемой области для удобства редактирования.

Рис. 4.2 - Модуль ручной корректировки

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

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

Рис. 4.3 - Функции обрезания кадра и фиксации положения

4.9 Модуль навигации

Данный модуль должен решать следующие задачи:

Возможность просмотра миниатюры изображения всей панорамы;

Возможность быстрого перемещения на необходимую область в основном окне;

Данный модуль реализован следующим образом:

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

Рис. 4.4 - Модуль навигации по панораме

4.10 Исследовательский инструментарий

От исследовательского инструментария требуется, чтобы он удовлетворял следующим условиям:

Оценка параметров области совмещения;

Оценка параметров фрагмента;

Оценка корректности совмещения фрагментов;

Инструментарий для оценки «на глаз»

Инструментарий для оценки параметров зоны перекрытия и корректности совмещения

Оценка корректности работы алгоритмов;

Исследовательский инструментарий разбит на 3 различных модуля:

Модуль глобальных параметров - параметры фрагмента и области совмещения.

Рис. 4.5 - Параметры сшивки и фрагмента

Модуль оценки качества сшивки

Данный модуль представляет собой построение графиков по параметрам сшивки и работы алгоритмов. Для каждого алгоритма строятся свои графики.

Рис. 4.6 - График средних профилей

Модуль оценки зоны перекрытия «на глаз»

Данный модуль представляет собой увеличение выбранной области с 2х кратным или 4х кратным увеличением.

Рис. 4.7 - Увеличение выбранной области с 2х увеличением

4.11 Состав разработанных модулей

Таблица 4.1

Имя файла

Размер, КБ

Тип

Примечание

1

main.cpp

73

.cpp

 Заголовочный файл главного модуля программы. Объявление глобальных переменных.

2

main.h

6

.h

 Главный модуль программы, инициализация переменных, реализация методов главного окна.

3

Filter.cpp

4

.cpp

 Реализация методов класса алгоритмов обработки изображений

4

filter.h

1

.h

Описание методов класса алгоритмов обработки изображений

5

graphics1.cpp

5

.cpp

 Модуль построения графиков для алгоритма с расчетом суммарного попиксельного дифференса

7

graphics2.cpp

3

.cpp

 Модуль построения графиков для алгоритма с бинаризацией изображения

9

graphics3.cpp

3

.cpp

 Модуль построения графиков для алгоритма с расчетом средних профилей

11

graphics4.cpp

4

.cpp

 Модуль построения графиков для алгоритма со степенями жесткости

13

LoadedFiles.cpp

1

.cpp

 Модуль загрузки фрагментов в программу

15

NavigationForm.cpp

3

.cpp

 Реализация методов классов алгоритмов модуля навигации

16

NavigationForm.h

2

.h

 Описание методов классов алгоритмов модуля навигации

17

PanoramaMaker.cpp

2

.cpp

 Модуль совмещения фрагментов

18

PanoramaPartEdit.cpp

4

Модуль ручной корректировки

20

PanoramaSize.cpp

4

.cpp

 

22

SaveParams.cpp

10

.cpp

 Модуль сохранения панорамы и координат фрагментов

24

StitchParameters.cpp

1

.cpp

Хранение параметров совмещения алгоритмов

26

ZoomForm.cpp

15

.cpp

 Модуль увеличения области

4.12 Тестирование

На этапе тестирование программного обеспечения системы проверялась корректная работа всех элементов программы и реализованных алгоритмов.

Для проверки работы алгоритмов была предложена следующая схема:

Выбор набора фрагментов для эксперимента;

Обработка реализованным в программе алгоритмом совмещения фрагментов;

Сравнение полученного результата с эталонным(собранная в ручном режиме панорама);

Тестирование алгоритма со средними профилями

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

Рис. 4.8 - Результат работы алгоритма(слева) и результат ручной сборки(справа)

Как видно на Рис. Алгоритм со средними профилями работает корректно.

Тестирование алгоритма со степенями жесткости

Для тестирования данного алгоритма было предложено взять выборку фрагментов содержащую малоконтрастные фрагменты. В качестве эталонного изображения было предложено изображение, собранное с помощью модуля ручного редактирования и состоящее из 3х горизонтальных рядов по 12 кадров в каждом.

Рис. 4.9 - Результат работы алгоритма со степенями жесткости

Рис. 4.10 - Результат ручной сборки

Как видно на Рис. и Рис. результат работы алгоритма со степенями жесткости не отличается от результата ручной сборки, что говорит о том, что алгоритм успешно справился с задачей.

5. Разработка методического обеспечения

.1 Руководство пользователя

Руководство пользователя включает в себя назначение разработанного программного обеспечения и описание всех его функций с приведением примеров пользовательского интерфейса.

Название программного обеспечения: PanoramaMaker

Назначение системы:

Изучение вопросов работы алгоритмов совмещения фрагментов;

Исследование эффективности алгоритмов совмещения фрагментов;

Совмещение фрагментов при формировании панорамного изображения 4мя различными алгоритмами;

Ручная сборка панорамных изображений;

Проведение лабораторных работ по курсу «Обработка изображений».

Состав программного обеспечения:

Пусковой файл PanoramaMaker.exe;

Библиотека работы с графикой libgfl267.dll;

Системные требования программного комплекса:

Операционная система Windows XP (SP2 или выше) / Windows Vista / Windows 7;

Процессор Intel Pentium с тактовой частотой 3 ГГц или лучше;

Гб оперативной памяти;

Объём памяти видеоадаптера 256 Мб;

Мб свободного места на жестком диске;

Клавиатура и мышь.

Запуск программы

Для запуска программы необходимо двойным кликом мыши или клавишей Enter запустить файл PanoramaMaker.exe. После запуска программы появится главное окно:

Рис. 5.1 - Главное окно программы

Обозначения на рисунке:

- Главное меню

- Рабочая область

- Полоса загрузки

Загрузка изображений в программу:

Выбрать меню файл -> открыть папку, появится окно настройки размера панорамы (количества фрагментов):

Рис. 5.2 - Окно настройки количества фрагментов

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

Загрузка координат положения кадров

Для загрузки и приминения ранее сохраненных координат фрагментов необходимо выбрать меню файл -> загрузить координаты.

Рис. 5.3 - Пункт главного меню - файл

Сохранение панорамы.

Необходимо выбрать меню файл -> сохранить панораму, где будет необходимо выбрать метод сохранения:

Обрезать по границе крайних кадров (сохранение без черной полосы).

Использовать плавный переход на границе кдаров.

Рис. 5.4 - Параметры сохранения

После выбора параметров сохранения в появившемся окне необходимо ввести имя_файла.bmp, где имя_файла - любое имя файла с панорамой.

Сохранение координат

Для сохранения координат фрагментов необходимо выбрать меню Файл - Сохранить текущие координаты (смотри рис.)

Выход из программы

Для выхода из программы необходимо выбрать меню Файл - Выйти

Просмотр списка загруженных файлов

Рис. 5.5 - Сохранение панорамы

Просмотр списка загруженных файлов.

Для просмотра списка загруженных файлов необходимо выбрать пункт главного меню - Список загруженных файлов.

Автоматическая сшивка фрагментов.

Для автоматической сшивки фрагментов панорамы необходимо выбрать пункт главного меню - сшивка панорамы и дальше выбрать 1 из 4х алгоритмов совмещения фрагментов:

Алгоритм 1 - алгоритм с попиксельным обходом зоны совмещения;

Алгоритм 2 - алгоритм с бинаризацией на основе анализа гистограмм;

Алгоритм 3 - алгоритм с расчетом средних профилей;

Алгоритм 4 - алгоритм с степенями жесткости;

После выбора необходимого алгоритма процесс работы алгоритма будет отображен на полосе загрузки.

Рис. 5.6 - Выбор алгоритма совмещения фрагмента

Ручная корректировка

Необходимо выбрать пункт главного меню - ручное редактирование.

Рис. 5.7 - Окно ручной корректировки положения фрагментов

После появления этого вспомогательного окна становится возможным изменять положение фрагмента в ручном режиме.

Передвигая указателем мыши

Плавно меняя положение с помощью кнопок навигации в окне ручного редактирования.

Для выбора редактируемой области, необходимо отметить галочкой принцип выбора и с зажатой клавишей Shift выбрать курсором мышки необходимые фрагменты:

Редактировать строку - положение меняет активная строка.

Редактировать выбранные картинки -положение меняют выбранные фрагменты

Редактировать выбранные строки - положение меняют выбранные строки

Редактировать кадры слева - автоматически выбираются все кадры левее активного.

Редактировать все кадры справа - автоматически выбираются все кадры справа.

Выделять выбранные фрагменты - подсветка корректируемых фрагментов.

Навигация

Для удобной навигации по панораме необходимо выбрать пункт главного меню - Положение в панораме. После этого появится вспомогательное окно навигация, в котором прямоугольником отмечена область, отображенная в данный момент на рабочей области. Для перемещения в рабочей области необходимо передвинуть прямоугольник в миниатюре:

Рис. 5.8 - Навигация по панораме

пользовательский интерфейс алгоритм бинаризация

Увеличение

Для увеличения участка панорамы необходимо выбрать пункт увеличение и дальше выбрать 2х для двукратного увеличения и 4х для четырехкратного. Появится вспомогательное окна, в котором будет отображаться с выбранным увеличением, зона выбранная правым кликом мыши.

Рис. 5.9 - 2х увеличение выбранного фрагмента

С помощью стрелочек на клавиатуре можно плавно сметить область, которую необходимо отобразить с увеличением.

Графики

Для построения графиков необходимо выбрать пункт меню - графики и дальше активный пункт меню (активным будет только пункт соответствующий графикам для последнего отработавшего алгоритма).

В появившемся окне будут построены графики соответствующие последнему отработавшему алгоритму.

Рис. 5.10 - Окно отображения графиков для алгоритма

Обрезание по зоне перекрытия.

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

Рис. 5.11 - Контекстное меню

Фиксация положения кадра.

Для того, чтобы зафиксировать положения кадра(работает только для алгоритма со степенями жесткости) необходимо нажать правой кнопкой мыши на необходимом кадре и в появившемся контекстном меню(смотри рис.) выбрать зафиксировать положение.

Оценка параметров сшивки

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

5.2 Методика проведения исследований

Исследование эффективности работы алгоритма совмещения в разработанном программном обеспечении состоит из следующих основных этапов:

Выборка фрагментов панорамного изображения;

Совмещение фрагментов выбранным алгоритмом;

Анализ работы алгоритма;

Экспертная визуальная оценка границ совмещения;

Сравнение обработанного изображения с эталонным изображением;

Заключение по результатам исследования.

В качестве примера приведено исследование работы алгоритма медианной фильтрации.

Выборка фрагментов панорамного изображения и создание эталонного изображения.

Для проведения исследования подойдёт любая выборка фрагментов, полученная с использованием системы АТЛАНТ-микро. Для получения эталонного изображения необходимо собрать готовое панорамное изображения с помощью модуля ручного редактирования.

Рис. 5.12 - Формирование эталонного изображения

Совмещения фрагментов выбранным алгоритмом

Для формирования панорамного изображения необходимо выбрать пункт меню «Сшивка Панорам» - и выбрать необходимый алгоритм. После чего дождаться завершения работы алгоритма (в случае выбора алгоритма 1 и 2 время ожидания - увеличенное).

Рис. 5.13 - Результат автоматической сборки алгоритмом 3

Анализ работы алгоритма

Для анализа работы алгоритмов в программе строятся графики для всех вычисляемых в ходе работы алгоритма значениях. Рассмотрим на примере алгоритма 3 (со средними профилями).

Графики средних профилей:

Рис. 5.14 - График средних профилей

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

График «Диференс» на данном графике показывается разница средних профилей по зоне перекрытия с различным смещением по оси Х. Там где разница минимальная (см рис.) - оптимальное с точки зрения алгоритма положение.

Рис. 5.15 - График дифференс для алгоритма 3(со средними профилями)

Для того чтобы выделить резкие перепады, так как оптимальное положение кадра 2 в кадре 1 будет соответствовать именно резкому перепаду, если не обработать маской, то может возникнуть ситуация, когда минимальное значение дифференса не будет соответствовать оптимальному положению.

Рис. 5.16 - График дифференс после маски для алгоритма 3(со средними профилями)

Экспертная визуальная оценка границ совмещения

Для оценки зоны совмещения фрагментов необходимо воспользоваться инструментом увеличение (выбрать пункт меню «увеличение» и дальше «2х» или «4х» в зависимости от необходимого увеличения) и выбрать необходимую область, после чего оценить корректность совмещения визуально.

Рис. 5.17 - Визуальная оценка границы совмещения

Сравнение с эталонным изображением

Для сравнения с эталоном необходимо выбрать меню «графики» - «профили яркостей» - построится профиль яркостей для полученного панорамного изображения, для загрузки профиля яркости эталонного изображения необходимо нажать кнопку «выбрать эталон» на появившемся окне, после чего выбрать созданное ранее эталонное изображение.

Рис. 5.18 - Профили яркостей для эталонного и сформированного алгоритмом 3 изображения панорамы

Заключение по результатам исследования.

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

.3 Разработка лабораторного практикума

Название лабораторного практикума:

«Лабораторный практикум по курсу «Обработка изображений» ».

Цели и задачи лабораторного практикума:

Изучение принципов работы алгоритмов совмещения фрагментов при формировании панорамного изображения;

Изучение скорости работы алгоритмов совмещения фрагментов на примере реализованных в программном обеспечении PanoramaMaker.

Детальное изучение принципов работы алгоритма с средними профилями.

Структура лабораторного практикума:

Лабораторный практикум

Лабораторная работа №1 «Быстродействие различных алгоритмов совмещения фрагментов при построении панорамного изображения»

Цель работы: оценка скорости различных алгоритмов совмещения фрагментов.

Теоретическая часть: Основные принципы алгоритмов совмещения фрагментов, основные шаги алгоритмов реализованных в программном продукте PanoramaMaker

Практическое задание: Формирование панорамных изображений 4 алгоритмами реализованными в программном продукте PanoramaMaker, оценка времени работы каждого алгоритма.

Лабораторная работа № 2 «Изучение алгоритма совмещения фрагментов со средними профилями»

Цель работы: «Изучение зависимости алгоритма со средними профилями от параметров»

Теоретическая часть: Детальное описание основных шагов алгоритма со средними профилями. Описание реализации фрагментов содержащих основные параметры работы алгоритма.

Практическое задание: Оценка работы алгоритма при изменении параметров минимального перекрытия, порога бинаризации, порогового значения дифференса после обработки маской.

6. Экспериментальные исследования

.1 Эксперимент № 1. Оценка качества совмещения фрагментов алгоритмом с бинаризацией на основе гистограмм

Этапы проведения эксперимента:

Выборка фрагментов панорамного изображения;

Совмещение фрагментов алгоритмом с бинаризацией;

Совмещение фрагментов алгоритмом с бинаризацией;

Сравнение полученных изображений с эталонным изображением;

Заключение по результатам исследования.

Выборка фрагментов панорамного изображения;

В качестве экспериментальной выборки фрагментов была взята выборка фрагментов размером 2*3 фрагмента.

Совмещение фрагментов

На данном этапе были получено панорамное изображение с помощью базового алгоритма и алгоритма с бинаризацией

Сравнение обработанного изображения с эталонным изображением;

Были построены графики (см рис.5.1 и 5.2) «профили яркостей» полученных изображения и эталонного.

Рис. 6.1 - Профили яркостей панорамы собранной алгоритмом с бинаризацией и эталонного изображения

Рис. 6.2 - Профили яркостей панорамы собранной базовым алгоритмом и эталонного изображения

Заключение по эксперименту

Из рис. 6.1 и 6.2 отчетливо видно, что результат работы алгоритма с бинаризацией корректней аналогичного результата для базового алгоритма.

6.2 Эксперимент № 2. Оценка скорости работы алгоритма со средними профилями

Этапы проведения эксперимента:

Выборка фрагментов панорамного изображения;

Совмещение фрагментов алгоритмом со средними профилями;

Совмещение фрагментов базовым алгоритмом;

Сравнение времени работы алгоритмов;

Заключение по результатам исследования;

Выборка фрагментов панорамного изображения;

В качестве экспериментальной выборки фрагментов были взяты две выборки фрагментов 2*3 фрагментов и 2*5 фрагментов, такой маленький размер панорамы обусловлен низкой скоростью работы базового алгоритма.

Совмещение фрагментов

Были построены панорамные изображения алгоритмом со средними профилями и базовым алгоритмом.

Сравнение времени работы алгоритмов.

Таблица 6.1

Размер панорамного изображения

Время работы базового алгоритма

Время работы алгоритма со степенями жесткости

2*3

56 сек

4 сек

2*5

117 сек

10 сек


Заключение по результатам эксперимента

Из таблицы видно, что алгоритм со степенями жесткости работает значительно быстрее.

.3 Эксперимент № 3. Оценка работы алгоритма с средними профилями на малоконтрастных участках

Этапы проведения эксперимента:

Выборка фрагментов панорамного изображения;

Совмещение фрагментов выбранным алгоритмом;

Анализ работы алгоритма;

Экспертная оценка границы;

Сравнение обработанного изображения с эталонным изображением;

Заключение по результатам исследования.

Выборка фрагментов панорамного изображения;

В качестве экспериментальной выборки фрагментов была взята область панорамы размером 2*17 кадров содержащая более 50% фрагментов которой - малоконтрастные. Из этих фрагментов было получено эталонное изображение путем ручной сборки панорамного изображения.

Совмещение фрагментов выбранным алгоритмом;

На данном этапе было получено панорамное изображение с помощью алгоритма с средними профилями.

Анализ работы алгоритма;

Были проанализированы рабочие графики алгоритма, из которых очевидно, что алгоритм отработал корректно.

Рис. 6.3 - Участок графика «дифференс»

Экспертная визуальная оценка границ совмещения;

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

Сравнение обработанного изображения с эталонным изображением;

Были построены графики (см рис. 6.4) «профилей яркостей» полученного изображения и эталонного, из которых видно, что полученное изображение значительно отличается от эталонного

Рис. 6.4 - Фрагмент графика сравнения «профилей яркости»

6.4 Эксперимент № 4. Оценка работы алгоритма с средними профилями на малоконтрастных участках

Этапы проведения эксперимента:

Выборка фрагментов панорамного изображения;

Совмещение фрагментов выбранным алгоритмом;

Анализ работы алгоритма;

Экспертная оценка границы;

Сравнение обработанного изображения с эталонным изображением;

Заключение по результатам исследования.

Выборка фрагментов панорамного изображения;

В качестве экспериментальной выборки фрагментов была взята таже выборка фрагментов, что и в эксперименте №1

Совмещение фрагментов выбранным алгоритмом;

На данном этапе было получено панорамное изображение с помощью алгоритма с степенями жесткости.

Анализ работы алгоритма;

Были проанализированы рабочие графики алгоритма, из которых очевидно, что алгоритм отработал корректно.

Рис. 6.5 - Участок графика «дифференс»

Стоит отметить, что данный алгоритм в случае малой контрастности фрагмента не пытается найти оптимальное положение, а накладывает его со средним наложением.

Экспертная визуальная оценка границ совмещения;

Была проведена визуальная оценка границ совмещения, которая показала корректное совмещение фрагментов на границах.

Сравнение обработанного изображения с эталонным изображением;

Были построены графики (см рис.) «профили яркостей» полученного изображения и эталонного, из которых видно, что полученное изображение значительно отличается от эталонного.

Рис. 6.6 - Фрагмент графика «профили яркостей»

Заключение по эксперименту

Из рис. Отчетливо видно, что график «профиля яркости» полученного изображения незначительно отличается от графика эталонного изображения.

Заключение

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

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

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

Программная система может применяться как инструмент для проведения лабораторных работ по курсу «Обработка изображений». Благодаря алгоритмической базе, реализованной в программе и средствам исследования эффективности их работы, система предоставляет возможность изучения вопросов корректности совмещения фрагментов алгоритмами при формировании панорамного изображения микропрепарата.

Список использованной литературы

1.  Введение в компьютерную графику. Лекция 4 (<http://graphics.cs.msu.ru/courses/cg03b/lectures/>)

2.       Б. Страуструп «Язык программирования С++» специальное издание

.        У.Прэтт «Цифровая Обработка Изображений»

.        <http://www.cgm.computergraphics.ru/content/view/49>

.        Р.Гонсалес, Р. Вудс «Цифровая обработка изображений»

.        Сайт профессора Хельмута Дерша www.fh-furtwangen.de/~dersch <http://www.fh-furtwangen.de/~dersch>

Приложение 1

Лабораторный практикум

Лабораторная работа 1 «Быстродействие различных алгоритмов совмещения фрагментов при построении панорамного изображения»

Цель работы: оценка быстродействия различных алгоритмов совмещения фрагментов.

Теоретическая часть

Процесс составления из ряда кадров единого изображения называется ститчингом (stitching - склеивание).

Для реализации процесса ститчинга существует несколько программ, основанных на различных алгоритмах, на данный момент наиболее широко используются следующие два алгоритма совмещения кадров:

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

Данный алгоритм используется в следующих программных продуктах CANON PhotoStitch, FlamingPearFlexify, PanoramaComposer, PanoramaMaker, PhotovistaPanorama, PixMakerPro,Pixtra, 3dPhotoBuilderProfessional, EasyPano Tourweaver, Panorama Factory

Все приведенные выше программы пасуют при необходимости сшивать сложные многорядные панорамы.

Революция в алгоритмах сшивания панорам произошла в 1998 году, когда профессор физики Хельмут Дерш (Helmut Dersch) из Технического Университета города Фюртванген (ФРГ) выложил на своем сайте www.fh-furtwangen.de/~dersch ряд разработанных им программ, которые и по сей день являются самым известным и популярным среди фотографов инструментом создания панорамных изображений. Главное достоинство подхода, лежащего в основе этих программ, заключалось в том, что он позволял получать панорамы любых типов из снимков, полученных с помощью практически любого объектива. С их помощью можно сшивать как однорядные, так и многорядные панорамы. Наличие на исходных снимках всякого рода геометрических искажений также не является препятствием для получения панорам хорошего качества. Еще одним немаловажным достоинством разработки Х.Дерша являлось то, что она распространялась и распространяется до сих пор совершенно бесплатно. Более того автор сделал свой проект открытым и теперь любой может внести свою лепту в дальнейшее совершенствование его программ и методик.

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

Первоначально пакет программ Х.Дерша получил название Panorama Tools и представлял собой 4 плагина к Фотошопу или любому другому растровому графическому редактору, работающему со слоями. В дальнейшем, по мере совершенствования, пакет пополнился несколькими самостоятельными программами. В состав пакета входит также т.н. PTViewer - программа просмотра панорамный изображений. Сегодня весь этот пакет, состоящий из плагинов Panorama Tools, 8-ми самостоятельных программ и PTViewer'а, носит название PanoTools.

Пакет PanoTools мог бы, претендовать на роль той самой 'универсально-идеальной' программы сшивания, если бы не одно весьма существенное обстоятельство. Работа с PanoTools предусматривает весьма тщательную расстановку контрольных точек на одинаковых элементах смежных областей исходных изображений. Причем выходное качество, весьма чувствительно к количеству и точности их расстановки. В настоящее время предпринимаются попытки создания программ автоматического определения координат контрольных точек, но, но полностью обойтись без ручного вмешательства в работу этих программ (проблема ложных точек) вряд ли удастся. Изначально пакет не предусматривал наличие вообще какого-либо графического интерфейса пользователя (GUI). Однако сегодня эта проблема успешно решена как самим автором PanoTools (программа PTPicker), так другими разработчиками (программы PTGui, PTAssembler и PTMac). 3 последних программы уже не являются бесплатными. Следует отметить, что эти 3 программы не содержат какие-либо дополнения или усовершенствования к программам и методикам профессора Дерша. Они лишь предоставляют графический интерфейс для работы с созданными им средствами.

Алгоритмы реализованные в программе

Алгоритм 1 базовый алгоритм системы Атлант Микро

Основные шаги алгоритма:

Формируется цикл, в каждом шаге которого уменьшается зона перекрытия от W-10 до W-300, где W - ширина кадра.

По зоне перекрытия считается суммарный попиксельный дифференс, который потом делится на площадь перекрытия, тем самым получается средний дифференс по зоне перекрытия изображений по оси X (высота перекрытия остаётся постоянной и равна H - высоте изображения).

Далее ищется минимальное значение дифференса, которое соотвествует положению второго кадра в первом.

Алгоритм 2 с бинаризацией на основе гистограмм

Основные шаги алгоритма:

При загрузке изображений на вход алгоритма, они обрабатываются маской:

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

Тем самым выделяя границы объектов для сшивки по горизонтали.

Для сшиваемой пары изображений рассчитывается гистограмма по области перекрытия, для изображений обработанных маской для сшивки по горизонтали

Далее рассчитывается порог бинаризации, при котором на изображении не более 70% черных пикселей.

Сшиваемые изображения бинаризируются с найденным порогом бинаризации.

Рассчитывается средний дифференс по зоне перекрытия для бинаризованной картинки

Алгоритм 3 с средними профилями

Основные шаги алгоритма:

При загрузке изображений в программу обрабатываем каждое изображение маской:

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

Тем самым выделаем границы объектов для сшивки по горизонтали.

Проверяем наличие контрастных структур на верхней, нижней, правой и левой половинах кадра.

Сшиваемые изображения бинаризируются с порогом бинариазции = 7, чтобы убрать шум на изображении после обработки его маской. Бинаризация осуществляется по следующему принципу: значение ниже порога приравнивается к нулю, значения выше пороге бинаризации приравниваются к среднему из 3-х компонент.

Строится средний профиль изображений по оси X, т.е. X=(∑p(x,j))/H, где j меняется от 0 до H - высота изображения.

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

Полученный средний дифференс обрабатывается маской [-1 0 2 0 -1], чтобы выделить резкие перепады на графике среднего дифференса.

На полученной графике ищется максимальное значение, индекс которого соответствует истинному положению второго кадра в первом по оси X

Алгоритм 4 с степенями жесткости

Основные шаги алгоритма:

При загрузке изображений в программу обрабатываем каждое изображение маской:

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

Тем самым выделаем границы объектов для сшивки по горизонтали.

Проверяем наличие контрастных структур на верхней, нижней, правой и левой половинах кадра.

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

Сшиваемые изображения бинаризируются с порогом бинаризации = 7, чтобы убрать шум на изображении после обработки его маской. Бинаризация осуществляется по следующему принципу: значение ниже порога приравнивается к нулю, значения выше пороге бинаризации приравниваются к среднему из 3-х компонент.

Если у сшиваемых изображений площадь контрастных структур на зоне перекрытия больше 1000 (значение получено экспериментально), то считается, что сшивка будет выполнена корректно.

Строится средний профиль изображений по оси X, т.е. X=(∑p(x,j))/H, где j меняется от 0 до H - высота изображения.

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

Полученный средний дифференс обрабатывается маской [-1 0 2 0 -1], чтобы выделить резкие перепады на графике среднего дифференса.

На полученной графике ищется максимальное значение, индекс которого соответствует истинному положению второго кадра в первом по оси X

Контрольные вопросы:

Чем обусловлена скорость работы алгоритмов?

Как увеличить скорость работы алгоритмов?

Какой алгоритм корректнее всего справляется с совмещением малоконтрастных фрагментов?

Подготовка к работе

Для работы понадобится архив с файлами проекта PanoramaMaker, 2 набора фрагментов(2*2 фрагмента и 4*4 фрагмента) с наличием контрастных структур на каждом фрагменте в формате.bmp

Задание № 1

.Загрузить набор фрагментов панорамного изображения размером 2 на 2 фрагмента в программу.

. Построить панорамное изображение всеми 4 алгоритмами, заполняя таблицу

Алгоритм

Время сшивки

1


2


3


4



. Сделать заключение о максимально быстром алгоритме.

.Загрузить набор фрагментов панорамного изображения размером 4 на 4 фрагмента в программу.

. Построить панорамное изображение всеми 4 алгоритмами, заполняя таблицу

АлгоритмВремя сшивки


1


2


3


4



. Построить график зависимости скорости алгоритма от числа кадров.

Лабораторная работа 2: «Изучение алгоритма со средними профилями»

Цель работы: Изучение зависимости алгоритма со средними профилями от параметров

Теоретическая часть

Алгоритм со средними профилями изначально разрабатывался для повышения скорости и точности работы базового алгоритма системы Атлант-Микро. Результаты экспериментов показали, что с поставленной задачей алгоритм справился.

Целью данной работы является изучение зависимости качества работы алгоритма со средними профилями от его параметров.

Основные шаги алгоритма:

При загрузке изображений в программу обрабатываем каждое изображение маской:

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

|-1 0 0 0 1|

Тем самым выделаем границы объектов для сшивки по горизонтали.

Проверяем наличие контрастных структур на верхней, нижней, правой и левой половинах кадра.

Сшиваемые изображения бинаризируются с порогом бинариазции = 7, чтобы убрать шум на изображении после обработки его маской. Бинаризация осуществляется по следующему принципу: значение ниже порога приравнивается к нулю, значения выше порога бинаризации приравниваются к среднему из 3-х компонент.

Строится средний профиль изображений по оси X, т.е. X=(∑p(x,j))/H, где j меняется от 0 до H - высота изображения.

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

Полученный средний дифференс обрабатывается маской [-1 0 2 0 -1], чтобы выделить резкие перепады на графике среднего дифференса.

На полученной графике ищется максимальное значение, индекс которого соответствует истинному положению второго кадра в первом по оси X

Далее изображения обрабатываются маской

|-1 -1 -1 -1 -1|

| 0 0 0 0 0 |

| 0 0 0 0 0 |

| 0 0 0 0 0 |

| 1 1 1 1 1 |

Строится средний профиль по Y (аналогично среднему профилю по X)

Полученные профили вычитаются друз из друга с заданным перекрытием и ищется минимум, который соответствует истинному положению второго кадра в первом по оси Y

После сшивки всех кадров по полосам оценивается значение максимума при сшивке по оси X. Если значение максимума больше 0,11 (значение получено опытным путём), то сшивка считается правильной и остаётся без изменений, если значение меньше, то сшивка считается неудачной и положение кадра в предыдущем кадре приравнивается среднему значению всех положений кадров в предыдущих.

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

Найденный кадр и кадр над ним обрабатывается маской для сшивки по оси X

Далее изображения бинаризируются с порогом 7

Формируется цикл, в котором для нижнего кадра строится средний профиль по X для полоски шиной в 90 пикселей от верхней границы кадра, а для верхнего кадра рассчитывается средний профиль по X для полоски шириной в 50 пикселей от нижней границы кадра. В каждом следующем шаге цикла полоска для верхнего кадра поднимается вверх на 25 пикселей и средний профиль строится для неё.

Так же в каждом шаге цикла считается средний дифференс, который потом обрабатывается маской и находится максимум, который соответствует истинному положению нижнего кадра в верхнем по оси X

Далее эта же пара изображений обрабатывается маскрой для вертикальной сшивки и бинаризируется с порогом 7

Рассчитывается средний профиль по оси Y для обоих изображений

Рассчитывается средний дифференс, который потом обрабатывается маской.

Ищется максимальное значение, которое соответствует правильному положению нижнего кадра в верхнем по оси Y

Все остальные кадры выстраиваются относительно новых координат только что сшитых кадров

Минимальное перекрытие - минимальное наложение кадра 2 на кадр 1.

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

Например: если известно, что зона перекрытия - середина кадра, то не имеет смысла искать оптимальное положение до 1/5 кадра.right=100;(size_t x=0;x<vbin10_1.size()-right;++x) // расчёт дифференса между соседними изображениями

{sdifbin10=0;(size_t i=x;i<vbin10_1.size();++i)

{+=abs(vbin10_1[i]-vbin10_2[i-x]);

}/=(double)(vbin10_1.size()-x);_dif.push_back(sdifbin10);->allg1_differens.push_back(sdifbin10);

vdx.push_back(x);

}// конец расчёта дифференса между соседними изображениями

За минимальное наложение кадра отвечает параметр right.

Порог бинаризации - критерий определения контрастной структуры.

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

f.Binarization(VPP[k].L,Ltmp,7);.Binarization(VPP[k+1].L,Ltmp1,7);

Пороговое значение дифференса после обработки маской - параметр, отвечающий за оценку качества сшивки двух фрагментов.

Пороговое значение определяет, какие кадры считаются корректно сшитыми, а какие не корректно, положение которых необходимо рассчитать, как среднее перекрытие по полосе

for(size_t i=0;i<vpic.size();++i)

{(vpic[i]<0.011)[n*y_idx+i+1]->Left=VPan[n*y_idx+i]->Left+mid;[n*y_idx+i+1]->Left=VPan[n*y_idx+i]->Left+vdeltax[i];

}

Контрольные вопросы:

Принцип работа алгоритма с расчетом средних профилей.

От каких параметров зависит алгоритм с расчетом средних профилей?

Чему равно оптимальное пороговое значение дифференса после обработки маской?

Подготовка к работе

Для работы понадобится архив с файлами проекта PanoramaMaker, набор фрагментов с наличием контрастных структур на каждом фрагменте в формате.bmp

Задание № 1

Изменяя значение минимального перекрытия(параметр right) от 1 / 2 до 1/5 собрать панорамное изображение алгоритмом

Заполнить таблицу и построить график зависимости времени работы алгоритма от минимальной области перекрытия

Минимальная область перекрытия

Время работы алгоритма.

0.5 от ширины кадра


0.4 от ширины кадра


0.3 от ширины кадра


0.2 от ширины кадра



Изменяя порог бинаризации 2 до 150 оценить степень корректности работы алгоритма и заполнить таблицу, оценивая корректность работы алгоритма по 5 бальной системе.

Порог бинаризации

Корректность сборки панорамного изображения

2


7


15


25




150



Изменяя пороговое значение дифференса после обработки маской в диапазоне 0.005 до 0.05 подобрать оптимальное значение.

Сделать заключение о правильности выбора оптимального значения равного 0.11.

Приложение 2

Описание алгоритмов формирования панорамных изображений

Описание алгоритма №1. Листинг функции PanoramMake1

void TForm1::PanoramMake1(int Overlap,vector<PanoramPart> VPP)

{t=GetTime();->allg2_differens.clear();_t H=VPP[0].L.H;_t W=VPP[0].L.W;

// задаём положение первого фрагмента панорамы[0]->Left=30;[0]->Top=30;

// объявление переменных для хранения расчётных значений алгоритма

double mindif1=99999999;mindif2=99999999;_t sumdif;x1,y1;x2,y2;->Max=VPP.size()-1;->Position=0;(int y_idx=0;y_idx<RowCount;++y_idx)

{(y_idx>0)

{[y_idx*ColCount]->Left=30;[y_idx*ColCount]->Top=15+VPan[(y_idx-1)*ColCount]->Top+[(y_idx-1)*ColCount]->Height;

}(int x_idx=0;x_idx<ColCount-1;++x_idx)// цикл по X в панорамной сетке

{_t idx=y_idx*ColCount+x_idx;_t yi=VPP[idx].L.H-5;(size_t xi=10;xi<(W-200);++xi)

{=0;

//цикл расчёта разницы между изображениями по зоне перекрытия

for(size_t j=0;j<yi;++j)(size_t i=xi;i<W-5;++i)

{+=abs(VPP[idx].L(i,j).comp[lyr::g_rgb]-[idx+1].L(i-xi+5,j).comp[lyr::g_rgb]

+VPP[idx].L(i,j).comp[lyr::g_rgb]-[idx+1].L(i-xi+5,j).comp[lyr::g_rgb]

+VPP[idx].L(i,j).comp[lyr::b_rgb]-[idx+1].L(i-xi+5,j).comp[lyr::b_rgb]);

}t=((double)sumdif/(double)((W-xi)*yi));->allg2_differens.push_back(t);

// поиск минимума при смещении изображений по X

if(t<mindif1)

{=t;=xi;=yi;

}

}->allg2_differens.push_back(99999999);=mindif1;_t sumdif2;

x2=x1;=H-y1-5;

// смещение изображений по оси Y

for(int dy=0;dy<6;++dy)

{(int xi=x1-6;xi<x1+6;++xi)

{=0;=0;(size_t j=dy;j<H-5;++j)(size_t i=xi;i<W-5;++i)

{+=abs(VPP[idx].L(i,j).comp[lyr::r_rgb]-[idx+1].LB(i-xi,j-dy).comp[lyr::r_rgb]+[idx].L(i,j).comp[lyr::g_rgb]-[idx+1].LB(i-xi,j-dy).comp[lyr::g_rgb]+[idx].L(i,j).comp[lyr::b_rgb]-[idx+1].LB(i-xi,j-dy).comp[lyr::b_rgb]);+=abs(VPP[idx].L(i,j-dy).comp[lyr::r_rgb]-[idx+1].LB(i-xi,j).comp[lyr::r_rgb]+[idx].L(i,j-dy).comp[lyr::g_rgb]-[idx+1].LB(i-xi,j).comp[lyr::g_rgb]+[idx].L(i,j-dy).comp[lyr::b_rgb]-[idx+1].LB(i-xi,j).comp[lyr::b_rgb]);

}t=((double)sumdif/(double)((W-xi)*(H-dy)));t2=((double)sumdif2/(double)((W-xi)*(H-dy)));

// поиск минимума при смещении изображений по Y

if(t<mindif2)

{=t;=xi;=dy;

}(t2<mindif2)

{=t2;=xi;=-dy;

}

}

}[idx+1]->Left=VPan[idx]->Left+x2;[idx+1]->Top=VPan[idx]->Top+y2;[idx+1]->Refresh();->Refresh();

++ProgressBar1->Position;->Refresh();

}

}

// сшивка по кадру между полосами=99999999;=99999999;=0;_t sumdif2=0;(int y_idx=1;y_idx<RowCount;++y_idx)

{_t idx;_t idx1;

// если первая полоса, то берём последний кадр, если вторая, то первый

if((y_idx*5)%2!=0)

{=ColCount*y_idx+ColCount-1;=idx1-ColCount;

}

{=ColCount*y_idx;

idx=idx1-ColCount;

}

// определяем начальное положение сшиваемого кадра

int dTop=VPan[idx1]->Top;dLeft=VPan[idx1]->Left;=VPP[idx].L;=VPP[idx1].L;_t xi=VPP[idx].L.W-5;(size_t yi=10;yi<(H-150);++yi)

{=0;(size_t j=yi;j<H-5;++j)(size_t i=5;i<W-5;++i)

{

// расчёт дифференса между изображениями+=abs(VPP[idx].L(i,j).comp[lyr::g_rgb]-[idx1].L(i,j-yi+5).comp[lyr::g_rgb]+VPP[idx].L(i,j).comp[lyr::g_rgb]-[idx1].L(i,j-yi+5).comp[lyr::g_rgb]

+VPP[idx].L(i,j).comp[lyr::b_rgb]-[idx1].L(i,j-yi+5).comp[lyr::b_rgb]);

}t=((double)sumdif/(double)(xi*(H-yi)));->allg2_differens.push_back(t);

// поиск минимума разницы между двумя изображениями по зоне перекрытия

if(t<mindif1)

{=t;=xi;=yi;

}

}=mindif1;_t sumdif2;=W-x1-5;

y2=y1;

// цикл расчёта разницы между изображениями при смещении по X

for(int yi=y2-6;yi<y2+6;++yi)

{(int dx=0;dx<6;++dx)

{=0;=0;(int j=yi;j<H-5;++j)(int i=dx;i<W-5;++i)

{+=abs(VPP[idx].L(i,j).comp[lyr::r_rgb]-[idx1].LB(i-dx,j-yi).comp[lyr::r_rgb]+[idx].L(i,j).comp[lyr::g_rgb]-VPP[idx1].LB(i-dx,j-yi).comp[lyr::g_rgb]+[idx].L(i,j).comp[lyr::b_rgb]-VPP[idx1].LB(i-dx,j-yi).comp[lyr::b_rgb]);+=abs(VPP[idx].L(i-dx,j).comp[lyr::r_rgb]-[idx1].LB(i,j-yi).comp[lyr::r_rgb]+VPP[idx].L(i-dx,j).comp[lyr::g_rgb]-VPP[idx1].LB(i,j-yi).comp[lyr::g_rgb]+[idx].L(i-dx,j).comp[lyr::b_rgb]-VPP[idx1].LB(i,j-yi).comp[lyr::b_rgb]);

}t=((double)sumdif/(double)((W-dx)*(H-yi)));t2=((double)sumdif2/(double)((W-dx)*(H-yi)));

// поиск минимума разницы(t<mindif2)

{=t;=dx;=yi;

}(t2<mindif2)

{=t2;

x2=-dx;=yi;

}

}

}

// задаём новое положение кадра

VPan[idx1]->Left=VPan[idx]->Left+x2;[idx1]->Top=VPan[idx]->Top+y2;

// рассчитываем изменение относительно старого положения

dTop-=VPan[idx1]->Top;

dLeft=VPan[idx1]->Left-dLeft;[idx1]->Refresh();->Refresh();

//положения всех остальных кадров полосы меняем на изменения в положении сшиваемого кадра

for(size_t i=y_idx*ColCount;i<idx1;++i)

{[i]->Top=VPan[i]->Top-dTop;[i]->Left=VPan[i]->Left+dLeft;

}(int i=idx1+1;i<(y_idx+1)*ColCount;++i)

{[i]->Top=VPan[i]->Top-dTop;[i]->Left=VPan[i]->Left+dLeft;

}

}t1=GetTime();->Caption="Создание панорамных изображений Время работы алгоритма №1 = "+(t1-t);

}

//---------------------------------------------------------------------------

Описание алгоритма №2. Листинг функции PanoramMake2

void TForm1::PanoramMake2(int Overlap,vector<PanoramPart> VPP)

{t=GetTime();->allg3_differens.clear();_t H=VPP[0].L.H;_t W=VPP[0].L.W;

//задаём положение первого кадра панорамы[0]->Left=30;[0]->Top=30;

// объявление переменных для хранения расчётных значений алгоритма

double mindif1=99999999;mindif2=99999999;_t sumdif;x1,y1;x2,y2;->Max=VPP.size()-1;->Position=0;(int y_idx=0;y_idx<RowCount;++y_idx)

{(y_idx>0)

{[y_idx*ColCount]->Left=30;[y_idx*ColCount]->Top=15+VPan[(y_idx-1)*ColCount]->Top+[(y_idx-1)*ColCount]->Height;

}(int x_idx=0;x_idx<ColCount-1;++x_idx)// цикл по X в панорамной сетке

{_t idx=y_idx*ColCount+x_idx;::Filter f;<int> g;=VPP[idx].LB;=VPP[idx+1].LB;_t yi=VPP[idx].L.H-5;(size_t xi=10;xi<(W-100);++xi)

{

// расчёт гистограммы для зоны перекрытия=f.Gistogr(VPP[idx].LB,g,xi,W-5,5,yi);

//определение порога бинаризацииc=static_cast<double>(yi*(W-5-xi))*0.7;_t i=0,s=0;(s<c)

{+=g[i];

++i;

}.Binarization(VPP[idx].LB,Ltmp,i-1);.Binarization(VPP[idx+1].LB,Ltmp1,i-1);

sumdif=0;

// расчёт разницы между изображениями по зоне перекрытия при смещении по X

for(size_t j=5;j<yi;++j)(size_t i=xi;i<W-5;++i)

{+=abs(VPP[idx].LB(i,j).comp[lyr::r_rgb]-[idx+1].LB(i-xi,j).comp[lyr::r_rgb]);

}t=((double)sumdif/(double)((W-xi)*yi));->allg3_differens.push_back(t);

// поиск минимума(t<mindif1)

{=t;=xi;=yi;

}

}->allg3_differens.push_back(99999999);=mindif1;_t sumdif2;

// расчёт разницы между изображениями по зоне перекрытия при смещении по Y

x2=x1;=H-y1-5;(int dy=0;dy<6;++dy)

{(int xi=x1-6;xi<x1+6;++xi)

{=0;=0;(size_t j=dy;j<H-2;++j)(size_t i=xi;i<W-2;++i)

{+=abs(VPP[idx].LB(i,j).comp[lyr::r_rgb]-[idx+1].LB(i-xi,j-dy).comp[lyr::r_rgb]);+=abs(VPP[idx].LB(i,j-dy).comp[lyr::r_rgb]-[idx+1].LB(i-xi,j).comp[lyr::r_rgb]);

}t=((double)sumdif/(double)((W-xi)*(H-dy)));t2=((double)sumdif2/(double)((W-xi)*(H-dy)));

// поиск минимума(t<mindif2)

{=t;=xi;=dy;

}(t2<mindif2)

{=t2;=xi;=-dy;

}

}

}[idx+1]->Left=VPan[idx]->Left+x2;[idx+1]->Top=VPan[idx]->Top+y2;[idx+1]->Refresh();->Refresh();

++ProgressBar1->Position;->Refresh();

}

}

// сшивка по кадру между полосами=99999999;=99999999;=0;_t sumdif2=0;(int y_idx=1;y_idx<RowCount;++y_idx)

{_t idx;_t idx1;

// если нечётная строка - берём последний кадр

if((y_idx*5)%2!=0)

{=ColCount*y_idx+ColCount-1;

idx=idx1-ColCount;

}

// если чётная строка - берём первый кадр

else

{=ColCount*y_idx;=idx1-ColCount;

}dTop=VPan[idx1]->Top;dLeft=VPan[idx1]->Left;=VPP[idx].L;=VPP[idx1].L;_t xi=VPP[idx].L.W-5;(size_t yi=10;yi<(H-150);++yi)

{=0;

//расчёт разницы(size_t j=yi;j<H-5;++j)(size_t i=5;i<W-5;++i)

{+=abs(VPP[idx].L(i,j).comp[lyr::g_rgb]-[idx1].L(i,j-yi+5).comp[lyr::g_rgb]+VPP[idx].L(i,j).comp[lyr::g_rgb]-VPP[idx1].L(i,j-yi+5).comp[lyr::g_rgb]+VPP[idx].L(i,j).comp[lyr::b_rgb]-VPP[idx1].L(i,j-yi+5).comp[lyr::b_rgb]);

}t=((double)sumdif/(double)(xi*(H-yi)));->allg3_differens.push_back(t);

//поиск минимума(t<mindif1)

{=t;=xi;=yi;

}

}=mindif1;_t sumdif2;=W-x1-5;=y1;(int yi=y2-6;yi<y2+6;++yi)

{(int dx=0;dx<6;++dx)

{=0;=0;(int j=yi;j<H-5;++j)(int i=dx;i<W-5;++i)

{+=abs(VPP[idx].L(i,j).comp[lyr::r_rgb]-[idx1].LB(i-dx,j-yi).comp[lyr::r_rgb]+VPP[idx].L(i,j).comp[lyr::g_rgb]-VPP[idx1].LB(i-dx,j-yi).comp[lyr::g_rgb]+VPP[idx].L(i,j).comp[lyr::b_rgb]-VPP[idx1].LB(i-dx,j-yi).comp[lyr::b_rgb]);+=abs(VPP[idx].L(i-dx,j).comp[lyr::r_rgb]-[idx1].LB(i,j-yi).comp[lyr::r_rgb]+VPP[idx].L(i-dx,j).comp[lyr::g_rgb]-VPP[idx1].LB(i,j-yi).comp[lyr::g_rgb]+VPP[idx].L(i-dx,j).comp[lyr::b_rgb]-VPP[idx1].LB(i,j-yi).comp[lyr::b_rgb]);

}t=((double)sumdif/(double)((W-dx)*(H-yi)));t2=((double)sumdif2/(double)((W-dx)*(H-yi)));(t<mindif2)

{=t;=dx;=yi;

}(t2<mindif2)

{=t2;=-dx;=yi;

}

}

}[idx1]->Left=VPan[idx]->Left+x2;[idx1]->Top=VPan[idx]->Top+y2;=VPan[idx1]->Top;=VPan[idx1]->Left-dLeft;[idx1]->Refresh();->Refresh();(size_t i=y_idx*ColCount;i<idx1;++i)

{[i]->Top=VPan[i]->Top-dTop;[i]->Left=VPan[i]->Left+dLeft;

}(int i=idx1+1;i<(y_idx+1)*ColCount;++i)

{[i]->Top=VPan[i]->Top-dTop;[i]->Left=VPan[i]->Left+dLeft;

}

}t1=GetTime();->Caption="Создание панорамных изображений Время работы алгоритма №2 = "+(t1-t);

}

//---------------------------------------------------------------------------

Описание алгоритма №3. Листинг функции PanoramMake3

void TForm1::PanoramMake3(int Overlap,vector<PanoramPart> VPP)

{t= GetTime();->allg1_profilX_left.clear();->allg1_profilX_right.clear();->allg1_differens.clear();->allg1_differens_mask.clear();::Filter f;_t H=VPP[0].L.H;_t W=VPP[0].L.W;

VPan[0]->Left=30;[0]->Top=30;

// объявление переменных алгоритма

vector<double> vbin10_1;<double> vbin10_2;<double> vbin10_1_y;<double> vbin10_2_y;<double> vbin10_1_down;<double> vbin10_2_down;<double> vbin10_dif;<double> vbin10_dif_up;<double> vbin10_dif_down;<double> vbin10_dif_mask;<double> vbin10_dif_mask_up_down;<int> vdx;<int> vdy_up;<int> vdy_down;_t sumdif;x1=0,y1=0;x2,y2;S_obj;->Max=RowCount*(ColCount-1);->Position=0;

// цикл по Y в панорамной сетке(int y_idx=0;y_idx<RowCount;++y_idx)

{(y_idx>0)

{[y_idx*ColCount]->Left=30;[y_idx*ColCount]->Top=15+[(y_idx-1)*ColCount]->Top+VPan[(y_idx-1)*ColCount]->Height;

}.clear();.clear();.clear();(int x_idx=0;x_idx<ColCount-1;++x_idx)// цикл по X в панорамной сетке

{.clear();_up.clear();_down.clear();_1.clear();_2.clear();_1_y.clear();_2_y.clear();_1_down.clear();_2_down.clear();_dif.clear();_dif_up.clear();_dif_down.clear();_dif_mask.clear();_dif_mask_up_down.clear();_t k=y_idx*ColCount+x_idx;=VPP[k].LB;=VPP[k+1].LB;

// бинаризация изображений.Binarization(Ltmp,VPP[k].LB,7);//7 порог.Binarization(Ltmp1,VPP[k+1].LB,7);//7(size_t i=5;i<(W-5);++i)// средний профиль по X

{c_bin1=0,c_bin2=0;(size_t j=5;j<H-5;++j)

{_bin1+=(double)(Ltmp(i,j).comp[lyr::r_rgb]+Ltmp(i,j).comp[lyr::g_rgb]+(i,j).comp[lyr::b_rgb])/3.0;_bin2+=(double)(Ltmp1(i,j).comp[lyr::r_rgb]+Ltmp1(i,j).comp[lyr::g_rgb]+(i,j).comp[lyr::b_rgb])/3.0;

}_1.push_back(c_bin1/(double)(H-10));_2.push_back(c_bin2/(double)(H-10));->allg1_profilX_left.push_back(c_bin1/(double)(H-10));->allg1_profilX_right.push_back(c_bin2/(double)(H-10));

}// конец цикла подсчёта среднего профиля по X

Form6->allg1_profilX_left.push_back(99999999);->allg1_profilX_right.push_back(99999999);right=100;(size_t x=0;x<vbin10_1.size()-right;++x) // расчёт дифференса между соседними изображениями

{sdifbin10=0;(size_t i=x;i<vbin10_1.size();++i)

{+=abs(vbin10_1[i]-vbin10_2[i-x]);

}/=(double)(vbin10_1.size()-x);_dif.push_back(sdifbin10);->allg1_differens.push_back(sdifbin10);

vdx.push_back(x);

}// конец расчёта дифференса между соседними изображениями

Form6->allg1_differens.push_back(99999999);_dif_mask.resize(vbin10_dif.size(),0);max=0;(size_t i=2;i<vbin10_dif_mask.size()-2;++i) // маска дифференса и поиск максимума

{_dif_mask[i]=abs(-vbin10_dif[i-2]+vbin10_dif[i]*2-vbin10_dif[i+2]);->allg1_differens_mask.push_back(vbin10_dif_mask[i]);(vbin10_dif_mask[i]>max)

{=vbin10_dif_mask[i];

x1=vdx[i];

}

}// конец расчёта маски дифференса и поиска максимума

Form6->allg1_differens_mask.push_back(99999999);

vpic.push_back(max);

// обработка маской для сшивки по вертикали

Mask5x5vert(Ltmp,VPP[k].L);x5vert(Ltmp1,VPP[k+1].L);.Binarization(VPP[k].L,Ltmp,7);.Binarization(VPP[k+1].L,Ltmp1,7);=VPP[k].LB;=VPP[k+1].LB;_t sumdif2;=x1;

y2=0;(size_t j=5;j<H-5;++j)// средний профиль по оси Y

{c_bin1=0,c_bin2=0;(size_t i=x2;i<(W-5);++i)

{_bin1+=(double)(Ltmp(i,j).comp[lyr::r_rgb]+Ltmp(i,j).comp[lyr::g_rgb]+(i,j).comp[lyr::b_rgb])/3.0;_bin2+=(double)(Ltmp1(i-x2+5,j).comp[lyr::r_rgb]+(i-x2+5,j).comp[lyr::g_rgb]+Ltmp1(i-x2+5,j).comp[lyr::b_rgb])/3.0;

}_1_y.push_back(c_bin1/(double)(W-5-x2));_2_y.push_back(c_bin2/(double)(W-5-x2));

}// конец расчёта среднего профиля по оси Ymin=99999999;(int x=0;x<5;++x)// расчёт дифференса при смещении картинок отнсительно друг друга вверх и вниз

{sdifbin10=0;sdifbin10_1=0;(size_t i=x;i<vbin10_1_y.size();++i)

{+=abs(vbin10_1_y[i]-vbin10_2_y[i-x]);_1+=abs(vbin10_1_y[i-x]-vbin10_2_y[i]);

}/=(double)(vbin10_1_y.size()-x);_1/=(double)(vbin10_1_y.size()-x);_dif_up.push_back(sdifbin10);_dif_down.push_back(sdifbin10_1);_up.push_back(x);_down.push_back(-x);(sdifbin10<min)

{=sdifbin10;=x;

}(sdifbin10_1<min)

{=sdifbin10_1;=-x;

}

}// конец расчёта дифференса при смещении картинок отнсительно друг друга вверх и вниз

vdeltax.push_back(x2);.push_back(y2);[k+1]->Left=VPan[k]->Left+x2;[k+1]->Top=VPan[k]->Top+y2;[k+1]->Refresh();->Refresh();

++ProgressBar1->Position;->Refresh();

}// конец цикла по x_idxmid=0;_t count=0;mid_y=0;_t count_y=0;(size_t i=0;i<vdeltax.size();++i)

{(vpic[i]>0.011)

{+=vdeltax[i];

++count;_y+=vdeltay[i];

++count_y;

}

}(count==0)++count;(count_y==0)++count_y;/=static_cast<double>(count);_y/=static_cast<double>(count_y);_t n=ColCount;(size_t i=0;i<vpic.size();++i)

{(vpic[i]<0.011)[n*y_idx+i+1]->Left=VPan[n*y_idx+i]->Left+mid;[n*y_idx+i+1]->Left=VPan[n*y_idx+i]->Left+vdeltax[i];

}

} // конец цикла по y_idx

//---------------------------------------------

// сшивка по кадру между полосами<double> vbin101;

vector<double> vbin102;<double> vdif;<double> vdif1;<double> vdif_mask;<int> vdx1;<int> vdx2;<int> vdy;(int y_idx=1;y_idx<RowCount;++y_idx)

{_t max_top_idx=y_idx*ColCount;max_top=0;(int idx=y_idx*ColCount;idx<(y_idx+1)*ColCount;++idx)(VPP[idx].idxTop>max_top)

{_top=VPP[idx].idxTop;_top_idx=idx;

}.clear();.clear();.clear();_mask.clear();.clear();_t idx=max_top_idx-ColCount;_t idx1=max_top_idx;dTop=VPan[idx1]->Top;dLeft=VPan[idx1]->Left;=VPP[idx].L;=VPP[idx1].L;x5(VPP[idx].LB,Ltmp);x5(VPP[idx1].LB,Ltmp1);.Binarization(Ltmp,VPP[idx].LB,7);//7 порог.Binarization(Ltmp1,VPP[idx1].LB,7);//7max=0;(size_t k=0;k<451;k+=25)

{.clear();.clear();.clear();_mask.clear();.clear();.clear();(size_t i=5;i<(W-5);++i)

}(size_t i=5;i<(W-5);++i)

{c_bin2=0;(size_t j=5;j<90;++j)_bin2+=(double)(Ltmp1(i,j).comp[lyr::r_rgb]+(i,j).comp[lyr::g_rgb]+Ltmp1(i,j).comp[lyr::b_rgb])/3.0;.push_back(c_bin2/(double)(45));

}(int x=0;x<vbin101.size()-150;++x)

{sdifbin10=0;sdifbin10_1=0;(size_t i=x;i<vbin101.size();++i)

{+=abs(vbin101[i]-vbin102[i-x]);_1+=abs(vbin101[i-x]-vbin102[i]);

}/=(double)(vbin101.size()-x);_1/=(double)(vbin101.size()-x);.push_back(sdifbin10);.push_back(sdifbin10_1);.push_back(x);.push_back(-x);

}_mask.resize(vdif.size(),0);(size_t i=3;i<vdif_mask.size()-3;++i)

{t=abs(-vdif[i-3]+vdif[i]*2-vdif[i+3]);t1=abs(-vdif1[i-3]+vdif1[i]*2-vdif1[i+3]);(t>max)

{=t;=0;=vdx1[i];_mask[i]=t;

}(t1>max)

{=t1;=0;=vdx2[i];_mask[i]=t1;

}

}

}=x1;=y1;

//----конец поиска минимума по Х

vbin101.clear();.clear();.clear();.clear();_mask.clear();.clear();.clear();.reserve(100);.reserve(100);.reserve(100);.reserve(100);_mask.reserve(100);.reserve(100);.reserve(100);=VPP[idx].L;=VPP[idx1].L;x5vert(VPP[idx].LB,Ltmp);x5vert(VPP[idx1].LB,Ltmp1);.Binarization(Ltmp,VPP[idx].LB,7);//7 порог.Binarization(Ltmp1,VPP[idx1].LB,7);//7

if(x1>=0)(size_t j=H/4;j<H-5;++j)// средний профиль по оси Y

{c_bin1=0,c_bin2=0;(size_t i=x1;i<(W-5);++i)

{_bin1+=(double)(Ltmp(i,j).comp[lyr::r_rgb]+(i,j).comp[lyr::g_rgb]+Ltmp(i,j).comp[lyr::b_rgb])/3.0;_bin2+=(double)(Ltmp1(i-x1+5,j-H/4+5).comp[lyr::r_rgb]+(i-x1+5,j-H/4+5).comp[lyr::g_rgb]+Ltmp1(i-x1+5,j-H/4+5).comp[lyr::b_rgb])/3.0;

}.push_back(c_bin1/(double)(W-5-x1));.push_back(c_bin2/(double)(W-5-x1));

}// конец расчёта среднего профиля по оси Y(size_t j=H/4;j<H-5;++j)// средний профиль по оси Y

{c_bin1=0,c_bin2=0;(size_t i=5;i<(W-5)+x1;++i)

{_bin1+=(double)(Ltmp(i,j).comp[lyr::r_rgb]+(i,j).comp[lyr::g_rgb]+Ltmp(i,j).comp[lyr::b_rgb])/3.0;_bin2+=(double)(Ltmp1(i-x1,j-H/4+5).comp[lyr::r_rgb]+(i-x1,j-H/4+5).comp[lyr::g_rgb]+Ltmp1(i-x1,j-H/4+5).comp[lyr::b_rgb])/3.0;

}.push_back(c_bin1/(double)(W-10+x1));.push_back(c_bin2/(double)(W-10+x1));

}// конец расчёта среднего профиля по оси Y

for(size_t x=0;x<vbin101.size()-20;++x)// дифференс

{sdifbin10=0;(size_t i=x;i<vbin101.size();++i)+=abs(vbin101[i]-vbin102[i-x]);/=(double)(vbin101.size()-x);.push_back(sdifbin10);.push_back(x+H/4-5);

}// конец расчёта дифференса_mask.resize(vdif.size(),0);=-100;(size_t i=3;i<vdif_mask.size()-3;++i)// маска и поиск максимума

{t=abs(-vdif[i-3]+vdif[i]*2-vdif[i+3]);_mask[i]=abs(-vdif[i-3]+vdif[i]*2-vdif[i+3]);(t>max)

{=t;_mask[i]=t;=vdy[i];

}

} // конец поиска максимума_t sumdif2;

vdeltax.push_back(x2);.push_back(y2);.push_back(max);[idx1]->Left=VPan[idx]->Left+x2;[idx1]->Top=VPan[idx]->Top+y2;=VPan[idx1]->Top;=VPan[idx1]->Left-dLeft;[idx1]->Refresh();->Refresh();(size_t i=y_idx*ColCount;i<idx1;++i)

{[i]->Top=VPan[i]->Top-dTop;[i]->Left=VPan[i]->Left+dLeft;

}(int i=idx1+1;i<(y_idx+1)*ColCount;++i)

{[i]->Top=VPan[i]->Top-dTop;[i]->Left=VPan[i]->Left+dLeft;

}

}t1=GetTime();->Caption="Создание панорамных изображений Время работы алгоритма №3 = "+(t1-t);

}

//---------------------------------------------------------------------------

Описание алгоритма №4. Листинг функции PanoramMake4

void TForm1::PanoramMake4(int Overlap,vector<PanoramPart> VPP)

{t=GetTime();->allg4_profilX_left.clear();->allg4_profilX_right.clear();->allg4_differens.clear();->allg4_differens_mask.clear();::Filter f;_t H=VPP[0].L.H;_t W=VPP[0].L.W;[0]->Left=30;[0]->Top=30;<double> vbin10_1;<double> vbin10_2;<double> vbin10_1_y;<double> vbin10_2_y;<double> vbin10_1_down;<double> vbin10_2_down;<double> vbin10_dif;<double> vbin10_dif_up;<double> vbin10_dif_down;<double> vbin10_dif_mask;<double> vbin10_dif_mask_up_down;<int> vdx;<int> vdy_up;<int> vdy_down;_t sumdif;x1=0,y1=0;x2,y2;S_obj;->Max=RowCount*(ColCount-1);->Position=0;

// цикл по Y в панорамной сетке(int y_idx=0;y_idx<RowCount;++y_idx)

{.clear();.clear();.clear();(int x_idx=0;x_idx<ColCount-1;++x_idx)// цикл по X в панорамной сетке

{.clear();_up.clear();_down.clear();_1.clear();_2.clear();_1_y.clear();_2_y.clear();_1_down.clear();_2_down.clear();_dif.clear();_dif_up.clear();_dif_down.clear();_dif_mask.clear();_dif_mask_up_down.clear();_t k=y_idx*ColCount+x_idx;(Vfixed[k])

{;

}(VPP[k].idxRight>1000)

{[k].StitchedRight=true;[k+1].StitchedLeft=true;(y_idx==0)[k]=true;

}=VPP[k].LB;=VPP[k+1].LB;.Binarization(Ltmp,VPP[k].LB,7);//7 порог.Binarization(Ltmp1,VPP[k+1].LB,7);//7(size_t i=5;i<(W-5);++i)// средний профиль по X

{c_bin1=0,c_bin2=0;(size_t j=5;j<H-5;++j)

{_bin1+=(double)(Ltmp(i,j).comp[lyr::r_rgb]+Ltmp(i,j).comp[lyr::g_rgb]+(i,j).comp[lyr::b_rgb])/3.0;_bin2+=(double)(Ltmp1(i,j).comp[lyr::r_rgb]+(i,j).comp[lyr::g_rgb]+Ltmp1(i,j).comp[lyr::b_rgb])/3.0;

}_1.push_back(c_bin1/(double)(H-10));_2.push_back(c_bin2/(double)(H-10));->allg4_profilX_left.push_back(c_bin1/(double)(H-10));->allg4_profilX_right.push_back(c_bin2/(double)(H-10));

}// конец цикла подсчёта среднего профиля по X

Form12->allg4_profilX_left.push_back(99999999);->allg4_profilX_right.push_back(99999999);right=100;(size_t x=0;x<vbin10_1.size()-right;++x) // расчёт дифференса между соседними изображениями

{sdifbin10=0;(size_t i=x;i<vbin10_1.size();++i)

{+=abs(vbin10_1[i]-vbin10_2[i-x]);

}/=(double)(vbin10_1.size()-x);_dif.push_back(sdifbin10);->allg4_differens.push_back(sdifbin10);

vdx.push_back(x);

}// конец расчёта дифференса между соседними изображениями

Form12->allg4_differens.push_back(99999999);_dif_mask.resize(vbin10_dif.size(),0);max=0;(size_t i=2;i<vbin10_dif_mask.size()-2;++i) // маска дифференса и поиск максимума

{_dif_mask[i]=abs(-vbin10_dif[i-2]+vbin10_dif[i]*2-vbin10_dif[i+2]);->allg4_differens_mask.push_back(vbin10_dif_mask[i]);(vbin10_dif_mask[i]>max)

{=vbin10_dif_mask[i];

x1=vdx[i];

}

}// конец расчёта маски дифференса и поиска максимума

Form12->allg4_differens_mask.push_back(99999999);

vpic.push_back(max);

// обработка маской для сшивки по вертикали

Mask5x5vert(Ltmp,VPP[k].L);x5vert(Ltmp1,VPP[k+1].L);.Binarization(VPP[k].L,Ltmp,7);.Binarization(VPP[k+1].L,Ltmp1,7);=VPP[k].LB;=VPP[k+1].LB;_t sumdif2;=x1;

y2=0;(size_t j=5;j<H-5;++j)// средний профиль по оси Y

{c_bin1=0,c_bin2=0;(size_t i=x2;i<(W-5);++i)

{_bin1+=(double)(Ltmp(i,j).comp[lyr::r_rgb]+(i,j).comp[lyr::g_rgb]+Ltmp(i,j).comp[lyr::b_rgb])/3.0;_bin2+=(double)(Ltmp1(i-x2+5,j).comp[lyr::r_rgb]+(i-x2+5,j).comp[lyr::g_rgb]+Ltmp1(i-x2+5,j).comp[lyr::b_rgb])/3.0;

}_1_y.push_back(c_bin1/(double)(W-5-x2));_2_y.push_back(c_bin2/(double)(W-5-x2));

}// конец расчёта среднего профиля по оси Ymin=99999999;(int x=0;x<5;++x)// расчёт дифференса при смещении картинок отнсительно друг друга вверх и вниз

{sdifbin10=0;sdifbin10_1=0;(size_t i=x;i<vbin10_1_y.size();++i)

{+=abs(vbin10_1_y[i]-vbin10_2_y[i-x]);_1+=abs(vbin10_1_y[i-x]-vbin10_2_y[i]);

}/=(double)(vbin10_1_y.size()-x);_1/=(double)(vbin10_1_y.size()-x);_dif_up.push_back(sdifbin10);_dif_down.push_back(sdifbin10_1);_up.push_back(x);_down.push_back(-x);(sdifbin10<min)

{=sdifbin10;=x;

}(sdifbin10_1<min)

{=sdifbin10_1;=-x;

}

}// конец расчёта дифференса при смещении картинок отнсительно друг друга вверх и вниз

vdeltax.push_back(x2);.push_back(y2);[k+1]->Left=VPan[k]->Left+x2;[k+1]->Top=VPan[k]->Top+y2;[k+1]->Refresh();->Refresh();

++ProgressBar1->Position;->Refresh();

}// конец цикла по x_idxmid=0;_t count=0;mid_y=0;_t count_y=0;(size_t i=0;i<vdeltax.size();++i)

{(vpic[i]>0.011)

{+=vdeltax[i];

++count;_y+=vdeltay[i];

++count_y;

}

}(count==0)++count;(count_y==0)++count_y;/=static_cast<double>(count);_y/=static_cast<double>(count_y);_t n=ColCount;(size_t i=0;i<vpic.size();++i)

{(Vfixed[n*y_idx+i])

{;

}(vpic[i]<0.011)[n*y_idx+i+1]->Left=VPan[n*y_idx+i]->Left+mid;[n*y_idx+i+1]->Left=VPan[n*y_idx+i]->Left+vdeltax[i];

}

} // конец цикла по y_idx<int> vrowpart;.clear();(int y_idx=1;y_idx<RowCount;++y_idx)

{.clear();.push_back(ColCount*y_idx);(int x_idx=1;x_idx<=ColCount;++x_idx)

{(Vfixed[ColCount*y_idx+x_idx])

{;

}(VPP[ColCount*y_idx+x_idx-1].idxRight>1000)

{[ColCount*y_idx+x_idx-1]=true;

}(VPP[ColCount*y_idx+x_idx].StitchedLeft&&x_idx<ColCount).push_back(ColCount*y_idx+x_idx);

{xmax=0;idxT=VPP[vrowpart[0]].idxTop;(size_t i=0;i<vrowpart.size();++i)(VPP[vrowpart[i]].idxTop>idxT)

{=i;=VPP[vrowpart[i]].idxTop;

}

// сшивка по кадру<double> vbin101;<double> vbin102;<double> vdif;<double> vdif1;<double> vdif_mask;<int> vdx1;<int> vdx2;<int> vdy;_t idx=vrowpart[xmax]-ColCount;_t idx1=vrowpart[xmax];dTop=VPan[idx1]->Top;dLeft=VPan[idx1]->Left;=VPP[idx].L;=VPP[idx1].L;x5(VPP[idx].LB,Ltmp);x5(VPP[idx1].LB,Ltmp1);.Binarization(Ltmp,VPP[idx].LB,7);//7 порог.Binarization(Ltmp1,VPP[idx1].LB,7);//7max=0;(size_t k=0;k<451;k+=25)

{.clear();.clear();.clear();_mask.clear();.clear();.clear();(size_t i=5;i<(W-5);++i)

{c_bin1=0;(size_t j=H-5-50-k;j<H-5-k;++j)_bin1+=(double)(Ltmp(i,j).comp[lyr::r_rgb]+Ltmp(i,j).comp[lyr::g_rgb]+(i,j).comp[lyr::b_rgb])/3.0;.push_back(c_bin1/(double)(45));

}(size_t i=5;i<(W-5);++i)

{c_bin2=0;(size_t j=5;j<90;++j)_bin2+=(double)(Ltmp1(i,j).comp[lyr::r_rgb]+Ltmp1(i,j).comp[lyr::g_rgb]+(i,j).comp[lyr::b_rgb])/3.0;.push_back(c_bin2/(double)(45));

}(int x=0;x<vbin101.size()-150;++x)

{sdifbin10=0;sdifbin10_1=0;(size_t i=x;i<vbin101.size();++i)

{+=abs(vbin101[i]-vbin102[i-x]);_1+=abs(vbin101[i-x]-vbin102[i]);

}/=(double)(vbin101.size()-x);_1/=(double)(vbin101.size()-x);.push_back(sdifbin10);.push_back(sdifbin10_1);.push_back(x);.push_back(-x);

}_mask.resize(vdif.size(),0);(size_t i=3;i<vdif_mask.size()-3;++i)

{t=abs(-vdif[i-3]+vdif[i]*2-vdif[i+3]);t1=abs(-vdif1[i-3]+vdif1[i]*2-vdif1[i+3]);(t>max)

{=t;=0;=vdx1[i];_mask[i]=t;

}(t1>max)

{=t1;=0;=vdx2[i];_mask[i]=t1;

}

}

}=x1;=y1;.clear();.clear();.clear();.clear();_mask.clear();.clear();.clear();.reserve(100);.reserve(100);.reserve(100);.reserve(100);_mask.reserve(100);.reserve(100);.reserve(100);=VPP[idx].L;=VPP[idx1].L;x5vert(VPP[idx].LB,Ltmp);x5vert(VPP[idx1].LB,Ltmp1);.Binarization(Ltmp,VPP[idx].LB,7);//7 порог.Binarization(Ltmp1,VPP[idx1].LB,7);//7

if(x1>=0)(size_t j=H/4;j<H-5;++j)// средний профиль по оси Y

{c_bin1=0,c_bin2=0;(size_t i=x1;i<(W-5);++i)

{_bin1+=(double)(Ltmp(i,j).comp[lyr::r_rgb]+Ltmp(i,j).comp[lyr::g_rgb]+(i,j).comp[lyr::b_rgb])/3.0;_bin2+=(double)(Ltmp1(i-x1+5,j-H/4+5).comp[lyr::r_rgb]+(i-x1+5,j-H/4+5).comp[lyr::g_rgb]+Ltmp1(i-x1+5,j-H/4+5).comp[lyr::b_rgb])/3.0;

}.push_back(c_bin1/(double)(W-5-x1));.push_back(c_bin2/(double)(W-5-x1));

}// конец расчёта среднего профиля по оси Y(size_t j=H/4;j<H-5;++j)// средний профиль по оси Y

{c_bin1=0,c_bin2=0;(size_t i=5;i<(W-5)+x1;++i)_bin1+=(double)(Ltmp(i,j).comp[lyr::r_rgb]+Ltmp(i,j).comp[lyr::g_rgb]+(i,j).comp[lyr::b_rgb])/3.0;_bin2+=(double)(Ltmp1(i-x1,j-H/4+5).comp[lyr::r_rgb]+(i-x1,j-H/4+5).comp[lyr::g_rgb]+Ltmp1(i-x1,j-H/4+5).comp[lyr::b_rgb])/3.0;

}.push_back(c_bin1/(double)(W-10+x1));.push_back(c_bin2/(double)(W-10+x1));

}// конец расчёта среднего профиля по оси Y

for(size_t x=0;x<vbin101.size()-20;++x)// дифференс

{sdifbin10=0;(size_t i=x;i<vbin101.size();++i)+=abs(vbin101[i]-vbin102[i-x]);/=(double)(vbin101.size()-x);.push_back(sdifbin10);.push_back(x+H/4-5);

}// конец расчёта дифференса_mask.resize(vdif.size(),0);=-100;(size_t i=3;i<vdif_mask.size()-3;++i)// маска и поиск максимума

{t=abs(-vdif[i-3]+vdif[i]*2-vdif[i+3]);_mask[i]=abs(-vdif[i-3]+vdif[i]*2-vdif[i+3]);(t>max)

{=t;_mask[i]=t;=vdy[i];

}

} // конец поиска максимума_t sumdif2;

vdeltax.push_back(x2);.push_back(y2);.push_back(max);[idx1]->Left=VPan[idx]->Left+x2;[idx1]->Top=VPan[idx]->Top+y2;=VPan[idx1]->Top;=VPan[idx1]->Left-dLeft;(int i=0;i<xmax;++i)

{[vrowpart[i]]->Top=VPan[vrowpart[i]]->Top-dTop;[vrowpart[i]]->Left=VPan[vrowpart[i]]->Left+dLeft;

}(int i=xmax+1;i<vrowpart.size();++i)

{[vrowpart[i]]->Top=VPan[vrowpart[i]]->Top-dTop;[vrowpart[i]]->Left=VPan[vrowpart[i]]->Left+dLeft;

}

//конец сшивки по кадру.clear();

vrowpart.push_back(ColCount*y_idx+x_idx);

}

}

}check=Vfixed[0];t1=GetTime();

Form1->Caption="Создание панорамных изображений Время работы алгоритма №4 = "+(t1-t);

}

Похожие работы на - Разработка методов совмещения фрагментов и инструментария на примере формирования панорамных изображений медицинских микроскопических препаратов

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!