当前位置: 首页 > 知识库问答 >
问题:

基于MATLAB的哈夫曼编码的灰度图像压缩

微生令雪
2023-03-14

我试图在MATLAB中使用哈夫曼编码压缩灰度图像,并尝试了以下代码。

我使用了一个大小为512x512的灰度图像,格式为tif。我的问题是压缩图像的大小(压缩码字的长度)比未压缩图像的大小越来越大。压缩比小于1。

clc;
clear all;
A1 = imread('fig1.tif');
[M N]=size(A1);
A = A1(:);
count = [0:1:255]; % Distinct data symbols appearing in sig
total=sum(count);
for i=1:1:size((count)');                  
    p(i)=count(i)/total;
end

[dict,avglen]=huffmandict(count,p) % build the Huffman dictionary
comp= huffmanenco(A,dict);         %encode your original image with the dictionary you just built
compression_ratio= (512*512*8)/length(comp)   %computing the compression ratio

%% DECODING
Im = huffmandeco(comp,dict); % Decode the code
I11=uint8(Im);

decomp=reshape(I11,M,N);
imshow(decomp);

共有1个答案

潘文乐
2023-03-14

您的代码中有一个小错误。我假设您想计算遇到每个像素的概率,即归一化直方图。您没有正确计算它。具体来说:

count = [0:1:255]; % Distinct data symbols appearing in sig
total=sum(count);
for i=1:1:size((count)');                  
    p(i)=count(i)/total;
end

总计是对不正确的总和。你应该计算图像的概率分布。您应该改用imhist。因此,您应该这样做:

count = 0:255;
p = imhist(A1) / numel(A1);

这将正确计算图像的概率分布。记住,在进行哈夫曼编码时,需要指定遇到像素的概率。假设每个像素都有可能被选择,这可以通过计算图像的直方图来捕获,然后根据图像中的像素总数进行归一化。试试看,你是否能得到更好的结果。

然而,霍夫曼只会给你好的压缩比,如果你有频繁出现的符号。你有没有碰巧看看直方图或你图像中像素的分布?

如果排列相当大,每个箱子只有很少的条目,那么哈夫曼将不会为您节省任何压缩成本。事实上,它可能会给你一个更大的尺寸。请记住,TIFF压缩标准仅将哈夫曼作为算法的一部分。还进行了一些预处理和后处理,以进一步缩小尺寸。

再举一个例子,假设我有一个由以下内容组成的图像:[0,1,2,…255;0,1,2,…,255;0,1,2,…,255] 我有3行,但实际上可以是任意数量的行。这意味着遇到每个符号的概率是等概率的,或者说是1/255,这意味着对于每个符号,我们需要每个符号8位。。。这基本上就是原始像素值!

哈夫曼背后的关键是一组比特一起生成一个符号。频繁出现的符号被分配一个较小的位序列。因为我提到的这个特殊图像的强度是等概率的,所以每个强度只能生成一个符号,而不是一个组。这样,不仅可以传输字典,还可以有效地一次发送一个字符,这并不比发送原始字节流好多少。

如果你希望你的图像被原始霍夫曼压缩,像素的分布必须是倾斜的。例如,如果你的图像中的大部分强度是黑暗的,或者是明亮的。如果你的图像对比度很好,或者像素强度在整个图像中的传播是平坦的,那么霍夫曼不会给你任何压缩节省。

 类似资料:
  • 本文向大家介绍请你说一下哈夫曼编码?相关面试题,主要包含被问及请你说一下哈夫曼编码?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 哈夫曼编码是哈夫曼树的一种应用,广泛用于数据文件压缩。哈夫曼编码算法用字符在文件中出现的频率来建立使用0,1表示个字符的最优表示方式,其具体算法如下: (1)哈夫曼算法以自底向上的方式构造表示最优前缀码的二叉树T。 (2)算法以|C|个叶结点开始,执行|C|-

  • 赫夫曼树 路径和路径长度:表示树从根节点开始到达节点经过的次数,若一颗树根节点为1层,那么第K层的树的路径的长度为K-1 权: 赋予每一个节点上面特定的权重值 带权路径:带权路径等于节点的权与路径长度的乘积,为带权路径 = 权 * 路径长度 树的带权路径长度:为所有叶子节点的带权路径之和记做WPL(weight path length) 赫夫曼树huffman-tree或哈夫曼树,又称最优二叉树,

  • 我有一个关于JPEG中特定进程的问题:标有-的进程由标准定义为 非差分哈夫曼编码帧 JPEG无损、非分层、一阶预测 使用JPEG过程--我在这里看到了很大的不一致:传输语法清楚地说明将使用一阶预测,而过程的定义说明这是非微分过程(然后没有值预测?)。这是怎么回事?

  • 本文向大家介绍解析C++哈夫曼树编码和译码的实现,包括了解析C++哈夫曼树编码和译码的实现的使用技巧和注意事项,需要的朋友参考一下 一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 二.实现步骤: 1.构造一棵哈夫曼树 2.根据创建好

  • 我试图压缩一个24位的值。但我之前没有任何压缩方面的经验。所以,我想知道是否有人可以给我一些见解或建议,如何编码和解码的24位值使用verilog或matlab。 问题:我将24位值分成6块4位。每个4位在哈夫曼树中都有一个唯一的路径。我按照这棵树查找压缩值,但我在如何解码这些值上遇到了障碍。由于树是静态的,解码器将知道它。但是,当解码器获得比特流时,它怎么知道如何解码呢。 附上一张图片来阐明我在

  • 主要内容:哈夫曼树相关的几个名词,什么是哈夫曼树,构建哈夫曼树的过程,哈弗曼树中结点结构,构建哈弗曼树的算法实现赫夫曼树,别名“哈夫曼树”、“最优树”以及“最优 二叉树”。学习哈夫曼树之前,首先要了解几个名词。 哈夫曼树相关的几个名词 路径: 在一棵树中,一个结点到另一个结点之间的通路,称为 路径。图 1 中,从根结点到结点 a 之间的通路就是一条路径。 路径长度:在一条路径中,每经过一个结点,路径长度都要加 1 。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第 i 层结点的路径长度