图像处理—霍夫曼编码

article/2025/9/24 17:40:49

图像压缩编码是专门研究图像数据压缩的技术,就是尽量减少表示数据图像所需要的数据量。
本章主要介绍图像压缩编码的基础知识,重点讲解常用的图像压缩编码方法,如霍夫曼编码、香农编码、算术编码、行程编码和预测编码及编码方法的MATLAB实现,最后介绍了静态图像压缩标准JPEG标准。
数字图像通常需要很大的比特数,这给图像的传输和存储带来相当大的困难。例如用8bit存储一幅512512的灰度图像的比特数为256K。而一部60分钟的彩色电影,如果每秒放映24帧,数字化后每帧包含512512像素,每像素的R、G、B分量分别占8bit,则这样一部电影的总比特数为64800M,若用一张600M的CD存储则需要100多张CD光盘来存储。由此可见对图像数据进行压缩显得非常必要。减少存储空间、缩短传输时间这成为促进图像压缩编码技术发展的主导因素。图像压缩是通过编码来实现的,所以通常将压缩与编码统称为图像的压缩编码。图像压缩编码从本质上来说就是对要处理的图像数据按照一定的规则进行变换和组合,从而达到以尽可能少的数据来表示尽可能多的数据信息。

1 霍夫曼编码

霍夫曼在1952年提出了一种构造最佳码的方法,称之为霍夫曼编码(Huffman)。霍夫曼编码是一种无损的统计编码方法,利用信息符号概率分布特性的改变字长进行编码。霍夫曼编码适用于多远独立信源,对于多元独立信源来说它是最佳码。
霍夫曼编码是一种利用信息符号概率分布特性的变字长的编码方法,即对于出现概率大的信息符号编以短字长的码,对于出现概率小的信息符号编以长字长的码。如果码字长度严格按照所对应符号出现概率大小逆序排列,则编码结果的平均码字长度一定小于任何其他排列形式。霍夫曼编码则是严格按照信源符号出现的概率大小来构造码字,因此这种编码方式形成的平均码字长度最短。
霍夫曼编码系统主要分为压缩对象输入、概率统计、构造Huffman树、生成Huffman树、压缩编码环节组成,如图所示霍夫曼编解码系统构成。编程思路依据霍夫曼的编程步骤进行,实现对数据的压缩及其压缩参数的计算。
在这里插入图片描述

1.1编码参数

一副大小为m*n的图像灰度级为K,图像中第k级灰度出现的概率为Pk,每个像素用d比特表示,每两帧图像间隔为△t,则相关参数为:
数字图像的熵H在这里插入图片描述
表示图像信源的平均信息量。
图像平均码子长度R:在这里插入图片描述
描述图像压缩后的平均码子长度。
编码效率在这里插入图片描述
描述图像编码效率
信息冗余度在这里插入图片描述
描述图像被压缩的程度,冗余度越小则图像可以被压缩的程度越小。
每秒所需的传输比特数为在这里插入图片描述
反映的数据的容量。
压缩比: r = d/R

1.2 霍夫曼编码的步骤如下:

1.将信源符号按出现概率从大到小排成一列,然后把最末两个符号的概率相加,合成一个概率。
2.把这个符号的概率与其余符号的概率按从大到小排列,然后再把最末两个符号的概率加起来,合成一个概率。
3.重复上述做法,直到最后剩下两个概率为止。
4.从最后一步剩下的两个概率开始逐步反向进行编码。每步只需对两个分支各赋予一个二进制码,如对概率大的赋予码1,对概率小的赋予码O。
在这里插入图片描述
在这里插入图片描述

1.3 霍夫曼编码的源代码

1.3.1 fliplr 左右翻转矩阵函数,sort排序函数,find返回非零元素函数

fliplr(A)
将矩阵A的列绕垂直轴进行左右翻转 matabc
如果A是一个行向量,fliplr(A)将A中元素的顺序进行翻转。
如果A是一个列向量,fliplr(A)还等于A。
sort排序函数
sort(A):对一维或二维矩阵进行升序排序,并返回排序后的矩阵;当A为二维矩阵时,对矩阵的每一列分别进行排序。
sort(A,dim):对矩阵按指定的方向进行升序排序,并返回排序后的矩阵。当dim=1时,对矩阵的每一列排序(即将第一维行数打乱重排);当dim=2时,对矩阵的每一行排序(即将第二维列数打乱重排)。
sort(A,dim,mode):mode为’ascend’时,进行升序排序;mode为’descend’时,进行降序排序。相比于sort(A)可见默认升序,默认dim=1。
find返回非零元素函数
在这里插入图片描述
在这里插入图片描述返回前N个非零元素的位置,find(A,X)
返回最后一个非零值的位置find(A,1,‘last’)
返回最后一个非零值的行列位置或者A中非零元素位置
[a,b,v] = find(A),找出A中非零元素所在的行和列,分别存储在a和b中,并将结果放在v中。

%【例10-2】霍夫曼编码
close all; clear all; clc;				%关闭所有图形窗口,清除工作空间所有变量,清空命令行
A=[0.5,0.19,0.19,0.12];					%信源消息的概率序列
A=fliplr(sort(A));						%按降序排列
T=A;
[m,n]=size(A);
B=zeros(n,n-1);							%空的编码表(矩阵)
for i=1:nB(i,1)=T(i);							%生成编码表的第一列
end
r=B(i,1)+B(i-1,1);						%最后两个元素相加
T(n-1)=r;
T(n)=0;
T=fliplr(sort(T));
t=n-1;
for j=2:n-1								%生成编码表的其他各列for i=1:tB(i,j)=T(i);endK=find(T==r);B(n,j)=K(end);					%从第二列开始,每列的最后一个元素记录特征元素在该列的位置r=(B(t-1,j)+B(t,j));					%最后两个元素相加T(t-1)=r;T(t)=0;T=fliplr(sort(T)); t=t-1;
end
B;									%输出编码表
END1=str2sym('[0 ,1]');						%给最后一列的元素编码
END=END1;
t=3;
d=1;
for j=n-2:-1:1							%从倒数第二列开始依次对各列元素编码for i=1:t-2if i>1 & B(i,j)==B(i-1,j)d=d+1;elsed=1;endB(B(n,j+1),j+1)=-1;temp=B(:,j+1);x=find(temp==B(i,j));END(i)=END1(x(d));endy=B(n,j+1);END(t-1)=[char(END1(y)),'0'];END(t)=[char(END1(y)),'1'];t=t+1;END1=END;
end
disp('排序后的原概率序列A:');
disp(A)								%排序后的原概率序列
disp('编码结果END:')
disp(END)	;							%编码结果
for i=1:n[a,b]=size(char(END(i)));L(i)=b;
end
disp('平均码字长度')
avlen=sum(L.*A);disp(avlen);					%平均码长
H1=log2(A);
disp('信息熵')
H=-A*(H1');disp(H)							%熵
disp('编码效率')
P=H/avlen;disp(P)							%编码效率

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/oARBH3Vm.shtml

相关文章

哈夫曼编码(理解)

基础理解 什么是哈夫曼树(Huffman Tree) 给定N个带权值的叶子节点,如何构造出一个带权路径最小的二叉树? 在数据结构理论中,哈夫曼树又称为最优树,相关的知识点还有哈弗曼编码等。在正式介绍哈夫曼树之前…

学弟学妹们,学会霍夫曼编码后,再也不用担心网络带宽了!

CSDN 的学弟学妹们,大家好,我是沉默王二。 今天来给大家普及一下霍夫曼编码(Huffman Coding),一种用于无损数据压缩的熵编码算法,由美国计算机科学家大卫霍夫曼在 1952 年提出——这么专业的解释&#xff…

哈夫曼编码详解

一:基本介绍 哈夫曼编码也翻译为 赫夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法 赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。 赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%&#xff5…

赫夫曼编码

一 基本介绍 1 赫夫曼编码也翻译为哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法。 2 赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。 3 赫夫曼编码广泛地用于数据文件压缩。 其压缩率通常在20%~9…

哈夫曼编码(Huffman Coding)原理详解

哈夫曼编码 哈夫曼编码,又称为哈夫曼编码(Huffman Coding) 是一种可变长编码( VLC, variable length coding))方式,比起定长编码的 ASCII 编码来说,哈夫曼编码能节省很多的空间,因…

霍夫曼编码详解

本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:information-theory】,需要的朋友们自取。或者公众号【AIShareLab】回复 信息论 也可获取。 文章目录 霍夫曼编码最佳…

霍夫曼编码(Huffman Coding)

霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种。 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用…

Typecho 博客美化

以前用typecho博客,现在学生服务器到期了,先记录到csdn上,以后工作有钱了,再租个服务器写博客:) 代码高亮 https://www.typechodev.com/plugin/482.html 天气功能 使用心知天气带的插件就可以轻松实现了。 https://www.seniverse…

Hexo博客之博客美化

https://lqgjava.github.io/2019/08/24/Hexo博客之博客美化/ 只需阅读这一篇文章,就可以让你的博客变得丰富多彩,有添加卡通人物,添加鼠标点击爱心,添加鼠标指针样式 添加彩色滚动变换、添加背景音乐、添加动态彩带等&#xff0…

CSDN博客美化

排列博客分类 管理博客-分类专栏下修改 双击分类名称,即可编辑,输入“#”“空格”“分类名称”可将一级分类改成二级分类。 显示的效果 分类图标设置 编辑-设置图标,可以这里找阿里素材库 效果图

【CSDN】CSDN博客美化教程

一、效果 二、MarkDown简明教程 MarkDown简明教程 三、摘要 添加摘要,增加可读性。 PS. 其实,可以根据深度学习算法,自动生成摘要。 四、自定义博客栏目 五、修改皮肤

博客美化作业详细教程

博客美化作业 第一步 下载作业资源 第二步 在文件夹内打开下载资源 单击后缀为HTML文件的网页文件,右击用编译器打开 这些软件都可以(除了紫色的) 第三步 准备工作 首先让我们重新看下作业要求: 必须使用“类选择器”来美化网…

【全网最全的博客美化系列教程】04.访客量统计的实现

全网最全的博客美化系列教程相关文章目录 【全网最全的博客美化系列教程】01.添加Github项目链接 【全网最全的博客美化系列教程】02.添加QQ交谈链接 【全网最全的博客美化系列教程】03.给博客添加一只萌萌哒的小仓鼠 【全网最全的博客美化系列教程】04.访客量统计的实现 【全网…

Hexo博客美化之——IP签名图一网打尽

love421个人博客地址:https://www.makedreamsir.xyz IP签名图可以实时显示来访者的坐标,IP地址,操作系统,浏览器等等。 使用方法:将下面生成的链接插入到合适的位置即可。 项目原地址:点我打开 原作者博…

Web前端:博客美化:一、模板美化

1、选用模板simplememory 2、写css放在 这些会覆盖掉原来的css样式 我是在网上找的css代码二次加工的 : ) /*1、针对simplememory的修改*/ #google_ad_c1, #google_ad_c2 {display:none;} .syntaxhighlighter a, .syntaxhighlighter div, .syntaxhighlighter code, …

Hexo博客之主题美化

据说 NexT 是使用最多的Hexo主题,原因当然是比较漂亮啦!这个项目托管于github上,你可以fork一下,贡献代码。NexT官网上面给出了详细的主题配置过程,这里只是我的博客使用的一些配置以及NexT网站上配置中需要补充的部分。如果你是从头开始配置,请参考NexT官网。这篇文章介…

csdn写博客美化代码显示

本人写博客只是随笔记录,并不是很正规,见谅。 最近在写博客的时候发现自己贴的代码块就只显示代码,而一些前辈的代码块是这样的: 上图只看格式,代码无实际意义。 下面是我的代码块: 我写的代码块就…

【学习之博客美化】matery主题

为了方便我们这里使用 "Visual Studio Code"打开文件 将博客改为中文 目录:E:\IsQiyaBlog 将 " _config.yml " 文件中代码段 language: en 改为 language: zh-CN 修改主题菜单栏 将它们填上内容 新建分类 categories 页: hexo …

Hexo博客美化之蝴蝶(butterfly)主题魔改

这里写自定义目录标题 首先下载主题配置博客主题_config.yaml配置前须知_config.yaml配置简单介绍 如果参考我的脚手架,大家可以阅读readme和changelog文件,和蝴蝶主题官方文档。 tip: 由于butterfly主题升级至3.0.1,所提供的源码不在进行维护…

Vuepress博客美化技巧

文章目录 导航栏透明背景图填充跳转样式悬浮气泡背景图填充导航栏透明图片中的点击向下跳转的样式悬浮气泡 导航栏透明背景图填充跳转样式悬浮气泡 背景图填充 效果图: 下面的小框扩展到大框,让后面的导航栏透明更完善一些。 编辑Theme/components/Ho…