Морфинг – преобразование изображений

Автор: Иаиа Аиа, 10 Июня 2010 в 13:20, дипломная работа

Описание работы

Технология создания морфинга изображений в Delphi
Морфинг — это видеоэффект, заключающийся в плавном перетекании одного изображения в другое. Иногда морфингом называют эффект наплыва, когда одна сцена затемняется или затуманивается, а вторая в это время проявляется все резче и сменяет первую. Однако лучше разделять эти понятия. В отличие от наплыва, морфинг обеспечивает соответствие характерных (наиболее привлекающих внимание) точек и контуров начального и конечного изображений. Например, преобразование одного лица в другое, при котором задается соответствие положения характерных точек глаз, носа и т.д.

Работа содержит 1 файл

Диплом2.doc

— 563.50 Кб (Скачать)

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

     Сплайны применяются для решения двух следующих задач: по заданному массиву  опорных точек на плоскости необходимо построить кривую, проходящую либо через все эти точки - задача интерполяции, либо вблизи этих точек — задача сглаживания. Для решения этих задач используются различные методы, например, задачу интерполяции используют многочлен Лагранжа. К его достоинствам относят простоту описания и точность прохождения через вес точки, к недостаткам то, что степень многочлена Лагранжа лишь на единицу меньше числа заданных точек, также изменение координат одной точки требует полного пересчета коэффициентов интерполяционного многочлена и существенно влияет на вид задаваемой им кривой. Интерполяционную кривую можно построить с помощью кусочно-линейной интерполяции, т.е. путем последовательного соединения точек заданного набора отрезками прямых, результате будет ломаная линия, но полученная таким образом кусочно-линейная функция не обладает нужной гладкостью и не может быть использована для создания контуров объектов даже при большом наборе опорных точек. Для оптимального решения задачи интерполяции необходимо использовать так называемый полиномиальный многозвенник, который сочетает преимущества двух рассмотренных выше способов: для интерполяции используются многочлены фиксированной степени, интерполяция производится последовательно — звено за звеном. При этом важно правильно выбрать степени интерполяционных многочленов, а также коэффициенты многочленов для выполнения условия гладкого сопряжения соседних узлов. Полученные в результате интерполяции функции называются сплайн-функциями или просто сплайнами.

     

     Рис. 5 Сплайн, составленный двух из кривых Безье 

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

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

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

     Обычно в программах используются четыре типа вершин:

  • Corner (С изломом) — вершина, примыкающие сегменты к которой не имеют кривизны;
  • Smooth (Сглаженная) — вершина, через которую кривая сплайна проводится с изгибом и имеет одинаковую кривизну сегментов с обеих сторон от нее;
  • Bezier (Безье) — вершина, подобная сглаженной, но позволяющая управлять кривизной сегментов сплайна с обеих сторон от этой вершины: для этого вершина снабжается касательным отрезком с маркерами, перемещая маркеры касательных отрезков вокруг вершины, можно изменять направления, по которым сегменты сплайна входят в вершину и выходят из нее, а изменяя расстояние от маркера до вершины — регулировать кривизну сегментов сплайна;
  • Bezier Corner (Безье с изломом)— вершина, которая, как и вершина типа Bezier, снабжена касательным вектором, но у вершин Bezier Corner (Безье с изломом) касательные не связаны друг с другом отрезком, и маркеры можно перемещать независимо.

 

Глава 2. Технология создания морфинга изображений в Delphi

    2.1. Описание интерфейса программы

 
 

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

    

    Рис.6 Схема структуры программы: 1. исходное изображение; 2 конечное изображение; 3 получаемый клип морфинга; 4 кнопки управления. 

      Для отображения изображений  используется компонента Image (ImageA, ImageB), при этом загружаемое изображение должно быть в формате *.jpg или *.jpeg и размером 240х240 пикселей, в программе данная компонента также используется для отображения конечного результата (Image3). Для изменения оттенков изображений используется изменение яркости, контрастности и гаммы (насыщает цвета). Изображение загружается с помощью компоненты OpenDialog и из базы данных. Для определения координат сетки используется компонента Shape, с помощью данной компоненты координаты узлов сетки задаются в виде матрицы для начального и конечного изображений (Shape1_2; Shape1_3; Shape1_4; Shape1_5; Shape1_6; Shape1_7; Shape1_8; …… Shape9_2; Shape9_3; Shape9_4; Shape9_5; Shape9_6; Shape9_7; Shape9_8). Для показа статуса обработанных кадров используется компонента StatusBar. Для управления процессами морфинга используются компоненты SpeedButton («Начать», «Остановить»). Чтобы изображения сменяли друг друга более плавно в программе используется динамическое распределение памяти и компонента Timer. 

    2.2. Реализация программы.

2.2.1. Описание базы  данных.

 
 

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

    

    Рис. 7 Схема базы данных: 1 таблица; 2 пример изображения; 3 кнопки управления. 

    База  данных создается в окне «Добавить  запись», которое описывается в Unit 3, оно появляется при нажатии кнопки «Добавить запись», с помощь процедуры: 

         procedure TForm2.Button1Click(Sender: TObject);

         begin

         form3.show;

         end; 

    Для введения названия паре (изображения  и матрицы) используется компонента Edit1, в строку «картинка» (Edit2) вводится путь к изображению, он выбирается с помощью кнопки «…» (Button2) и процедуры: 

         procedure TForm3.Button2Click(Sender: TObject); 

    К изображению выбирается готовая матрица, для этого в строку «карта» (Edit3), путь к ней указывается с помощью кнопки «…» (Button3) и процедуры: 

         procedure TForm3.Button3Click(Sender: TObject); 

    Затем изображение с матрицей загружается  в базу данных, при нажатии на кнопку «Добавить» (Button1) и с помощью процедуры: 

         procedure TForm3.Button1Click(Sender: TObject); 

    Записывается  база данных в таблицу (DBGrid), из четырех полей: первое поле-это ключ, второе-название, третье – выбранное изображение, четвертое – выбранная матрица, с помощью процедуры: 

         procedure TForm2.FormCreate(Sender: TObject); 

    Удаляется значение с помощью кнопки «Удалить запись» (Button3) и с помощью процедуры: 

         procedure TForm2.Button3Click(Sender: TObject);

         begin

         Table1.Delete;

         end; 

    Изображение с матрицей устанавливаются в  программу из базы данных с помощью  кнопки «Установить» (Button2) и с помощью процедуры: 

         procedure TForm2.Button2Click(Sender: TObject);

         begin

         if Form1.OprBase='1' then begin

             form1.Pict1:=Table1.Fields[2].AsString;

             form1.Map1:=Table1.Fields[3].AsString;

             end else begin

             form1.Pict2:=Table1.Fields[2].AsString;

             form1.Map2:=Table1.Fields[3].AsString;

             end;

             Form1.Show;

         end; 

    Перед загрузкой изображение отображается в Image1.

 

    2.2.2. Описание «Конструктора для создания морфинга».

 
 

    Помимо  базы данных изображение можно загрузить  из файла с помощью кнопки «Выбрать изображение» (SpeedButton), изображение загружается в формате *.jpg и размером 240х240 пикселей, с помощью процедур: 

         procedure TForm1.LoadAClick(Sender: TObject);

         procedure LoadJpg(path:string;where:TBitmap); 

    После загрузки на изображения необходимо «обнулить матрицу» (SpeedBatton),с помощью процедуры: 

         procedure TForm1.ButReinitAClick(Sender: TObject); 

    При «обнулении» матрицы прорисовываются линии сетки, при помощи процедуры: 

         procedure tab_bool_drawline(x1,y1,x2,y2:integer); 

    После «обнуления» матрицы, изначально массив матрицы выставляется во временные  переменные: 

         AssignFile(myFile,path);

           FileMode := fmOpenRead;

           Reset(myFile, 1);

           BlockRead(myFile, byteArray, 81, count);

           BlockRead(myFile, byteArray2, 81, count);

           CloseFile(myFile); 

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

         count := 1;

           for i:=1 to 9 do begin

             for j:= 1 to 9 do begin

               LesPointsA_x[i,j,ab] := byteArray[count];

               LesPointsA_y[i,j,ab] := byteArray2[count];

               count := count+1; 

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

         procedure ReShape;

         var

           i,x,y,ab:integer; s:string;

           leshape : TShape;

         begin

           for i := 0 to application.Components[1].ComponentCount-1 do begin

             if (application.Components[1].Components[i].ClassName = 'TShape') then begin

               leshape := TShape(application.Components[1].Components[i]);

               s := leshape.Name; 

                ab := 1; if StrUtils.MidStr(s,5,1) = 'f' then ab := 2;

               x :=  strtoint(StrUtils.MidStr(s,8,1));

               y :=  strtoint(StrUtils.MidStr(s,6,1)); 

               leshape.Left := LesPointsA_x[x,y,ab];

               leshape.top := LesPointsA_y[x,y,ab];

             end;

           end;

         end; 

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

         Point_lines(ImageA,OrigBmpA,1);

         Point_lines(ImageB,OrigBmpB,2); 

    Процедура tab_bool_drawline прорисовывает искажение сетки для каждого кадра.

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

         procedure tab_bool_fill();

         var

           i,j,imax : integer;

           ism,ismn : boolean;

         begin

           imax :=0;

Информация о работе Морфинг – преобразование изображений