Matlab, сжатие изображений - PullRequest
       1

Matlab, сжатие изображений

3 голосов
/ 25 декабря 2011

Я не уверен, что это просит меня сделать в Matlab?что значит кодировать?в каком формате должен быть ответ?Может кто-нибудь помочь мне разобраться, пожалуйста?Закодируйте патч изображения 8x8 и распечатайте результаты

Я получил изображение 8X8

symbols=[0 20 50 99];
p=[32 8 16 8];
p = p/sum(p);
[dict, avglen] = huffmandict(symbols, p);
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];
comp=huffmanenco(A,dict);
ratio=(8*8*8)/length(comp)

1 Ответ

8 голосов
/ 26 декабря 2011

Понимаете ли вы принцип кодирования Хаффмана ?

Проще говоря, это алгоритм, используемый для сжатия данных (как изображения в вашем случае). Это означает, что ввод алгоритма является изображением, а вывод - числовым кодом, который меньше по размеру, чем ввод: следовательно, сжатие.

Принцип кодирования Хаффмана заключается в (приблизительно) замене символов в исходных данных (в вашем случае это значение каждого пикселя изображения) числовым кодом, который присваивается в соответствии с вероятностью символа. Наиболее вероятный (то есть наиболее распространенный) символ будет заменен более короткими кодами для осуществления сжатия данных.

Чтобы решить вашу проблему, 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)
...