Для написання програми було обрано мову програмування Delphi 7.0, тому що вона містить всі необхідні компоненти для створення віконних додатків, а також багато модулів для роботи із зображеннями.
Рисунок 3.1 - Загальна структура програми.
3.2 Розробка алгоритму основної програми
Розробимо схему алгоритму основної програми, в якій будемо використовувати функції, приведені нижче у розділі:
Рисунок 3.2- Схема алгоритму основної програми
Рисунок 3.2- Продовження схеми алгоритму основної програми
У тому числі, для завантаження нашого зображення ми можемо скористуватися стандартним класом TBitmap, який дозволяє одразу преобразувати. bmp-зображення у матричний вид. При цьому всі параметри зображення зберігаються у відповідних масивах та змінних класу, які ми потім зможемо використовувати для проведення квантування та кодування зображення. Натомість, ми запропонуємо алгоритм, який одразу буде завантажувати зображення із преобразуванням його у 256 градацій сірого відтінку (див. пункт 3.5):
Відповідно до особливостей представлення чорно-білих зображень (256 градацій сірого кольору), кожен піксель такого зображення має відповідати рівню яскравості кольору початкового зображення. Тобто для того, щоб ми змогли перетворити кольорове зображення, нам потрібно порахувати яскравість кожного пікселю зображення, та задати колір відповідної RGB-складної як рівень яскравості попереднього пікселю (нагадаємо, що у чорно-білому зображенні усі компоненти RGB мають однакове значення).
Рівень яскравості кожного пікселя розраховується по формулі
Lij = (30 * Rij + 59 * Gij + 11 * Bij) div 100 (3.1)
Таким чином, кожному пікселю початкового зображення потрібно змінити значення на отримане за формулою (3.1), що приведе до зміни картинки наступним чином:
Рисунок 3.3 Зміна кольору зображення на чорно-білий
Вектор яскравості (гистограмма):
(3.2)де n - кількість градацій яскравості в зображенні.
Компонента вектора яскравості - це кількість пикселей з даним значенням яскравості:
, k=1. n (3.3)На основі цих формул, ми можемо побудувати гістограму яскравостей по зображенню, яка буде заполнюватися наступним чином:
Побудувати масив з 256 елементів (кожен елемент якого відповідає одному рівню яскравості нашого зображення), кожен елемент спочатку дорівнює 0.
Заповнити масив наступним чином: взяти піксель зображення, який має координати в матриці [1,1], отримати його яскравість, значення яскравості - номер елемента нашого масива, додати до цього елемента масива 1, перейти до наступного пікселя зображення.
Таким чином, ми отримаємо гістограму яскравості нашого зображення.
Для початку, введемо умовні позначення, для спрощення орієнтування у функції GetMedian:
Вхідні дані: GisYar - масив гістограми яскравостей зображення, a1 - початковий елемент відрізку, на якому буде виконуватися квантування яскравостей, a2 - кінцевий елемент відрізку, Koef - коефіцієнт ентропійності, отриманий на основі методу, викладеного у главі 2.2.4
Вихідні дані: Elem - номер елементу масиву, який буде пороговим значенням (тобто відрізок початкового масив GisYar [a1; a2] буде поделено елементом Elem на 2 кластери)
Тимчасові дані: MasTemp - масив довжиною (a2-a1), кожним елементом якого буде сума попередніх його елементів, Sum - проміжна сума.
Рисунок 3.4 - Алгоритм функції обчислення порогового значення.
Введемо умовні позначення процедури DelenieNa2:
Вхідні дані: a1 - початковий елемент відрізку масиву, на якому буде виконуватися процедура, a2 - кінцевий елемент відрізку, level - рівень глибини рекурсії, Maxlevel - максимальна глибина рекурсії для обранох кількості кольорів.
Тимчасові дані: Med - пороговий елементу масиву, отриманий в результаті виконання функції GetMedian, InfCrit - номер кольору нової палітри для зображення, Sootv - масив відповідностей (256 елементів, у який для кожного елементу буде заноситися значення номеру кванту, для якого потім ми отримаємо новий колір).
Рисунок 3.5 - Алгоритм рекурсивної процедури складення масиву відповідностей.
Введемо умовні позначення функції DecreaseColor, результатом якої стане стисле зображення:
Вхідні дані: bmpPicture - початкове зображення, OldColor - кількість кольорів у початковому зображенні (дорівнює 255), NewColor - кількість кольорів у стислому зображенні, GisYar - масив гістограми яскравостей зображення, Koef - коефіцієнт ентропійності.
Тимчасові дані: Maxlevel - максимальна глибина рекурсії для обранох кількості кольорів, InfCrit - номер кольору нової палітри для зображення, ColNew - масив довжиною NewColor, з новими значеннями яскравостей для отримання стислого зображення, TempMas - тимчасовий масив яскравостей, Sootv - масив відповідностей, TempSootv - тимчасовий масив відповідностей.
MasPos - масив позиції порогових значень.
Рисунок 3.6 - Алгоритм функції ентропійного кодування.
Рисунок 3.6 - продовження алгоритму функції.
Рисунок 3.6 - Продовження алгоритму функції
Компонент TForm
Хоча компонент TForm відсутній у палітрі компонентів, але все-таки має властиві для нього властивості, події.
Отже, компонент TForm це вікно у віконному додатку. Воно може бути мінімум одне, максимальне обмеження на кількість не накладається. Перше створене вікно в додатку автоматично стає головним. При закритті головного вікна додаток завершує свою роботу й займана їм пам'ять звільняється.
Якщо необхідно, щоб головне вікно форми автоматично не з'являлося на екрані, то в події OnCreate для цього вікна, або в програмі DPR до команди створення головного вікна необхідно вказати наступний рядок:
// Код DelphiApplication. ShowMainForm: =false;
У цій команді вказується, що в цьому додатку заборонене відображення головної форми (вікна). У цьому випадку програмістові потрібно самостійно викликати команду
// Код DelphiForm1. Show;
для відображення цього вікна. Тут Form1 - головне вікно додатка.
Даний метод може виявитися корисним для висновку запиту пароля на запуск програми. Саме це діалогове вікно потрібно показати користувачеві перед показом головного вікна, але не роблячи його головним вікном, тобто при закритті вікна уведення пароля, додаток не завершує свою роботу. І при уведенні невірного пароля можна без проблем завершити роботу програми командою
// Код DelphiForm1. Close;
Або дати команду завершення роботи додатка.
Як уже говорилося в попередніх уроках, кожний компонент у програмі, як і сама форма, має унікальне ім'я, зазначене у властивості Name. Заголовок вікна втримується у властивості Caption. По заголовку вікна користувач довідається про функціональне призначення програми або поточного вікна.
Крім заголовка у верхній частині вікна перебуває іконка й кнопки керування станом. За замовчуванням іконка така ж сама, як і іконка в проекті. Щоб перемінити іконку в поточному вікні необхідно в інспекторі об'єктів вибрати властивість Icon у якому вибрати відповідний файл-малюнок. Файл повинен бути з розширенням ICO.
Для того, щоб перемінити іконку в проекті, потрібно ввійти в меню "Project", далі "Options... ", на вкладці Application ви бачите поточний малюнок файлу проекту. Перемінити його можна кнопкою "Load Icon... ". Іконка проекту зберігається у файлі ресурсів з розширенням RES.
Властивість BorderStyle
bsDialog - У вікна немає іконки. Відображена тільки кнопка керування "Закрити". Розмір вікна постійний. Такий тип вікон застосовується найчастіше в діалогових вікнах, наприклад вікно запиту на збереження проекту, якщо ви намагаєтеся вийти з delphi не зробивши збереження.
bsNone - У вікна немає іконки, кнопок керування, заголовка. Розмір вікна постійний. Закрити таке вікно можна тільки програмно або за допомогою комбінації клавіш Alt+F4. Цей тип вікон застосовується в заставці при запуску програми. На вікні розташований компонент TImage, що містить малюнок.
bsSingle - У вікні присутнє іконка, є заголовок. Кнопки керування згорнути, розгорнути (відновити), закрити. Розмір вікна постійний.
bsSizeable - Тип вікна за замовчуванням. Має всі елементи, зазначені в попереднім значенні властивості плюс зміна розмірів вікна.