Понимаете ли вы принцип кодирования Хаффмана ?
Проще говоря, это алгоритм, используемый для сжатия данных (как изображения в вашем случае). Это означает, что ввод алгоритма является изображением, а вывод - числовым кодом, который меньше по размеру, чем ввод: следовательно, сжатие.
Принцип кодирования Хаффмана заключается в (приблизительно) замене символов в исходных данных (в вашем случае это значение каждого пикселя изображения) числовым кодом, который присваивается в соответствии с вероятностью символа. Наиболее вероятный (то есть наиболее распространенный) символ будет заменен более короткими кодами для осуществления сжатия данных.
Чтобы решить вашу проблему, Matlab имеет две функции в панели инструментов связи: huffmandict
и huffmanenco
.
huffmandict
: эта функция создает словарь, который используется для перевода символов из исходных данных в их числовые кодовые слова Хаффмана. Для построения этого словаря huffmandict
необходим список символов, используемых в данных, и вероятность их появления, представляющая собой количество времени их использования, деленное на общее количество символов в ваших данных.
huffmanenco
: эта функция используется для перевода ваших исходных данных с использованием словаря, созданного huffmandict
. Каждый символ в исходных данных переводится в числовой код Хаффмана. Чтобы измерить выигрыш в размере этого метода сжатия, вы можете вычислить коэффициент сжатия, который является отношением между количеством битов, используемых для описания ваших исходных данных, и количеством битов соответствующего кода Хаффмана. В вашем случае, исходя из ваших вычислений степени сжатия, вы получаете изображение 8 на 8, используя 8-битное целое число для описания каждого пикселя, а соответствующий код Хаффмана использует length(comp)
бит.
Имея все это в виду, вы можете прочитать свой код следующим образом:
% Original image
A = ...
[99 99 99 99 99 99 99 99 ...
20 20 20 20 20 20 20 20 ...
0 0 0 0 0 0 0 0 ...
0 0 50 50 50 50 0 0 ...
0 0 50 50 50 50 0 0 ...
0 0 50 50 50 50 0 0 ...
0 0 50 50 50 50 0 0 ...
0 0 0 0 0 0 0 0];
% First step: extract the symbols used in the original image
% and their probability (number of occurences / number of total symbols)
symbols=[0 20 50 99];
p=[32 8 16 8];
p=p/sum(p);
% To do this you could also use the following which automatically extracts
% the symbols and their probability
[symbols,p]=hist(A,unique(A));
p=p/sum(p);
% Second step: build the Huffman dictionary
[dict,avglen]=huffmandict(symbols,p);
% Third step: encode your original image with the dictionary you just built
comp=huffmanenco(A,dict);
% Finally you can compute the compression ratio
ratio=(8*8*8)/length(comp)