Главная страница
Навигация по странице:

  • 2.1. Выбор оптимального инструментария для разработки

  • 2.2. Разработка логической схемы и реализация алгоритма 2.2.1. Форма поиска файлов

  • Элемент Меню «Файл» - подменю «Закрыть»

  • 2.2.2. Форма преобразования изображений

  • Кнопка « Преобразование »

  • Меню «Файл» Элемент Меню «Файл» - подменю «Параметры страницы»

  • Элемент Меню «Файл» - подменю «Вывод на печать»

  • 2.2.3. Реализация алгоритмов интерполяции

  • Выводы к главе II

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

  • ВКР Красковой Н.И. Краскова Надежда Иннокентьевна


    Скачать 1.02 Mb.
    НазваниеКраскова Надежда Иннокентьевна
    Дата17.03.2023
    Размер1.02 Mb.
    Формат файлаdoc
    Имя файлаВКР Красковой Н.И.doc
    ТипАнализ
    #997961
    страница3 из 3
    1   2   3

    ГЛАВА 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:

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


    Заключение

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

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


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

    1. Визильтер Ю.В., Желтов С.Ю., Князь В. А. и др. Обработка и анализ цифровых изображений с примерами на LabVIEW и IMAQ Vision: [учебный курс]. - М. : ДМК Пресс, 2007. 464 с

    2. Гонсалес Р. Цифровая обработка изображений. - М.:Диалог-МИФИ, 2005

    3. Гонсалес Р., Вудс Р. Цифровая обработка изображений. – М.: Техносфера, 2006

    4. Грузман И.С., Киричук В.С. Цифровая обработка изображений в информационных системах: Учебное пособие. - Новосибирск, НГТУ, 2002

    5. Насонов А., Крылов А., Лукин А., Увеличение разрешения изображения с использованием метода нрегуляризации Тихонова, материалы международной конференции "Тихонов и современная математика", Москва, 2006

    6. Петровский А.И. Adobe Photoshop 6.0: трюки в дизайне изображения. - М.: 2001

    7. Прэтт У. Цифровая обработка изображений. - М.: Мир, 2004. Кн. 1 и 2

    8. Ратушняк А. методы сжатия данных. - М.: Диалог-МИФИ, 2002

    9. Тихонов А.Н, Арсенин В.Я. Методы решения некорректных задач. - М.: Наука, 1979

    10. Яне Б. Цифровая обработка изображений. - М.: Мир, 2007

    11. Lukin A., Krylov A., Nasonov A., Image Interpolation by Super-Resolution, труды конференции "Графикон-2006", стр. 239-242

    12. http://comrssion.graphicon.ru/

    13. http://imaging.cs.msu.ru

    14. http://ru.wikipedia.org/wiki/Билинейная_интерполяция

    15. http://ru.wikipedia.org/wiki/Бикубическая_интерполяция

    16. http://www.cambridgeincolour.com/ru/tutorials/image-interpolation.htm

    17. http://forum.graphicon.ru/viewtopic.php?f=8&t=2901

    18. http://images.cambridgeincolour.com/...tion_temp1.png

    19. http://graphicon.ru/oldgr/ru/publications/

    20. http://balbesof.net/info/photoshop_map.html

    21. http://photoshop.demiart.ru/

    22. http://www.photoshop-master.ru/articles.php?rub=19





    1   2   3


    написать администратору сайта