2014-12-10 2 views
0

Я применил функцию зигзага после квантования к блоку изображения, и я хочу вычислить кодировку Хаффмана этого блока. Я понимаю, что входной аргумент должен быть вектором и что гистограмма должна быть рассчитана.Как правильно применить кодировку Хаффмана?

Я написал следующий код, но это не похоже на работу:

[M N]=size(yce); 
fun1=zigzag(yce); 
count1 = imhist(fun1); 
p1 = count1/ numel(fun1); 
[dict1,avglen1]=huffmandict(count1,p1); 
comp1= huffmanenco(fun1,dict1); 
Im1 = huffmandeco(comp1,dict1); 

я получаю следующее сообщение об ошибке с помощью функции huffmandict:

Error in project at 65 
[dict1,avglen1]=huffmandict(count1,p1); 
Source symbols repeat. 

zigzag.m письменное функция в matlab file.it преобразует матрицу в вектор, тем самым исключая длинные последовательности нулей.

+0

Я знаю, что делает зигзагообразный заказ. Было бы полезно, если бы вы отображали, что такое 'fun1', поэтому я могу попытаться восстановить вашу ошибку. – rayryeng

+0

fun1 - это вектор. <1x6400 double> – matlabuser

+0

Введите 'numel (unique (fun1))' и скажите мне, какой результат. – rayryeng

ответ

1

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 находит эти уникальные ценности, которые находятся в вашем векторе, так что мы можем использовать их в качестве контейнеров для расчета наших частот. Это также определяет все возможные символы, замеченные в данных.

+0

он по-прежнему дает ошибку: словарь Хаффмана не содержит кодов для всех входных сигналов. – matlabuser

+0

@matlabuser Выполнение этого на нормальном изображении сработало для меня. Это означает, что у вас что-то не так с вашим вкладом или что-то «fun1». Это был код, который я использовал для обычного изображения. Я использовал 'cameraman.tif' путь MATLAB:' im = im2double (imread ('cameraman.tif')); [counts, x] = imhist (im); counts = counts/numel (im); [dict1, avglen] = huffmandict (x, counts); ' – rayryeng

+0

@matlabuser - о! Вы приняли мой ответ! Как ты это починил? – rayryeng

Смежные вопросы