Автор: Пользователь скрыл имя, 26 Февраля 2013 в 20:51, дипломная работа
Комп’ютерна графіка — це двовимірні зображення, які створюються, перетворюються, оцифровуються, обробляються і відображаються засобами обчислювальної техніки, включаючи апаратні і програмні засоби. Рухома комп'ютерна графіка називається комп’ютерним відео або комп’ютерною анімацією.
ВСТУП……………………………………………………………...……………5
РОЗДІЛ 1 ТЕОРЕТИЧНА ЧАСТИНА ………………………………………...6
1.1 Комп'ютерна графіка……………………………………….….6
1.2 Растрова графіка……………………………………………….7
1.3 Векторна графіка………………………………….………….13
1.4 Формати графічних файлів …………………………………17
1.5 Алгоритми масштабування………………………………….18
1.5.1 EPX/Scale2x/AdvMAME2x…………………...……..21
1.5.2 Eagle Eagle………………………….……………..….22
1.5.3 2xSaI…………………………….………………….…23
1.5.4 Сімейство hqnx………………………………………23
1.5.5 Алгоритм в Паскалі………………………………….24
1.5.6 Алгоритм Копф-Ліщинський……………………….24
1.5.7 Застосування в емуляторах ігрових приставок……24
РОЗДІЛ 2 ПРАКТИЧНА ЧАСТИНА…………………………………………26
2.1 Програма в роботі………………………………………….…26
ВИСНОВКИ........................................................................................................33
ПЕРЕЛІК ВИКОРИСТАНИХ ДЖЕРЕЛ………………………………...……34
ДОДАТОК…………………………
Оберемо наступні характеристики:
1. коефіцієнт викривлення палітри - обчислюється як відношення різниці кількості кольорів вихідної і модифікованої палітри до кількості кольорів вихідної;
2. коефіцієнт викривлення пікселів - попіксельне порівняння двох зображень, у результаті якого знаходимо відсоток пікселів, що не збігаються;
3 .ступінь деформації зображення - проводиться контурний аналіз зображення, виділяються межі об'єктів і порівнюються безпосередньо межі (аналізується форма), результат - відсоток викривлення форми.
Для порівняння обрані алгоритми інтерполяції методом найближчого сусіда, білінійна інтерполяція, бікубічна інтерполяція, фільтр Ланцоша. Масштабування застосовувалося до зображення розміром 500х500 пікселів. Воно було зменшено в 4 рази, а потім відновлено різними алгоритмами. Приклад показаний на рис. 3, а також на таблиці 2.
Рис. 3 – а) оригінальне зображення; б) зменшене зображення; в) збільшення алгоритмом найближчого сусіда; г) збільшення з використання білінійної інтерполяції; д) збільшення з використанням бікубічної інтерполяції; е) використання фільтра Ланцоша
|
Коефіцієнт викривлення палітри |
Коефіцієнт викривлення пікселів |
Ступінь деформації зображення |
Інтерполяція методом найближчего сусіда |
0.3 |
1.6 |
2.4 |
Білінійна інтерполяція |
1.8 |
1.48 |
1.7 |
Бікубічна інтерполяція |
1.3 |
1.3 |
1.3 |
Фільтр Ланцоша |
1.1 |
1.15 |
1.06 |
Таблиця 2 – Порівняння алгоритмів масштабування
Проаналізувавши алгоритми за чисельними характеристиками, масштабування фільтром Ланцоша призводить до збереження більшої інформативності в порівнянні з іншими методами.
Алгоритми
EPX/Scale2x/AdvMAME2x:
EPX («Eric's Pixel eXpansion», піксельний збільшення Еріка) - алгоритм, розроблений Еріком Джонстоном з LucasArts приблизно в 1992 році , при портуванні движка SCUMM з IBM PC (дозвіл 320 × 200, 256 квітів) на перші кольорові комп'ютери Macintosh, де дозвіл було вище приблизно удвічі.
Алгоритм працює наступним чином:
A - \ 1
C P B - / 3 4
D
Якщо C == A => 1 = A
Якщо A == B => 2 = B
Якщо B == D => 4 = D
Якщо D == C => 3 = C
Якщо 3 або більше пікселів з A, B, C, D однакові: 1 = P, 2 = P, 3 = P, 4 = P
Наступні реалізації цього алгоритму (такі як AdvMAME2x і Scale2x, розроблені приблизно в 2001 році) мають іншу (більш ефективну), але функціонально ідентичну, реалізацію:
A - \ 1
C P B - / 3 4
D
1 = P; 2 = P; 3 = P; 4 = P;
Якщо C == A і C! = D і A! = B => 1 = A
Якщо A == B і A! = C і B! = D => 2 = B
Якщо B == D і B! = A і D! = C => 4 = D
Якщо D == C і D! = B і C! = A => 3 = C
AdvMAME4x/Scale4x - це просто двічі застосований EPX.
Scale3x/AdvMAME3x:
Алгоритм AdvMAME3x/Scale3x - не те ж саме, що EPX, але вони досить схожі між собою:
A B C - \ 1 2 3
D E F> 4 5 6
G H I - / 7 8 9
1 = E; 2 = E; 3 = E; 4 = E; 5 = E; 6 = E; 7 = E; 8 = E; 9 = E;
Якщо D == B і D! = H і B! = F => 1 = D
Якщо (D == B і D! = H і B! = F і E! = C) або (B == F і B! = D і F! = H і E! = A) => 2 = B
Якщо B == F і B! = D і F! = H => 3 = F
Якщо (H == D і H! = F і D! = B і E! = A) або (D == B і D! = H і B! = F і E! = G) => 4 = D
5 = E
Якщо (B == F і B! = D і F! = H і E! = I) або (F == H і F! = B і H! = D і E! = C) => 6 = F
Якщо H == D і H! = F і D! = B => 7 = D
Якщо (F == H і F! = B і H! = D і E! = G) або (H == D і H! = F і D! = B і E! = I) => 8 = H
Якщо F == H і F! = B і H! = D => 9 = F
Eagle Eagle:
Eagle Eagle працює
таким чином: для кожного
Спочатку: | Потім:
. . . - \ CC | S T U - \ 1 лютого
. C. - / CC | V C W - / 3 4
. . . | X Y Z
| Якщо V == S == T => 1 = S
| Якщо T == U == W => 2 = U
| Якщо V == X == Y => 3 = X
| Якщо W == Z == Y => 4 = Z
Таким чином, одиночний чорний піксел на білому фоні при застосуванні даного алгоритму розчиниться. Ця помилка виправлена в алгоритмах 2xSaI і HQ3x.
2xSaI:
2xSaI, (2x Scale and Interpolation, дворазове збільшення і інтерполяція), є удосконаленням алгоритму Eagle. Був розроблений Дереком Ліау Кия Фа (Derek Liauw Kie Fa), також відомим як Kreed, спочатку для використання в емуляторах, де і понині є досить популярним алгоритмом. Багато популярних емулятори, такі як ZSNES, Jnes, DOSBox і VisualBoyAdvance, мають підтримку даного алгоритму виводу. Для використання алгоритму в не-GPL продуктах розробнику доведеться переписати його без використання коду, написаного Kreed.
Сімейство hqnx:
Максим Стьопін розробив алгоритми hq2x, hq3x і hq4x для збільшення в пропорціях 2:1, 3:1 і 4:1 відповідно. Колір кожного пікселя порівнюється з вісьмома сусідніми, сусіди позначаються як близькі й далекі, далі використовується пре-генерована таблиця для відшукання необхідного співвідношення значень для кожного з 4, 9 або 16 вихідних пікселів. Алгоритм hq3x відмінно згладжує діагональні лінії з нахилом ± 1:2, ± 1:1 і ± 2:1 (за умови відсутності антиалиасинга на вході алгоритму); лінії з іншим коефіцієнтом нахилу будуть представлені як ламані з вищезазначених діагональних. Добре згладжуються круті криві. На відміну від 2xSaI, до висновку застосовується антиалиасинг.
Зображення, збільшене в 3 рази методом найближчого сусіда
Зображення, отримане при використанні алгоритму hq3x.
Алгоритм в Паскалі:
При цьому перетворенні початок координат і напрямок осей старої і нової вісі координат однакова, але масштаб по осях різний.
Нехай відрізок одиничної довжини на вихідної вісі X стає відрізком довжини Sx на новій вісі Х ', а одиничний відрізок на колишній осі Y стає відрізком довжиною Sy на нової. Тоді точка (x, y) в колишній системі має координати (x * Sx, y * Sy) у новій системі. Перетворення масштабування виконуються за допомогою матриці масштабування.
Алгоритм Копф-Ліщинський:
Алгоритм розроблений в 2011 році і представлений на SIGGRAPH 2011. Перекладає піксельний зображення з невеликою кількістю квітів у векторну форму. Втім, якщо на зображенні є антіаліазінг, результати виходять гірше.
Застосування в емуляторах ігрових приставок:
На достатньо швидких комп'ютерах дані алгоритми дозволяють реалізувати висновок масштабованого зображення, за швидкістю прийнятний для додатків реального часу, зокрема, комп'ютерних ігор.
Високооптимізовані алгоритми дають чітку і різку картинку з мінімальним розмиттям. Алгоритми масштабування піксельної графіки були реалізовані для безлічі емуляторів, 2D-ігрових движків і движків для ігор-переробок, наприклад, для AdvanceMAME, DOSBox, і ScummVM. Вони отримали високу оцінку серед геймерів, які стали переробляти гри,
написані в 80-х і 90-х. В даний час такі фільтри використовуються в комерційних емуляторах Xbox Live, Virtual Console, і PSN для того, щоб класичні ігри низького дозволу краще виглядали на дисплеях високого дозволу. До таких ігор належать Sonic's Ultimate Genesis Collection, Castlevania: The Dracula X Chronicles, Castlevania: Symphony of the Night, і Akumajō Dracula X Chi no Rondo .
Розділ 2. ПРАКТИЧНА ЧАСТИНА
2.1 Програма в роботі
Створена програма, виконує масштабування зображення, за допомогою повзунків «масштаб в ширину на» та «масштаб в высоту на» ми можемо обрати необхіний відсоток для зменшення, або збільшення зображення.
Рис. 4 – Інтерфейс програми
Для початку роботи потрібно обрати в робочому меню вкладку «Файл» та натиснути «Открыть» і знайти необхідне зображення:
Рис. 5 – Пошук зображення
Обравши зображення, можна починати роботу з ним:
Рис. 6 – Робота з зображенням
При масштабуванні зображення ,знизу, можна побачити полосу виконання обробки:
Рис. 7 – Полоса прогресу виконання
Після налаштувань користувача, програма може зберегти зображення натиснув «Файл», а потім «Сохранить как» або Сохранить»:
Рис. 8 – Збереження зображення
Якщо результат не втішив користувача, то можна почати все спочатку шляхом натискання вкладки «Вернуть оригинал»:
Рис. 9 – Повернення оригіналу
Якщо ж не обрати зображення та вибрати функцію «Масштабировать», то програма виведе таке повідомленя:
Рис. 10 – Повідомлення про помилку
ВИСНОВКИ
Після виконання роботи, робимо висновки:
ПЕРЕЛІК ВИКОРИСТАНИХ ДЖЕРЕЛ
ДОДАТОК А
КОД ПРОГРАМИ
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtDlgs, Menus, ExtCtrls, Buttons, ComCtrls, StdCtrls, Gauges;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
OpenPictureDialog1: TOpenPictureDialog;
SavePictureDialog1: TSavePictureDialog;
N7: TMenuItem;
N8: TMenuItem;
ScrollBox1: TScrollBox;
Image1: TImage;
GroupBox1: TGroupBox;
Gauge1: TGauge;
ComboBox1: TComboBox;
ComboBox2: TComboBox;
StaticText1: TStaticText;
StaticText2: TStaticText;
StaticText3: TStaticText;
StaticText4: TStaticText;
procedure N2Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i,j,k,n: Longint;
ColCount, t: integer;
Filename,s: string;
BM: TBitmap;
dx,dy: real;
implementation
{$R *.dfm}
procedure Interpolate(var bm: TBitMap; dx, dy: single);
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
Form1.Image1.AutoSize:=False;
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)-t;
yo := trunc(y / dy)-t;
x1 := round(xo * dx)+t;
y1 := round(yo * dy)+t;
Информация о работе Розробка програми для масштабувания зображення