Huffman encoding function (huffmandict
) В MATLAB требуется, чтобы вектор символов (первый аргумент функции) должен быть уникальными значениями. Этот вектор символов представляет собой список всех возможных символов, которые видны в ваших данных, которые вы хотите кодировать/сжимать. Таким образом, было бы бессмысленно иметь список всех символов, которые будут встречаться, если есть дубликаты. Это очень похоже на словарь слов, где было бы бессмысленно видеть одно и то же слово дважды в этом словаре. Второй параметр функции - это связанные вероятности появления для каждого символа в вашей последовательности.
С huffmandict
, что вы делаете, вы создаете словарь для кодирования Хаффмана, который состоит из всех возможных уникальных символов, которые могут возникнуть при кодировании/декодирования, а также связанные с ними вероятностями. Поэтому, изучив свой код, вам необходимо извлечь оба места , а также вероятности возникновения при использовании imhist
. По сути, вам нужно вызвать двухэлементную выходную версию imhist
. Второй вывод imhist
дает вам список всех возможных интенсивностей/символов, которые встречались в данных, в то время как первый элемент дает вам частоту каждой из этих интенсивностей/символов в ваших данных. Затем вы можете нормализовать первый выходной элемент на общее количество символов/интенсивностей в ваших данных, чтобы получить вероятности (предполагая, что равновероятные встречи, конечно). Как только это будет завершено, вы будете использовать оба эти входа в качестве huffmandict
.
Другими словами, вам нужно изменить только две строки кода, таким образом:
[M N]=size(yce);
fun1=zigzag(yce);
[count1,x] = imhist(fun1); %// Change
p1 = count1/ numel(fun1);
[dict1,avglen1]=huffmandict(x,p1); %// Change
comp1= huffmanenco(fun1,dict1);
Im1 = huffmandeco(comp1,dict1);
Редактировать
Зная, как fun1
структурирована в настоящее время, не используйте imhist
. imhist
предполагает, что вы помещаете данные изображения, но это не выглядит так. Вместо этого попробуйте использовать histc
вместо этого, чтобы вычислить частоту возникновения. Таким образом, просто изменить код для этого:
[M N]=size(yce);
fun1=zigzag(yce);
bins = unique(fun1); %// Change
count1 = histc(fun1, bins); %// Change
p1 = count1/ numel(fun1);
[dict1,avglen1]=huffmandict(bins,p1); %// Change
comp1= huffmanenco(fun1,dict1);
Im1 = huffmandeco(comp1,dict1);
unique
находит эти уникальные ценности, которые находятся в вашем векторе, так что мы можем использовать их в качестве контейнеров для расчета наших частот. Это также определяет все возможные символы, замеченные в данных.
Я знаю, что делает зигзагообразный заказ. Было бы полезно, если бы вы отображали, что такое 'fun1', поэтому я могу попытаться восстановить вашу ошибку. – rayryeng
fun1 - это вектор. <1x6400 double> – matlabuser
Введите 'numel (unique (fun1))' и скажите мне, какой результат. – rayryeng