Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР по сжатию.doc
Скачиваний:
7
Добавлен:
29.08.2019
Размер:
226.82 Кб
Скачать
  1. Практическая часть

Варианты заданий приведены в Приложении 1.

Пункты 6-9 задания являются факультативными.

Порядок выполнения задания:

  1. Провести «вручную» сжатие 2-х фрагментов данных методом группового кодирования. Сравнить полученные коэффициенты сжатия.

  2. Провести «вручную» сжатие 2-х фрагментов данных методом LZW. Сравнить полученные коэффициенты сжатия.

  3. Провести «вручную» сжатие 2-х фрагментов данных c применением кодов Хаффмана. Сравнить полученные коэффициенты сжатия.

  4. Провести «вручную» сжатие фрагмента данных c применением алгоритмов RLE, LZW и кодов Хаффмана. Описать полученные результаты и сделать соответствующие выводы.

  5. Реализовать алгоритм 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 не требуется.

  1. Создать динамическую библиотеку с процедурой CompressImage, реализующую алгоритм группового кодирования (RLE) согласно блок-схеме на рис. 2. Инструкции приведены в Приложении 2.

  2. Запустить основную программу RLE.exe. Выполнить сжатие изображения Image1.bmp , выбрав пункт меню Файл/Сжать изображение. При успешном завершении процедуры на экране появляется диалоговое окно с указанием коэффициента сжатия и в основной директории создается соответствующий файл Image1.rle;

  3. Визуально проверить качество сжатия, открыв изображение командой меню Файл/Открыть сжатое изображение: если процедура сжатия была реализована корректно, то в окне программы можно наблюдать осмысленное изображение. В противном случае необходимо корректировать процедуру;

  4. Выполнить сжатие изображения Image2.bmp и Image3.bmp. Сравнить коэффициенты сжатия изображений Image1.bmp, Image2.bmp и Image3.bmp. Объяснить полученные результаты.

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

Приложение 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

Данные для кодирования:

  1. bbbbbbbccccccbbcaaaaaaabbbccccaaaaaaabbbbbaaaaadddddddddaaaadd

  2. cbcbbbbcdccddaddabbddccaaaccddddccbbbaaadddddbbbbcacccddaabb

  3. aaaaaccccaaccccbbccccccccfffffffffffffssssssssaaaaaabbbbbcccbbbbbffbbbb

  4. ccccccbbaaccaddcdacdbcadcdadaaaddacaccadaabbbacadcccadbcbbbcbcbd

  1. baaccbccbcabaccabbaabaaabcc

  2. babaabbaabbaaabbbaaaaa

  3. abbabbabaabbabbbba

  4. aaacbcbbbbcccbbbcacc

  1. dcafbfbabggbceffgggfhhhgghhhefffsffaabbabchhabffccaf

  2. faaadddddbbbccbaffbbbaabbabbbabbfcadcbfababadddab

  3. gdadafghggfghababahbagggabcdcdcahhggaghhhgacagca

  4. bbffdddedffdfdccdcadcddddacacacccaccaccadccfcc

  1. abaacadbbaaaaadcda

  2. aacaddddccdbbaaaaad

  3. bbbacadbccadcbaaadcda

  4. abaaabbccdabaacadb

  1. 250-257, 200-207

  2. 290-297, 170-177

  3. 50-57, 60-67

  4. 150-157, 141-148

  5. 220-227, 300-307

  6. 121-128, 145-152

  7. 122-129, 146-153

  8. 123-130, 147-154

  9. 140-147, 170-177

  10. 123-130, 296-303

Приложение 2. Инструкции по выполнению пп. 6-9 задания.

Программная реализация алгоритма сжатия RLE в виде процедуры (функции) может быть выполнена на любом доступном языке высокого уровня, таком как Pascal (в среде Delphi) или C++ (в средах Воrland Builder или Microsoft Visual), однако следует учитывать, что при вызове процедуры в основной программе используется т.н. «паскалевское»(__stdcall) соглашение о передаче параметров.

Процедура входит в динамическую библиотеку (DLL), которая подключается к основной программе. Взаимодействие происходит по следующей схеме:

  1. основная программа RLE.exe загружает исходный файл изображения и динамическую библиотеку в оперативную память;

  2. из динамической библиотеки вызывается функция CompressImage c четырьмя параметрами:

- pInBuf – массив исходных данных;

  • pOutBuf – массив сжатых данных;

  • nInSize – размер входных данных;

  • nOutSize – размер сжатых данных.

Функция реализует алгоритм и формирует массив сжатых данных;

  1. Основная программа компонует новый файл изображения и записывает его на “жесткий” диск.

Ниже приведён пример шаблона реализации в среде программирования 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.

19

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]