Практическая часть
Варианты заданий приведены в Приложении 1.
Пункты 6-9 задания являются факультативными.
Порядок выполнения задания:
Провести «вручную» сжатие 2-х фрагментов данных методом группового кодирования. Сравнить полученные коэффициенты сжатия.
Провести «вручную» сжатие 2-х фрагментов данных методом LZW. Сравнить полученные коэффициенты сжатия.
Провести «вручную» сжатие 2-х фрагментов данных c применением кодов Хаффмана. Сравнить полученные коэффициенты сжатия.
Провести «вручную» сжатие фрагмента данных c применением алгоритмов RLE, LZW и кодов Хаффмана. Описать полученные результаты и сделать соответствующие выводы.
Реализовать алгоритм JPEG в среде Mathcad и применить его для сжатия двух фрагментов изображения согласно варианту задания при q=2 для 1-го фрагмента и при q=2 и 7 для 2-го фрагмента.
Сравнить полученные коэффициенты сжатия и объяснить результаты. Сделать вывод о влиянии пиксельных значений исходных фрагментов изображения на эффективность сжатия.
Примечание:
Импорт в Mathcad-документ полутоновой матрицы цветного изображения Image1.bmp на диске C: осуществляется командой
M:=READBMP(“c:\Image1.bmp”).
Для выделения рабочего блока из общей матрицы изображения используйте функцию
IMG=submatrix(M,r1,r2,c1,c2),
при этом перевод блока в цветовую плоскость YUV не требуется.
Создать динамическую библиотеку с процедурой CompressImage, реализующую алгоритм группового кодирования (RLE) согласно блок-схеме на рис. 2. Инструкции приведены в Приложении 2.
Запустить основную программу RLE.exe. Выполнить сжатие изображения Image1.bmp , выбрав пункт меню Файл/Сжать изображение. При успешном завершении процедуры на экране появляется диалоговое окно с указанием коэффициента сжатия и в основной директории создается соответствующий файл Image1.rle;
Визуально проверить качество сжатия, открыв изображение командой меню Файл/Открыть сжатое изображение: если процедура сжатия была реализована корректно, то в окне программы можно наблюдать осмысленное изображение. В противном случае необходимо корректировать процедуру;
Выполнить сжатие изображения Image2.bmp и Image3.bmp. Сравнить коэффициенты сжатия изображений Image1.bmp, Image2.bmp и Image3.bmp. Объяснить полученные результаты.
Оформить отчет о проделанной работе, содержащий подробное решение всех пунктов задания и листинги программ.
Приложение 1. Варианты заданий.
Числа в таблице соответствуют номерам цепочек данных. В пунктах 17-26 данных для кодирования числа обозначают индексы строк и столбцов для выделения рабочего блока из общей матрицы изображения.
|
Номер задания |
||||
1 (RLE) |
2 (LZW) |
3 (Haffman) |
4 (все три метода) |
5 JPEG |
|
Вариант 1 |
1,2 |
5,6 |
9,10 |
13 |
17,22 |
Вариант 2 |
1,4 |
5,8 |
9,12 |
14 |
18,23 |
Вариант 3 |
3,2 |
7,6 |
11,10 |
15 |
19,24 |
Вариант 4 |
3,4 |
7,8 |
11,12 |
16 |
20,25 |
Вариант 5 |
1,2 |
5,8 |
11,10 |
16 |
21,26 |
Вариант 6 |
1,4 |
7,6 |
11,12 |
13 |
19,22 |
Вариант 7 |
3,2 |
7,8 |
9,10 |
14 |
20,23 |
Вариант 8 |
3,4 |
5,6 |
9,12 |
15 |
21,24 |
Вариант 9 |
1,2 |
7,8 |
9,10 |
15 |
17,25 |
Вариант 10 |
1,4 |
5,6 |
11,10 |
16 |
18,26 |
Данные для кодирования:
bbbbbbbccccccbbcaaaaaaabbbccccaaaaaaabbbbbaaaaadddddddddaaaadd
cbcbbbbcdccddaddabbddccaaaccddddccbbbaaadddddbbbbcacccddaabb
aaaaaccccaaccccbbccccccccfffffffffffffssssssssaaaaaabbbbbcccbbbbbffbbbb
ccccccbbaaccaddcdacdbcadcdadaaaddacaccadaabbbacadcccadbcbbbcbcbd
baaccbccbcabaccabbaabaaabcc
babaabbaabbaaabbbaaaaa
abbabbabaabbabbbba
aaacbcbbbbcccbbbcacc
dcafbfbabggbceffgggfhhhgghhhefffsffaabbabchhabffccaf
faaadddddbbbccbaffbbbaabbabbbabbfcadcbfababadddab
gdadafghggfghababahbagggabcdcdcahhggaghhhgacagca
bbffdddedffdfdccdcadcddddacacacccaccaccadccfcc
abaacadbbaaaaadcda
aacaddddccdbbaaaaad
bbbacadbccadcbaaadcda
abaaabbccdabaacadb
250-257, 200-207
290-297, 170-177
50-57, 60-67
150-157, 141-148
220-227, 300-307
121-128, 145-152
122-129, 146-153
123-130, 147-154
140-147, 170-177
123-130, 296-303
Приложение 2. Инструкции по выполнению пп. 6-9 задания.
Программная реализация алгоритма сжатия RLE в виде процедуры (функции) может быть выполнена на любом доступном языке высокого уровня, таком как Pascal (в среде Delphi) или C++ (в средах Воrland Builder или Microsoft Visual), однако следует учитывать, что при вызове процедуры в основной программе используется т.н. «паскалевское»(__stdcall) соглашение о передаче параметров.
Процедура входит в динамическую библиотеку (DLL), которая подключается к основной программе. Взаимодействие происходит по следующей схеме:
основная программа RLE.exe загружает исходный файл изображения и динамическую библиотеку в оперативную память;
из динамической библиотеки вызывается функция CompressImage c четырьмя параметрами:
- pInBuf – массив исходных данных;
pOutBuf – массив сжатых данных;
nInSize – размер входных данных;
nOutSize – размер сжатых данных.
Функция реализует алгоритм и формирует массив сжатых данных;
Основная программа компонует новый файл изображения и записывает его на “жесткий” диск.
Ниже приведён пример шаблона реализации в среде программирования Delphi:
создать новый проект с именем “RLE” c помощью мастера создания динамической библиотеки выбрав пункт меню Project/Add New Project/DLL Wizard;
добавить в проект файл Module1.pas, выбрав команду Project/Add to Project (шаблоны файлов RLE.dpr и Module1.pas см. ниже);
скомпилировать библиотеку RLE.dll и перенести её в каталог основной программы RLE.exe.
/////////////////////////////////////////////////////// Файл RLE.dpr /////////////////////////////////
library RLE;
uses
SysUtils,
Classes,
Module1 in 'Module1.pas'; {подключаем модуль файла Module1.pas}
exports
CompressImage name 'CompressImage '; {делаем функцию CompressImage экспортируемой }
begin
end.
/////////////////////////////////////////////////////// Файл Module1.pas /////////////////////////////////
unit Module1;
interface
type
TArray = array [0..9] of byte;
pArray = ^TArray; { объявляется тип указателя на массив элементов типа byte }
{ объявление процедуры CompressImage}
procedure CompressImage(pInBuf:pArray; pOutBuf:pArray; nInSize:longword; nOutSize:longword);
implementation
uses
Dialogs,
SysUtils;
{ определение процедуры CompressImage}
procedure CompressImage(pInBuf:pArray; pOutBuf:pArray; nInSize:longword; nOutSize:longword);
var
{ Здесь объявляются локальные переменные, например i: integer; Res: byte}
begin
{ Здесь размещается код алгоритма.
pInBuf – указатель на массив входных данных типа byte;
pOutBuf – указатель на массив выходных(сжатых) данных типа byte;
nInSize – размер входных данных, передаваемый процедуре ;
nOutSize – размер выходных данных, вычисляемый процедурой;
Индексация массивов начинается с нуля.
Обращение к i-элементу массива по указателю выполняется в виде pInBuf^[i].
Пример:
for i:=0 to (n-1) do
begin
pOutBuf ^[i+1] := pInBuf^[i];
end;
}
end;
end.