Автор работы: Пользователь скрыл имя, 07 Сентября 2013 в 19:34, курсовая работа
Технико-экономический эффект от использования компрессии данных весьма многообразен, он обусловлен многими очевидными факторами. Так, при передаче данных компрессия позволяет разгрузить канал и, следовательно, повысить достоверность полученной информации, сократить время и/или снизить мощность и вес передающей аппаратуры. При регистрации изображений компрессия позволяет уменьшить необходимую емкость запоминающих устройств или улучшить использование существующих архивов данных, благодаря чему сокращаются расходы на хранение и поиск информации в архиве. При обработке данных на компьютере компрессия во многих случаях дает возможность сократить время обработки, при этом появляется возможность использования компьютера меньшей вычислительной мощности и т.д.
m0=m-1;
for n=1:Ncrop;
n0=n-1;
xmin=1+n0*Nblock;
ymin=1+m0*Nblock;
rect=[xmin, ymin, width, height];
block=imcrop(f,rect);
Tblock=T*(T*double(block))'; % 2D Transform
Tblock1=uint8(Tblock);
sig=reshape(Tblock1,8*8,1);
end;
end;
a=sig
2.5.3 Кодирование
- декодирование коэффициентов
2.5.3.1 Построение гистограммы распределения
Строится гистограмма
распределения коэффициентов
Рисунок 2.2 – гистограмма коэффициентов преобразования
haffman encoding-decoding
NN=2^8;
% Create probability of coef
for n=1:NN;
n0=n-1;
symbols(n)=n0; % 'symbol' is just a series 0,1,...,255
[an0,x]=find(a==n0); % an0=1 if a(x)=n0
frequence(n)=sum(an0);
end;
ss=sum(frequence);
frequence=frequence/ss; % 'prob' in huffmandict = frequence
%Plot coef appearance distribution
plot(symbols,frequence,'r')
grid on
axis tight
title('Probability of pixel code')
xlabel('8bit pixel code')
2.5.3.2 Построение словаря Хаффмана
Словарь Хаффмана позволяет закодировать коэффициенты преобразования кодами разной длины в зависимости от частоты появления в матрице преобразования. В MATLAB функция huffmandict позволяет построить словарь.
Create Huffman code dictionary for the image
[dict,avglen]=huffmandict(
% Show the Huffman code dictionary for the image
for n=1:NN;
y=size(dict{n,2});
sy(n)=y(2);
end;
symax=max(sy)
% Ajust the fprintf function in accordance with SYMAX to print the dictionary
for n=1:NN;
x=dict{n,1};
y=dict{n,2};
sy=size(y);
if sy(2)==1 fprintf('%4d %10d\n',x,y); end;
if sy(2)==2 fprintf('%4d %10d %3d\n',x,y(1),y(2)); end;
if sy(2)==3 fprintf('%4d %10d %3d %3d\n',x,y(1),y(2),y(3)); end;
if sy(2)==4 fprintf('%4d %10d %3d %3d %3d\n',x,y(1),y(2),y(3),y(4)); end;
if sy(2)==5 fprintf('%4d %10d %3d
%3d %3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==6 fprintf('%4d %10d %3d
%3d %3d %3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==7 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==8 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==9 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==10 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==11 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==12 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==13 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==14 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==15 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d %3d
%3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==16 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d %3d
%3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==17 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d %3d
%3d %3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==18 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d %3d
%3d %3d %3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==19 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==20 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==21 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d %3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==22 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d %3d
%3d\n',x,y(1),y(2),y(3),y(4),
if sy(2)==23 fprintf('%4d %10d %3d
%3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d %3d
%3d %3d %3d %3d %3d %3d %3d
%3d %3d\n',x,y(1),y(2),y(3),y(4),
end;
avglen
2.5.3.3 Кодирование – декодирование по Хаффману
Закодировать по Хаффману в MATLAB позволяет функция huffmanenco, зависящая от входного сигнала ( матрицы преобразования ) и словаря. На приемную сторону помимо закодированного сигнала передается словарь и алгоритм кодирования, по которому производится восстановление. Декодировать позволяет функция huffmandeco.
hcode = huffmanenco(sig,dict); % Encode the data.
dhsig = huffmandeco(hcode,dict); % Decode the code.
dhgreen=reshape(dhsig,8*8,1);
2.5.4 Отбрасывание коэффициентов преобразования
В соответствии со степенью сжатия происходит отбрасывание коэффициентов преобразования. Сначала коэффициенты преобразования упорядочиваются по возрастанию, а затем происходит замена отброшенных коэффициентов преобразования на 0. Количество отброшенных коэффициентов регулируется отношением nn.
TBresh = abs(reshape(dhgreen,8*8,1)); % преобразование матричного блока в вектор
RTBresh = sort(TBresh,'descend'); %– упорядочивание вектора по v
Threshold = RTBresh(K);
for m1=1:Nblock;
for n1=1:Nblock;
coef=Tblock(m1,n1);
if abs(coef)<Threshold
%coef=0;
%Tblock(m1,n1)=coef;
Tblock(m1,n1)=0;
end; % if
end; % n1
end; % m1
2.5.5 Декодирование
Декодирование выполняется с помощью обратного двумерного преобразования Уолша-Адамара.
J=Tblock;
Rblock=T'*(T'*J)'; % 2D Inverse Transform
2.5.6 Склеивание из блоков декодированного изображения
Здесь происходит соединение матрицы изображения из субматриц Tblock.
TRANSFORMED (RESTORED) IMAGE CONCATENATION FROM Tblocks (Rblocks)
if m==1 & n==1 Tf=J; Rf=R; end;
if m==1 & n>1 Tf=[Tf,J]; Rf=[Rf,R]; end; % row concat
if m==2 & n==1 Jrow=J; Rrow=R; end; % new row is started
if m>1 & n>1 Jrow=[Jrow,J]; Rrow=[Rrow,R]; end; % row concat
if m>2 & n==1 Tf=[Tf;Jrow]; Jrow=J; Rf=[Rf;Rrow]; Rrow=R; end;
if m==Mcrop & n==Ncrop Tf=[Tf;Jrow]; Rf=[Rf;Rrow]; end;
Результат кодирования камерамена представлен на рисунке 2.3.
Рисунок 2.3 – исходное и декодированное изображение
Данный результат говорит о том, что кодек изображения работает некорректно, т.к. восстановленное изображение не имеет ничего общего с исходным изображением. Вероятнее всего ошибка произошла в блоке склеивания изображений ( п. 2.5.6 ), т.к. восстановленное изображение напоминает блок изображения 8х8.
3 ОЦЕНКА ЭФФЕКТИВНОСТИ КОДЕКА ИЗОБРАЖЕНИЯ НА ОСНОВЕ КОДИРОВАНИЯ С ДИСКРЕТНЫМ ПРЕОБРАЗОВАНИЕМ И ЭНТРОПИЙНОГО КОДИРОВАНИЯ КОЭФФИЦИЕНТОВ ПРЕОБРАЗОВАНИЯ
Оценка эффективности кодека выполняется по единой методике и включает получение:
1. зависимости ошибок восстановления от степени сжатия
2. помехоустойчивости к шумам разного типа в канале передачи (AWGN / IMNOISE) как зависимостей СКО восстановления от ОСШ для этого типа шума
3. быстродействия (числа
операций на пиксель
4. объема кода кодека в терминах числа строк / бит в формате ASCII
3.1 Средний квадрат ошибки
Зависимость ошибок восстановления от степени сжатия оценивается с помощью среднего квадрата ошибок на пиксель изображения. Средний квадрат ошибок показывает отклонение яркости пикселей исходного изображения в восстановленном.
Зависимость ошибок восстановления
от степени сжатия представлена на
рисунке 3.1 для кодека с кодированием
с преобразованием Уолша-
Рисунок 3.1 - Зависимость ошибок восстановления от степени сжатия
Восстановленное изображение при степени сжатия dCR =.25
Рисунок 3.2 – восстановленное изображение при степени сжатия dCR =.25
Восстановленное изображение при степени сжатия dCR =1
Рисунок 3.3 – восстановленное изображение при степени сжатия dCR =1
Восстановленное изображение при степени сжатия dCR =5
Рисунок 3.4 – восстановленное изображение при степени сжатия dCR =5
Восстановленное изображение при степени сжатия dCR =10
Рисунок 3.5 – восстановленное изображение при степени сжатия dCR =10
Зависимость ошибок восстановления от степени сжатия представлена на рисунке 3.6.
Рисунок 3.6 - Зависимость ошибок восстановления при dCR =10
3.2 Помехоустойчивость
Воздействие шума на исходное и декодированное изображение изображение представленно на риунке 3.7.
f = imnoise(f0,'gaussian',0,
Рисунок 3.7 – воздействие шума при кодировании изображения
Зависимость ошибок восстановления при воздействии шума представлена на рисунке 3.8.
Рисунок 3.8 - зависимость ошибок восстановления при воздействии шума
3.3 Быстродействие
Быстродействие на ноутбуке ASUS K50C с параметрами CPU 1.2 GHz, RAM 2 GB составило 39.156 секунд. Быстродействие рассчитывалось при помощи функции tic tac в MATLAB.
Elapsed time is 39.156000 seconds.
3.4 Объём кода кодека
Длина кода кодека в строках
составила 163 строки.
Выводы
В первом разделе курсового
проекта были рассмотрены основные
методы кодирования изображений, в
частности рассмотрен метод кодирования
с преобразованием Уолша-
Во втором разделе в пакете MATLAB был разработан кодек программы на основе кодирования с преобразованием Уолша-Адамара и энтропийного кодирования коэффициентов преобразования по Хаффману. Преобразование позволяет перейти от уровней яркостей изображения к обобщенному пространственному спектру, что позволяет работать в частотной области изображения. В пространственном спектре можно наблюдать концентрацию энергии сигнала в области нижних пространственных частот изображения. Доля их вклада в сигнал максимальная. Это позволяет передавать не все коэффициенты преобразования, а только те, у которых наибольшая энергия. Коэффициенты преобразования с низкой энергетикой отбрасываются, а их значениям присваивается 0. Количество отброшенных коэффициентов влияет позволяет повысить степень сжатия изображения, но также влияет на качество восстановленного изображения, т.к. происходят потери данных при кодировании.
К сожалению, в ходе выполнения курсового проекта не удалось получить корректно работающий кодек изображения, т.к. восстановленное изображение не имеет ничего общего с исходным изображением. Вероятнее всего ошибка произошла в блоке склеивания изображений т.к. восстановленное изображение напоминает блок изображения 8х8.
В третьем разделе проведена оценка эффективности кодека изображений. Получена зависимость среднего квадрата ошибки от степени сжатия. Отклонение яркости повышается при повышении степени сжатия, что заметно на восстановленном изображении.
Так как в любом канале передачи присутствует шум, который влияет на передаваемую информацию, было смоделировано воздействие шума на исходное изображение, т.е. помехоустойчивость кодека. Исследовано его влияние при кодировании и на качество восстановления.
Важнейшим параметром работы кодека изображений является его быстродействие. Было рассчитано время, затрачиваемое кодеком на выполнение операций.
Также была оценена длина кода кодека в количестве строк.
СПИСОК ИСТОЧНИКОВ ИНФОРМАЦИИ