ВКР Красковой Н.И. Краскова Надежда Иннокентьевна
Скачать 1.02 Mb.
|
ГЛАВА II. ПРОЕКТНАЯ ЧАСТЬ. ОПИСАНИЕ ТЕХНОЛОГИИ ВЫПОЛНЕНИЯ РАБОТЫ2.1. Выбор оптимального инструментария для разработки В этом параграфе описываются основные использованные компоненты, их работа: Форма поиска файлов включает компоненты: MainMenu:TMainMenu Рис. 2. Окно конструктора меню Form2 – формы поиска изображений С помощью компонента MainMenu я создаю иерархическое меню. В Меню «Файл» Подменю «Открыть» открывает диалоговое окно для открытия изображений. Подменю «Выйти» закрывает форму и работа программы заканчивается. Меню «Справка» находится небольшое руководство по пользованию. OpenPictureDialog: TOpenPictureDialog begin if OpenPictureDialog1.Execute() then begin //открытие изображения через OpenFileDialog form3.hint:=OpenPictureDialog1.FileName; form3.ShowModal; end; end; Рис. 3. Диалоговое окно для открытия изображения OpenPictureDialog Компонент OpenPictureDialog вызывает диалоговое окно открытия файла. С помощью этого окна пользователь может выбрать изображения для преобразовывания из указонного пути, может установить тип файлов (их расширение). ImageList: TImageList. Набор рисунков. Представляет собой хранилище для нескольких рисунков одинакового размера. TreeView: TTreeView. Дерево выбора. Представляет собой совокупность связанных в древовидную структуру пиктограмм. Используется для просмотра структуры каталогов, связанных иерархическим образом. С помощью этого компонента я провожу просмотр структуры каталогов, которые связаны иерархически. ListView: TListView. Панель пиктограмм. Организует просмотр нескольких пиктограмм и выбор нужной. Компонент способен располагать пиктограммы в вертикальных или горизонтальных рядах и показывать их в крупном или мелком масштабе. С помощью этого компонента устанавливаю панель, где будут отображаться миниатюры изображений. FileListBox: TFileListBox Форма преобразования изображений включает компоненты: MainMenu: TMainMenu Рис. 4. Окно конструктора меню Form3 – формы преобразования изображений С помощью компонента MainMenu я создаю иерархическое меню. В Меню «Файл» подменю «Сохранить» открывает диалоговое окно для сохранения изображений, подменю «Печать» открывает диалоговое окно для печати, подменю «Параметры страницы» открывает диалоговое окно, которое показывает параметры страницы для печати. В меню операции есть подменю «Преобразовать», которое выполняет операцию преобразования изображений по выбранному методу интерполяции. SavePictureDialog: TSavePictureDialog if savepicturedialog1.Execute then begin bitmap:=image1.Picture.Bitmap; //выбор типа сохранения case RadioGroup1.ItemIndex of //jpg 0: begin SaveBitmapToJPG(bitmap,savepictureDialog1.FileName+'.jpg'); end; //gif 1: begin SaveBitmapToGif(bitmap,savepictureDialog1.FileName+'.gif'); end; Рис.5. Диалоговое окно сохранения изображения SavePictureDialog Компонент SavePictureDialog вызывает диалоговое окно сохранения. В нем пользователь может указать имя сохраняемого файла, путь куда он сохраняет изображение, в каком формате он это сделает. PrintDialog: TPrintDialog //Печать изображения with Printer do begin BeginDoc; koef:=image1.Picture.Height/image1.Picture.Width; Canvas.StretchDraw(Rect(0,0,PageWidth,Round(PageWidth*koef)), Image1.Picture.Graphic); EndDoc; end; Рис.6. Диалоговое окно для печати изображения PrintDialog Компонент PrintDialog вызывает диалоговое окно печати. В нем пользователь может выбрать принтер и установить его свойства, указать число копий и последователъность их печати, печатать в файл или непосредственно на принтер. PageSetupDialog:TPageSetupDialog begin PageSetupDialog1.Execute; end; Компонент PageSetupDialog вызывает диалоговое окно параметров страницы перед выводом на печать файла. Image: TImage Panel: TPanel 2.2. Разработка логической схемы и реализация алгоритма 2.2.1. Форма поиска файлов … //построение дерева вложенных папок procedure NextLevel(ParentNode: TTreeNode); function DirectoryName(name: string): boolean; begin result := (name > '.') and (name > '..'); end; var sr, srChild: TSearchRec; node: TTreeNode; path: string; begin node := ParentNode; path := ''; //построение полного пути к выбранной директории repeat path := node.Text + '\' + path; node := node.Parent; until node = nil; //поиск файлов if FindFirst(path + '*.*', faDirectory, sr) = 0 then begin repeat //если директории if (sr.Attr and faDirectory > 0) and DirectoryName(sr.name) then begin //добавляем дочерний узел node := Form2.TreeView1.Items.AddChild(ParentNode, sr.name); //присвоение номер иконки node.ImageIndex := 0; //устанавливает выделение на первую ветвь node.SelectedIndex := 1; //отключает очерние элементы node.HasChildren := false; //ищет следующие папки if FindFirst(path + sr.name + '\*.*', faDirectory, srChild) = 0 then begin //цикл для поиска всех вложенных repeat if (srChild.Attr and faDirectory > 0) and DirectoryName(srChild.name) then node.HasChildren := true; until (FindNext(srChild) > 0) or node.HasChildren; end; FindClose(srChild); end; until FindNext(sr) > 0; end else ParentNode.HasChildren := false; // закрытие поиска FindClose(sr); end; … Рис.7. Форма поиска. Отображение структуры каталогов В левой стороне отображается дерево вложенных папок – каталог данных. //добавление миниатюр файлов в ListView for i := 0 to FileListBox1.Items.Count - 1 do begin try bitmap:=TBitmap.Create; //открытие файла в bitmap bitmap:=ExtToBmp(path+'\'+FileListBox1.Items[i]); //установка размеров dx:=ImageList2.Width/bitmap.Width; dy:=ImageList2.Height/bitmap.Height; //уменьшение до миниатюры bitmap:=interpolate(bitmap,dx,dy); //добавление нового пункта item:=listview1.Items.Add; //установка заголвока item.Caption:=FileListBox1.Items[i]; //установка иконки из списка изображений item.ImageIndex:=ImageList2.Add(bitmap,nil); except bitmap.Free; end; end; … Рис.9. Форма поиска. Отображение миниатюр изображений В результате на правой стороне формы отображаются миниатюры изображений для выбора. Двойным щелчком выбирается изображение и следующим шагом открывается вторая форма – форма преобразования изображения. Форма поиска является основной формой, появляется при запуске .exe-файла. Основной функцией этой формы является поиск файлов (изображений). Элемент Меню «Файл» - подменю «Открыть» …. begin if OpenPictureDialog1.Execute() then begin //открытие изображения через OpenFileDialog form3.hint:=OpenPictureDialog1.FileName; form3.ShowModal; end; Реализуется открытие файла через компонент OpenFileDialog. Элемент Меню «Файл» - подменю «Закрыть» procedure TForm3.N4Click(Sender: TObject); begin close; Производится закрытие формы поиска – всей оболочки. Меню «Справка» procedure TForm2.N7Click(Sender: TObject); begin panel1.Visible:=true; end; Рис.7. Справка. Руководство по пользованию В меню «Справка» дается краткое руководство по пользованию, чтобы пользователь мог быстро и правильно применить данную программу. 2.2.2. Форма преобразования изображений Рис.10. Форма преобразования. Отображение указанного изображения Форма преобразования изображений визуально разделена на две части. В левой стороне скомпонованы: две рабочие кнопки («Преобразование» и «Сохранить») группа – выбор «Тип интерполяции» (между билинейной и бикубической) группа – выбор расширения изображения (.jpg, . giv, .png, .bmp) группа – изменение данных исходного разрешения и опция сохранения пропорций изображения группа – отображение данных исходного разрешения изображения. В правой части отображается изображение, которое преобразовывается. Для этого использован компонент Image (рисунок) для отображения изображений. Кнопка «Преобразование» Фрагмент кода: procedure TForm3.Button1Click(Sender: TObject); var bm,bm1: TBitmap; path,ext: string; i,width,height,new_width,new_height: integer; dx,dy: single; begin … //билинейная 0: bm:=interpolate(bm, new_width/width,new_height/height); //бикубическая 1: begin bm1.Width:=new_width; bm1.Height:=new_height; //растягивание изображения Unit4.deletescansrect(bm,bm1,bm.Canvas.ClipRect,bm1.Canvas.ClipRect); //обработка бикубическим алгоритмом bm:=Bicubic(bm1); end; end; image1.Picture.Assign(bm); label5.Caption:= inttostr(image1.picture.width); label6.Caption:= inttostr(image1.picture.Height); end; end; … end; end; Рис.11. Кнопка «Преобразовать» Свойство этой кнопки – преобразовывать выделенное изображение по одному из алгоритмов повышения разрешения: билинейной или бикубичекой интерполяции. Кнопка «Сохранить» Фрагмент кода: … begin if savepicturedialog1.Execute then begin bitmap:=image1.Picture.Bitmap; //выбор типа сохранения case RadioGroup1.ItemIndex of //jpg 0: begin SaveBitmapToJPG(bitmap,savepictureDialog1.FileName+'.jpg'); end; //gif 1: begin SaveBitmapToGif(bitmap,savepictureDialog1.FileName+'.gif'); end; //png 2: begin SaveBitmapToPNG(bitmap,savepictureDialog1.FileName+'.png'); end; //bmp 3: begin image1.Picture.SaveToFile(savepictureDialog1.FileName+'.bmp'); … Рис.12. Кнопка «Сохранить» Кнопка «Сохранить» сохраняет измененные параметры по указанному пути. При сохранении преобразованного изображения, можно выбрать с каким расширением его сохранить. //выбор типа сохранения case RadioGroup1.ItemIndex of //jpg 0: begin SaveBitmapToJPG(bitmap,savepictureDialog1.FileName+'.jpg'); end; //gif 1: begin SaveBitmapToGif(bitmap,savepictureDialog1.FileName+'.gif'); end; //png 2: begin SaveBitmapToPNG(bitmap,savepictureDialog1.FileName+'.png'); end; //bmp 3: begin image1.Picture.SaveToFile(savepictureDialog1.FileName+'.bmp'); end; Фрагмент кода выбора типа интерполяции: … //выбор типа интерполяции case RadioGroup2.ItemIndex of //билинейная 0: bm:=interpolate(bm, new_width/width,new_height/height); //бикубическая 1: begin bm1.Width:=new_width; bm1.Height:=new_height; … Выполняется выбор типа интерполяции, с помощью RadioGroup - группы зависимых переключателей. Он содержит специальные свойства для обслуживания нескольких связанных между собой зависимых переключателей. Меню «Файл» Элемент Меню «Файл» - подменю «Параметры страницы» procedure TForm3.N10Click(Sender: TObject); begin PageSetupDialog1.Execute; end; Вызывает диалоговое окно «Параметры страницы» через компонент PageSetupDialog. Элемент Меню «Файл» - подменю «Вывод на печать» procedure TForm3.N9Click(Sender: TObject); var relheight, relwidth: integer; koef: real; begin if printDialog1.Execute then begin //Печать изображения with Printer do begin BeginDoc; koef:=image1.Picture.Height/image1.Picture.Width; Canvas.StretchDraw(Rect(0,0,PageWidth,Round(PageWidth*koef)), Image1.Picture.Graphic); … Вызывает диалоговое окно «Печать» через компонент PrintDialog. Элемент Меню «Файл» - подменю «Закрыть» procedure TForm3.N4Click(Sender: TObject); begin close; end; Процедура закрывает форму «Преобразования изображений». 2.2.3. Реализация алгоритмов интерполяции Фрагмент кода алгоритма билинейной интерполяции: function interpolate(bm: tbitmap; dx, dy: single):TBitmap; var bm1: tbitmap; z1, z2: single; k, k1, k2: single; x1, y1: integer; c: array [0..1, 0..1, 0..2] of byte; res: array [0..2] of byte; x, y: integer; xp, yp: integer; xo, yo: integer; col: integer; pix: tcolor; begin bm1 := tbitmap.create; bm1.width := round(bm.width * dx); bm1.height := round(bm.height * dy); for y := 0 to bm1.height - 1 do begin for x := 0 to bm1.width - 1 do begin xo := trunc(x / dx); yo := trunc(y / dy); x1 := round(xo * dx); y1 := round(yo * dy); for yp := 0 to 1 do for xp := 0 to 1 do begin pix := bm.canvas.pixels[xo + xp, yo + yp]; c[xp, yp, 0] := getrvalue(pix); c[xp, yp, 1] := getgvalue(pix); c[xp, yp, 2] := getbvalue(pix); end; for col := 0 to 2 do begin k1 := (c[1,0,col] - c[0,0,col]) / dx; z1 := x * k1 + c[0,0,col] - x1 * k1; k2 := (c[1,1,col] - c[0,1,col]) / dx; z2 := x * k2 + c[0,1,col] - x1 * k2; k := (z2 - z1) / dy; res[col] := round(y * k + z1 - y1 * k); end; bm1.canvas.pixels[x,y] := rgb(res[0], res[1], res[2]); end; Form3.Caption := IntToStr(round(100 * y / bm1.Height)) + '%'; Application.ProcessMessages; if Application.Terminated then Exit; end; bm := bm1; interpolate:=bm1; end; … Изображение рассматривается как поверхность, цвет - третье измерение. Если изображение цветное, то интерполяция проводится отдельно для трех цветов. Для каждой точки нового изображения с координатами (xo,yo) нужно найти четыре ближайшие точки исходного изображения. Эти точки образуют квадрат. Через две верхние точки проводится прямая f1(x), через две нижние - f2(x). Дальше находятся координаты для точек f1(xo) и f2(xo), через которые проводится третья прямая f3(y). Цвет искомой точки - это f3(yo). Этот алгоритм хорошо работает при целых или больших коэффициентах увеличения. Но резкие границы размываются. Для уменьшения изображения этот алгоритм также не подходит. Фрагмент кода алгоритма бикубической интерполяции: … Begin bmp1:=TBitmap.Create; bmp1.Width:=bmp.Width;bmp1.Height:=bmp.height; //------------------------------------------------------------------------ For j:=0 to bmp.Height do //Преобразование только по горизонтали begin For i:=0 to Round(bmp.Width/2) do begin i_new:=(i*2); //по номеру пикселя i в новом (формируемом) изображении находим номер i_new в исходном изображении dx:=0.5;//Это смещение (сдвиг) весовой функции R:=0; G:=0; B:=0; s:=0; For k:=-1 to 2 do//яркость пикселя с номером i равна сумме яркостей этого пикселя, соседа слева и двух соседей справа, умноженных на весовые коэффициенты Begin S:=i_new+k;//Это просто для удобства If s<0 then s:=0; If s>bmp.Width-1 then s:=bmp.Width-1; R:=R+GetRValue(bmp.Canvas.Pixels[(s),j])*fR(k-dx); G:=G+GetGValue(bmp.Canvas.Pixels[(s),j])*fR(k-dx); B:=B+GetBValue(bmp.Canvas.Pixels[(s),j])*fR(k-dx); If R>255 then R:=255; If R<0 then R:=0; If G>255 then G:=255; If G<0 then G:=0; If B>255 then B:=255; If B<0 then B:=0; End; //В выходном изображении дублируем каждый второй столбец bmp1.Canvas.Pixels[i*2,j]:=RGB(Round(R),Round(G),Round(B)); bmp1.Canvas.Pixels[i*2+1,j]:=RGB(Round(R),Round(G),Round(B)); end;{For i} Form3.Caption := IntToStr(round(100 * j/ bmp.Height)) + '%'; Application.ProcessMessages; if Application.Terminated then Exit; end; … Яркость пикселя нового изображения находится как сумма яркостей соответствующего пикселя старого изображения и трех его соседей (один сосед слева и два - справа), умноженных на значения весовой функции. Чтобы новое изображение не сжималось по горизонтали в два раза, я его расширяла методом ближайшего соседа - три строки в конце подпрограммы. Экспериментальным путем подобраны коэффициенты весовой функции. Если разрешить использовать подобранные коэффициенты, то бикубическая интерполяция получается максимально похожей как в Фотошопе. Выводы к главе II: В этой главе приведено общее описание технологии выполнения разработки. В первом параграфе главы приведены описания инструментария для разработки, основных использованных компонентов. Во втором параграфе главы построена логическая схема разрабатываемого продукта – пошаговое описание технологии выполнения. Заключение Могу сказать, что поставленная передо мной цель – разработка программного продукта для реализации задачи повышения разрешающей способности изображений, выполнена. Задачи, решаемые в процессе достижения цели, тоже в полной мере реализованы. Рассмотрены основные методы и алгоритмы повышения разрешающей способности изображений. Выделены и использованы приемлемые подходы для разработки программного обеспечения, то есть достаточно простые, быстрые и обеспечивающие качественное повышение. Выполнена поэтапная программная реализация выбранного алгоритма повышения разрешающей способности изображений. И в итоге получена работающая программа, которая преобразует изображения, повышая их разрешение. И напоследок, программа имеет перспективы для дальнейшей доработки. Возможно, например, добавление функций для устранения некоторых, возникающих недостатков, так называемых артефактов, в результате интерполяции, в частности, если изображение будет увеличено во много раз: сглаживание, подавление эффекта Гиббса, повышение резкости в сильно размытых изображениях. Список использованной литературы Визильтер Ю.В., Желтов С.Ю., Князь В. А. и др. Обработка и анализ цифровых изображений с примерами на LabVIEW и IMAQ Vision: [учебный курс]. - М. : ДМК Пресс, 2007. 464 с Гонсалес Р. Цифровая обработка изображений. - М.:Диалог-МИФИ, 2005 Гонсалес Р., Вудс Р. Цифровая обработка изображений. – М.: Техносфера, 2006 Грузман И.С., Киричук В.С. Цифровая обработка изображений в информационных системах: Учебное пособие. - Новосибирск, НГТУ, 2002 Насонов А., Крылов А., Лукин А., Увеличение разрешения изображения с использованием метода нрегуляризации Тихонова, материалы международной конференции "Тихонов и современная математика", Москва, 2006 Петровский А.И. Adobe Photoshop 6.0: трюки в дизайне изображения. - М.: 2001 Прэтт У. Цифровая обработка изображений. - М.: Мир, 2004. Кн. 1 и 2 Ратушняк А. методы сжатия данных. - М.: Диалог-МИФИ, 2002 Тихонов А.Н, Арсенин В.Я. Методы решения некорректных задач. - М.: Наука, 1979 Яне Б. Цифровая обработка изображений. - М.: Мир, 2007 Lukin A., Krylov A., Nasonov A., Image Interpolation by Super-Resolution, труды конференции "Графикон-2006", стр. 239-242 http://comrssion.graphicon.ru/ http://imaging.cs.msu.ru http://ru.wikipedia.org/wiki/Билинейная_интерполяция http://ru.wikipedia.org/wiki/Бикубическая_интерполяция http://www.cambridgeincolour.com/ru/tutorials/image-interpolation.htm http://forum.graphicon.ru/viewtopic.php?f=8&t=2901 http://images.cambridgeincolour.com/...tion_temp1.png http://graphicon.ru/oldgr/ru/publications/ http://balbesof.net/info/photoshop_map.html http://photoshop.demiart.ru/ http://www.photoshop-master.ru/articles.php?rub=19 0>0>0>0> |