Matlab 如何正确应用哈夫曼编码?

Matlab 如何正确应用哈夫曼编码?,matlab,Matlab,我将量化后的锯齿函数应用于一个图像块,我想计算这个块的哈夫曼编码。我知道输入参数必须是向量,并且应该计算直方图 我编写了以下代码,但似乎不起作用: [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(

我将量化后的锯齿函数应用于一个图像块,我想计算这个块的哈夫曼编码。我知道输入参数必须是向量,并且应该计算直方图

我编写了以下代码,但似乎不起作用:

[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文件中的一个编写函数。它将矩阵转换为向量,从而消除长的零序列。

在matlab中,符号向量(函数的第一个参数)必须都是唯一的值。此符号向量是在数据中看到的所有可能符号的列表,您希望对这些符号进行编码/压缩。因此,如果存在重复的符号,那么列出要遇到的所有符号是没有意义的。这很像一本单词词典,在这本词典中看到同一个单词两次是没有意义的。函数的第二个参数是序列中每个符号的相关出现概率

使用
huffmandict
,您要做的是为哈夫曼编码创建一个字典,其中包含编码/解码时遇到的所有可能的唯一的符号及其相关概率。因此,通过检查代码,您需要提取箱子位置以及使用时发生的概率。本质上,您需要调用两元素输出版本的
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
假设您正在输入图像数据,但情况并非如此。相反,尝试使用Instead来计算发生的频率。因此,只需将代码修改为:

[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);

查找向量中的唯一值,以便我们可以将其用作计算频率的容器。这也算出了数据中所有可能的符号。

它仍然给出了一个错误:提供的哈夫曼字典没有所有输入信号的代码。@matlabuser在正常图像上执行此操作对我来说是可行的。这意味着您的输入或
fun1
有问题。这是我用于普通图像的代码。我使用了MATLAB路径中的
cameraman.tif
:im=im2double(imread('cameraman.tif');[计数,x]=imhist(im);计数=计数/单位(im);[dict1,avglen]=赫夫曼迪克特(x,计数)@matlabuser-哦!你接受了我的回答!你是怎么修复的?还是没用..我正在实施一个压缩方案,这一步是在quantization@matlabuser-显示什么是
fun1
。编辑你的帖子。另外,我没有
zigzag
功能。这是一个新的MATLAB函数,还是你自己写的?我知道Z字形排序的作用。如果您显示的是
fun1
的样子,那么我可以尝试重建您的错误。fun1是一个向量。键入
numel(unique(fun1))
并告诉我结果是什么。我在工作空间中看到147,我将编辑我的帖子。