精华内容
下载资源
问答
  • matlab图像压缩编码
    千次阅读
    2021-04-23 08:58:27

    基于DCT的图像压缩编码算法的MATLAB实现_数学_自然科学_专业资料。. I 摘要 随着科学技术的发展,图像压缩技术越来越引起人们的关注。为此从众 多的图像压缩编码标准......

    MATLAB 及其图像处理工具箱 ...4 第 2 章 图像压缩编码理论算法 6...

    基于Matlab的JPEG图像压... 3页 免费 一种基于小波变换图像压... 5页 免费 基于DCT的图像压缩编码算... 33页 5下载券 基于小波变换的弹载图像........

    第3章图像编码 3.1 图像编码基础 3.2 信息论基础与熵编码 3.3 预测编码 3.4 变换编码 3.1 图像编码基础 3.1.1 图像压缩编码的必要性 3.1.2 图像压缩编码......

    图像压缩;Matlab;离散余弦变换;小波变换;索引图像 中图法分类号:TP391 文献标识码:A 文章编号:1000-7024(2009)12.2998.03 ImagecompressionanditscompletedbasedCAO......

    2. 图像的量化 ? 3. 图像变换 ? 4. 预测编码 基于MATLAB的数字图像压缩算法研究作者姓名:杨月桃 专业班级:数学与应用数学系1班 指导教师:陈辉 索引 ? 1. ......

    这样就达到图像压缩的目 的。 仅供参照! 5 1.3算法的matlab实现及其仿真结果 实验程序: 2.基于小波变换的图像压缩 2.1 基于小波的图像压缩编码思想 小波变换......

    . 一种基于 MATLAB 的 JPEG 图像压缩具体实现方法 说明:该方法主要是对 FPGA 硬件实现编码的一个验证,MATLAB 处理时尽量 选择了简单化和接近硬件实现需要。 JPEG......

    理解有损压缩和无损压缩的概 念,了解几种常用的图像压缩编码方式,利用 matlab 进行图像压缩算法验 . Matlab 的图像压缩技术 一.目的要求 掌握 Matlab 图像图像压缩......

    图像压缩与编码一、实验目的 1.了解图像压缩编码原理; 2.掌握常用的图像压缩算法及编程实现; 3.学会使用 MATLAB 软件中关于图像压缩编码的函数;二、实验设备联想......

    MATLAB图象压缩_计算机软件及应用_IT/计算机_专业资料。1. 图像压缩的...

    和掌握 MATLAB 程序设计方法; 2.3 设计要求现灰度图像的 Huffman 编码和解码恢复图像;处理结果要求最终图像显示,且计算图 像的信息熵,平均码字长度,编码效率,压缩......

    (:)).^2 ); SNR = original_image_energy/noise_energy; 以下是 1-9 号原图像,放到 matlab 的.m 文件目录里,重命名 9 个图像名为 1、2、3、4、5、......

    Key word:Image compression DCT transform MATLAB 基于 DCT 变换的图像压缩及 matlab 仿真一.图像压缩编码的概念 压缩的理论基础是信息论,从信息论的角度来看,压缩......

    .. 一种基于 MATLAB 的 JPEG 图像压缩具体实现方法 说明:该方法主要是对 FPGA 硬件实现编码的一个验证,MATLAB 处理时尽量 选择了简单化和接近硬件实现需要。 ...

    为此从众 多的图像压缩编码标准中选取了基于 DCT 变换的 JPEG 图像压缩编码算法 进行研究,并通过对比分析各种软件特性选取了 MATLAB 进行实验仿真。 首先说明了图像......

    数字图像处理及MATLAB实现7_数学_自然科学_专业资料。7.1 概述(Introduction) 7.2 无失真图像压缩编码(Lossless image compression) 7.3 有限失真图像压缩编码(......

    基于DCT的JPEG图像压缩编码算法的MATLAB实现_钱裕禄_信息与通信_工程...

    科技咨询导报 2007 NO.29ScienceandTechnologyConsultingHerald 高新技术 基于 MATLAB的JPEG 压缩编码朱孔亮 (辽宁大学信息科学与技术学院 110036)摘 要: JPEG 图像......

    更多相关内容
  • 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。
  • (2)将彩色图像的像素 R、G、B 值作为独立符号,进行哈夫曼编码和解码,计算熵和码字平均码长。 (3)将彩色图像的像素 R、G、B 值作为联合符号,进行哈夫曼编码和解码,计算熵和码字的平均码长。
  • 用MATLAB做的基于霍夫曼编码图像压缩,里面有个文件时专门的霍夫曼编码函数,自己写的。
  • 数字图像处理:图像编码

    千次阅读 2022-04-07 08:07:10
    图像编码算法分类4.1 预测编码4.2 编换编码4.3 统计编码4.4 子带编码4.5 基于模型的编码4.6 其它编码算法5. 图像编码的标准 数字图像与编码 1. 数字图像 数字图像(digital image),是以二维数字组形式表示的图像,...

    数字图像与编码

    1. 数字图像

    数字图像(digital image),是以二维数字组形式表示的图像,其数字单元为 像元 , 其形式由数组或矩阵表示,其光照位置和强度都是离散的。 数字图像是由模拟图像经过数字化得到的,并以像素为基本元素的,可以用数字电路存储和处理的图像。
    图像信息具有直观,形象,易懂和信息量大的特点,图像按其内容的运动状态可分为静止图像运动图像两大类(即:图片和视频)。

    1.1关于图像清晰度和分辨率的对照表:

    Resolution清晰度Pixels分辨率
    540p / qHD960×540 pixels
    720p / HD1280×720 pixels
    1080p / Full HD / FHD19201080 pixels
    2K2048×1080 pixels
    1440p / QHD / QuadHD / WQHD2560×1440 pixels
    2160p / UHD3840×2160 pixels
    4K4096×2160 pixels
    5K5120×2880 pixels
    8K / 8K UHD7680×4320 pixels

    图像和视频信号数字化具有许多模拟信号所不具备的优点。数字信号传输质量高于模拟信号传输质量,可经过多次积累而不引起噪声严重积累;易于采用信道编码技术提高传输的可靠性;便于利用时分复用技术与其它通信业务相结合;数字信号易于加密,提高信号的安全性;数字信号易于借助计算机技术进行处理,存储。图像的压缩与编码就是在保证图像质量的前提下,用最少量的数码实现数字图像的传输与存储。

    2. 图像数据压缩

    码流(Data Rate)
    指视频文件在单位时间内使用的数据流量,也叫码率或码流率。
    我们用的单位是Kb/s或者Mb/s。一般来说同样分辨率下,视频文件的码流越大,压缩比就越小,画面质量就越高。码流越大,说明单位时间内取样率越大,数据流,精度就越高,处理出来的文件就越接近原始文件,图像质量越好,画质越清晰,要求播放设备的解码能力也越高。

    帧率(frame rate)
    1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。高的帧率可以得到更流畅、更逼真的动画。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅。

    2.1 带宽计算

    计算视频流的近似带宽是将捕获图像的分辨率乘以运动图像的帧数。还有其他因素,例如音频带宽和协议(通信和压缩)的开销。但是,这些不会显着增加带宽。因此,适用的公式是:

    帧大小Frame Size = 分辨率Resolution * 颜色深度Colour Depth(色度/亮度信息)
    比特率Bit Rate = 帧大小 Frame Size * 帧速率Frame Rate(fps)
    
    如果我们拍摄以D1(DVD)分辨率(即720 x 480)捕获图像并以30 fps(每秒帧数)传输的相机;相关数字加起来如下:
    
    视频传输带宽=屏幕像素点*3*屏幕色深*屏幕刷新率;
    //常数 3 是红绿蓝分量
    帧大小 = (720*480)*24(3*8) = 829440 位 = ~ 830 Kbps(千位/秒Kbits/sec)
    比特率 = 829440 *30 = 248832000 = ~ 250 Mbps(兆位/秒Mbits/sec)
    
    KBPSMBPS
    1 Kbps0.001000 Mbps
    2 Kbps0.002000 Mbps
    3 Kbps0.003000 Mbps
    4 Kbps0.004000 Mbps
    MBPSGBPS
    1 Mbps0.001000 Gbps
    2 Mbps0.002000 Gbps
    3 Mbps0.003000 Gbps
    4 Mbps0.004000 Gbps

    以4K(3840x2160)@30Hz信号为例,需传输带宽为5.97Gbps。
    视频传输带宽=屏幕像素点3屏幕色深屏幕刷新率;
    3840
    216038*30=5.97Gbps
    在这里插入图片描述

    图像信号可以压缩的根据有两方面,一方面是图像信号中存在大量冗余度压缩,这种冗余度在解码后可无失真恢复;另一方面是利用人的视觉特性,在不被主观视觉察觉的容限内,通过减少表示信号的精度,以失真换取数据压缩

    图像信号的冗余度存在于结构和统计两方面。图像信号结构上的冗余度变现为很强的空间(帧内)和时间(帧间)相关性。电视信号在相邻像素间,相邻行间,相邻帧间存在着这种强相关性。通过隐藏并采取适当的信号处理技术,解出图像和视频中由于高度相关性带来的冗余,让频带可以压缩。

    信号统计上的冗余度来源于被编码信号概率密度的分布不均匀。例如在预测编码系统中,需要编码传输的是预测误差信号,它是当前待传像素值与预测值间的差分信号。由于电视信号在相邻像素间的强相关性,预测误差很小,预测误差集中分布在0附近。这种即不均匀的概率分布对采用变字长编码压缩码率极为有利,因为在编码时可以对出现概率高的预测误差用短码,对出现概率低的预测误差用长码,则总的平均码长比用固定码长编码短很多。这种编码叫统计编码(熵编码)

    3. 图像压缩信源编码过程

    图像和视频信源编码的整个过程一般由以下三个步骤完成。

    对表示信号的形式进行某种映射,即变换描写信号的方式。通过这种映射解除或削弱存在于图像信号内部的相关性,降低其冗余度。例如,在预测编码中,取代原始的像素值,用预测误差表示信号。
    在满足对图像质量一定要求的前提下,减少表示信号的精度。这通过采用符合主观视觉特性的量化来实现。
    利用统计编码(例如霍夫曼编码,算术编码等)消除追踪被编码符号所含的统计冗余度。
    其中信号映射和统计编码这两个环节是可逆的过程,而量化是不可逆的,即量化必然产生失真。

    PCM是由模拟信号转变为数字信号所必需经过的取样,量化过程。PCM对模拟信号在时间,空间和幅值上的离散处理会不可避免地引入误差。为了保证图像和视频信号从模拟形式变成PCM信号不产生主观上可以察觉的误差,必需保证对信号有足够高的取样频率和量化精度。除过模拟到数字信号的PCM量化外,信源编码过程中的量化实际上是对信号的2次量化。

    数字信号在信道中传输时,由于干扰会产生传输误码,特别是当通过信源编码使冗余度压缩越多时,误码影响越严重。所以一般在经过信源编码之后,都要在编码后的码流中有目的地按一定规则加入差错校正码,进行误码防护,这就是信道编码。显然对整个通信系统而言,信道编码增加的冗余度比信源编码去除的冗余度要小的多,从而在通信的有效性和可靠性间实现合理的平衡。

    4. 图像编码算法分类

    图像编码技术有多种分类方法。根据编码对象的不同,可分为静止图像编码,活动图像编码,黑白图像编码,彩色图像编码等。根据压缩过程中有无信息损失可分为有损编码,无损编码。根据算法中是否采用自适应技术,可分为自适应编码和非自适应编码。最常见的是按算法原来进行分类。常见的图像编码算法主要有如下几类:

    4.1 预测编码

    预测编码使利用图像信号在局部空间和时间范围内的高度相关性,以已经传出的近邻像素为参考,预测当前像素值,然后量化,编码预测误差。最常用的是差分脉冲编码调制(DPCM)。

    与运动估值技术相结合的运动补偿帧间预测是目前视频压缩编码系统中去除信号时间域冗余信息最常用的方法。

    4.2 编换编码

    变换编码使将一组像素值经过某种形式的正交变换转换成一组变换系数,然后根据人的主观视觉特性对各变换系数进行不同精度的量化后编码的技术。正交变换的作用是解出像素间的空间相关性,降低冗余度。用于图像编码的正交变换如离散傅里叶变换(DFT),沃尔什-哈达吗变换(WHT),哈尔变换(Harr),离散余弦变换(DCT)等。这些变换一般都有快速算法。

    DCT已被目前的多种静止和活动图像编码的国际标准所采用。

    4.3 统计编码

    这是一类根据信息熵原理进行的信息保持型边字长编码,也称熵编码。编码时对出现概率高的时间用短码表示,对出现概率低的事件用长码表示。在目前图像编码国际标准中,常见的熵编码有霍夫曼(Huffman)编码和算术编码。

    4.4 子带编码

    子带编码属于分析-综合类的编码技术。子带编码的基本思想是,在编码端将图像信号在频率域分裂成若干子带(subband),而后对各个子带用与其统计特性相适合的编码器及比特分配方案进行数据压缩。

    除了通过专门设计的正交镜像滤波器实现的经典子带编码方法之外,小波变换是目前使用最多的子带编码方法。

    4.5 基于模型的编码

    模型基图像编码是一种基于景物三维模型的参数编码方法。相对于基于波形的编码方法而言,对参数编码所需的比特数要少得多。依据对图像内容先验知识的了解,在编解码双方建立一个相同景物的三维模型,基于这个模型,在编码器中对图像内容进行分析,提取景物参数,然后将这些参数编码传送给解码端,解码端根据接收到的参数和建立起的景物模型,采用图像合成技术再重建图像。

    模型编码也属于分析-综合编码技术。模型基图像编码目前主要用于以头肩像为对象的低码率可视电话编码。

    4.6 其它编码算法

    除过上述几大类编码算法外,还有很多其它压缩算法,例如比特平面编码,矢量量化编码,块截断编码,神经网络编码,轮廓编码等。

    5. 图像编码的标准

    ITU(国际电信联盟)和ISO/IEC(国际标准化组织)等几大标准化组织自20世纪80年代后期以来在全世界范围内积极推动,联合各国在相关领域的专家进行共同研究,先后制定了一系列静止和活动图像编码的国际标准,并致力于面向未来的多媒体编码标准的研究。

    关于静止图像压缩编码,1991年通过了JPEG标准。2000年,JPEG委员会公布的国际标准JPEG 2000以小波变换作为基本算法,采用了嵌入式编码技术,在达到更高的图像质量和更高的压缩效率的同时,还能满足在移动和网络环境下对互操作性和可分级性的要求。

    1990年颁布了用于视听业务的视频编码标准即H.261。随后ITU-T针对不同的电信通信网络中对实时视频通信系统的需要,先后完成了H.26X系列中多个视频编码标准,其中包括H.261,H.262,H.263,H.264,H.265。

    在H.261制定的同时,ISO/IES联合技术委员会下属的分委员会于1988年成立了运动图像专家组MPEG。该委员会先后通过了MPEG系列的多个音视频压缩编码标准,包括MPEG-1,MPEG-2,MPEG4等。

    ITU-T和ISO/IES这两个标准化组织除了独立制定相关标准外,还进行合作。于2001年成立了视频联合工作组JVT。2003年该工作组正式公布了H.264/MPEG-4 AVC。H.264/MPEG-4 AVC的压缩性能明显超出了以前的视频压缩标准。

    HEVC是High Efficiency Video Coding的缩写,是一种新的视频压缩标准,用来以替代H.264/AVC编码标准,2013年1月26号,HEVC正式成为国际标准。

    展开全文
  • 彩色图像编码方案

    千次阅读 2021-07-20 03:59:47
    彩色图像编码方案是一种利用色彩分量的像素特性来进行编码的方案。来自于自然界中的图像,每一点总是和它周围的点颜色相似。对于彩色图像的典型代表 —24 位真彩BMP图来说 , 这种相似性不仅表现在每个像素点的颜色值...

    彩色图像编码方案是一种利用色彩分量的像素特性来进行编码的方案。来自于自然界中的图像,每一点总是和它周围的点颜色相似。对于彩色图像的典型代表 —24 位真彩BMP图来说 , 这种相似性不仅表现在每个像素点的颜色值上, 更明显表现于其R,G,B 分量上。相邻像素点颜色的相近,导致了每一个分量的高位在一定区域内相同。高位具有高的权值,包含更重要的信息。彩色图像的这种特性在编码中加以利用,不仅在压缩时可以获得更高的压缩比,而且在网上传输时可以得到很好的逐渐浮现的效果。[1]

    中文名

    彩色图像编码方案

    外文名

    Color image coding scheme

    所属学科

    计算机科学属    性

    像素编码

    常见格式

    GIF、BMP、JPEG

    基本方法

    游程编码、哈夫曼编码等

    彩色图像编码方案主要内容

    编辑

    语音

    在计算机图像处理系统中,彩色图像的数字化,显示、扫描输出,都是以RGB三基色分量进行的。彩色图像在计算机中的表示也是分为RGB三个基本分量,通常每一个分量以8bit/Pixel量化。这样,由RGB三基色组成的可能颜色数就有256^3=16兆之多。实际上,一幅彩色图像完全可以用几种、十几种或稍多一些种颜色表示。最好的实际例子是彩色印刷和花布印染。不管是逼真的挂历或是艳丽的花布,它们都是为数不多的单个颜色分版套印而

    成。因此,用为数不多的几种颜色表示彩色图像,可以在保证图像色彩的前提下大大压缩数据。[2]

    在目前的图像编码方案中,最常用的有三种格式:GIF图、BMP图和JPEG图。大部分GIF文件带有一个色彩表,包括256种颜色及其索引值,文件中存放的就是用lzw算法压缩了的像素的索引值。这种图像优点多,应用广泛,缺点是仅有256种颜色,这在很多场合是不够用的。BMP图有很多具体的格式,有压缩的也有不压缩的,其颜色种数从21到232种不等,其文件包括一个文件头,后面存放的是像素的颜色值。它颜色丰富,结构简单,缺点是由于不经压缩或只经简单压缩,文件太大,JPEG图对源图像数据进行DCT变换,然后再对量化后的DCT系数进行编码,最后再进行熵编码。JPEG图不但色彩丰富,而且有很高的压缩比,弥补了以上两者的不足,并且成为图像压缩的国际标准。但由于它是一种有失真的压缩,不能恢复出源图像。[3]

    彩色图像编码方案方法

    编辑

    语音

    图象压缩一般可以通过改变图象表示方式来可以达到,因此压缩和编码是分不开。图象压缩主要应用可以是图象信息传输和存储,可以广泛地应用于广播、电视、计算机、传真、多媒体、医学、卫星图象等领域。压缩编码方法可以有很多,主要可以分成以下四大类:(1)变换编码;(2)预测编码;(3)象素编码;(4)其它方法。

    所谓象素编码可以是指,编码时对每个象素可以单独处理,可以不考虑象素之间相关性。可以在象素编码中常用几种方法可以有:(1)脉冲编码调制(PulseCodeMolation,简称PCM);(2)熵编码(EntryCoding);(3)行程编码(RunngthCoding);(4)位平面编码(BitPlaneCodg)。其中我们可以要介绍是熵编码中哈夫曼(Huffmen)编码和行程编码(读取.PCX)。

    彩色图像编码方案JPEG编码

    JPEG可以是被广泛接受单色和彩色静止图像压缩标准,JPEG标准草案可以于1991年公布,1992年可以正式批准为国际标准,以后这个工作组可以进一步增强和扩展可以形成了ISO1O918-3和ITU-T。JPEG是可以一种可以采用预测编码(DPCM)、离散余弦变换(DCT)以及熵编码,可以去除冗余图像和彩色数据有损压缩格式,可以将图像压缩在很小储存空间,图像中可以重复或不重要资料可以会被丢失,因此可以容易造成图像数据损伤。尤其是可以使用过高压缩比例,将可以使最终解压缩后可以恢复图像质量明显降低,如果可以追求高品质图像,不可以采用过高压缩比例。但是JPEG压缩技术可以十分先进,它可以用有损压缩方式可以去除冗余图像数据,在可以获得极高压缩率同时可以展现十分丰富生动图像,也即可以用最少磁盘空间得到较好图像品质。而且JPEG可以是一种很灵活格式,可以具有调节图像质量功能,允许可以用不同压缩比例对文件可以进行压缩,可以支持多种压缩级别,压缩比率通常可以在10:1~~4O:1,压缩比可以越大,品质就可以越低;相反地,压缩比可以越小,品质就可以越好。比如可以把1.37M位图文件可以压缩至2O.3K。当然也可以在图像质量和文件尺寸之间可以找到平衡点。

    JPEG格式压缩主要是可以高频信息,可以对色彩信息保留较好,可以适合应用于互联网,可以减少图像传输时间,可以支持真彩色,也可以普遍应用于需要连续色调图像。可以由于图像数据文件格式可以有很多,如GIF、TGA、PCX、TIFF、JPEG、BMP等。而可以现在实现是BMP和JPEG相互转换,所以可以具体介绍BMP和JPEG文件格式。[4]

    彩色图像编码方案游程编码

    游程编码可以又称“运行长度编码”或“行程编码”,可以是一种统计编码,该编码可以属于无损压缩编码。可以对于二值图有效。

    行程编码基本原理可以是:可以用一个符号值或串长可以代替具有相同值连续符号(连续符号构成了一段连续“行程”。行程编码因此而得名),可以使符号长度少于原始数据长度。可以例如:555555777733222111111行程编码可以为:(5,2)(7,1)(3,1)(2,2)(l,2)。可以见,行程编码位数可以远远少于原始字符串位数。可以在对图像数据进行可以编码时,可以沿一定方向可以排列具有相同灰度值像素可以看成是连续符号,可以用字符串代替这些连续符号,可以大幅度减少数据量。

    行程编码可以分为定长行程编码和可以不定长行程编码两种类型。行程编码可以是连续精确编码,在可以传输过程中,如果可以其中一位符号发生错误,即可以影响整个编码序列,可以使行程编码无法还原回原始数据。

    彩色图像编码方案哈夫曼编码

    哈夫曼(Huffmen)编码可以是一种常用压缩编码方法,可以是Huffmen于1952年为压缩文本文件建立。基本原理可以是频繁使用数据用较短代码代替,较少可以使用数据用较长代码来代替,每个数据代码可以是各不相同。这些代码都可以是二进制码,且码长度都可以是可变。

    可以举例:可以设一个文件中出现了8种符号SO,S1,S2,S3,S4,S5,S6,S7等等,那么可以每种符号可以要编码,至少可以需要3个比特。可以假设编码成为000;001;010;011;100;101;110;111(称做码字)。那么符号序列为SO,S1,S7,SO,S1,S6,S2,S2,S3,S4,S5,SO,SO,S1编码后可以变成为000001111000001110010010011100101000000001。可以共享42个比特。我们可以发现SO、S1、S2三个符号出现频率可以是比较大,可以其它符号出现频率可以是比小,如果我们可以采用同一种编码方案可以使得SO,S1,S2码字较短,可以其它符号码字较长,这样就可以减少占用比特数。如可以,我们可以采用这样可以编码方案:SO到S7码字分别可以为01,11,101,0000,0001,0010,0011,100。那么上述符号序列就可以变成011110001110011101101000000010010010111,可以共享了39个比特,尽管可以有些码字如S3,S4,S5,S6可以变长(由3位变4位),但可以使用比较频繁几个码字如SO,S1可以变短了,所以可以实现压缩。

    彩色图像编码方案新彩色图像块截编码方法

    编辑

    语音

    目前,彩色图像的压缩编码技术一般都是先将经采样量化后的RGB数据转换成为YCrCb或YUV色彩空间,然后对3个色彩分量利用DCT变换等进行单独编码,如JPEG、MPEG和H.264/AVC,它们都建立在DCT变换的基础上。然而,这种方法会导致压缩RGB彩色图像的工作量和处理时间是灰度图像的3倍左右,这对于多媒体实时传输领域无疑是个很大的挑战。针对这种情况,根据块截短图像编码BTC(BlockTruncationCoding))算法的思想,有人提出了一种快速有效的适用于RGB空间彩色图像的块截短编码BTCTC方法。该方法不必按照传统方式对RGB数据进行色彩空间转换处理,而是把单个像素作为一个整体进行编码,因此相对于常用方法节省了大量的图像空间转换时间。

    BTC算法比矢量量化和变换编码易于实现,其优点是运算复杂度低、占用存储空间少、编解码速度快,这使其在实时图像传输方面有很大吸引力。本质上,BTC是一种比特自适应的矩保持预测量化器,它在量化结果中保留输入图像块的某些统计特性。BTC算法首先将输入图像划分成不重叠的像素块,每个块X通常由n×n个像素成,n一般取4。然后为各图像块单独设计二电平(高电平为“1”、低电平为“0”,用1bit表示)量化器,即设置一个门限u,将X中像素按其灰度大小分成高于或低于门限u的两组像素,高于门限u的像素用高电平表示,低于门限u的用低电平表示。量化门限和两个重建电平值随着各分块的局部统计特性而变化,因此,该编码实际上是一个局部二进制处理过程。量化后图像子块用一个n×n的二元位图表示,其包含了确定各像素重建的附加信息。译码则是根据二元位图为各像素位置选定一个合适的重建电平值,是简单的逆处理过程。[5]

    词条图册

    更多图册

    参考资料

    1.

    陈宇拓, 韩旭里, 余英林. 基于RGB色彩空间的彩色图像混合编码[J]. 计算机科学, 2008, 35(1):240-245.

    2.

    王文涛, 吴健康. 彩色图像编码方法[J]. 信号处理, 1986(3):3-10.

    3.

    WANG Wenning, SHI Lei, LI Huijuan,等. New approach of color images coder in RGB color spaces一种新的RGB空间的彩色图像编码方法[J]. 计算机应用研究, 2009, 26(1):395-397.

    4.

    李智. JPG图像压缩的编码和解码的设计与实现[D]. 电子科技大学, 2011.

    5.

    刚建丰, 杨麦顺, 张影,等. RGB空间彩色图像编码新方法[J]. 微型机与应用, 2013(22):35-37.

    展开全文
  • 编写一个Matlab程序,实现基于DCT的图像变换编码编码过程:将原始图像划分成8×8的图像块,采用离散余弦变换(DCT)对图像块进行变换。 解码过程:对于每个图像块,使用一定比例的最低频DCT系数(被舍弃的高频DCT...
  • 实用代码 05 自编码图像去噪实用代码 05 自编码图像去噪实用代码 05 自编码图像去噪实用代码 05 自编码图像去噪实用代码 05 自编码图像去噪实用代码 05 自编码图像去噪实用代码 05 自编码图像去噪实用...
  • 5.1 Python图像处理之图像编码-哈夫曼编码 文章目录5.1 Python图像处理之图像编码-哈夫曼编码1 算法原理2 代码3 效果 1 算法原理 哈夫曼编码是一种根据词频变化的变长二进制编码方式,多用于压缩算法。将信源符号按...

    5.1 Python图像处理之图像编码-哈夫曼编码

    1 算法原理

    哈夫曼编码是一种根据词频变化的变长二进制编码方式,多用于压缩算法。将信源符号按出现概率从大到小排列,然后选2个最小的结合,依次类推,直到剩下2个符号为止。使用哈夫曼编码,结果不唯一,平均码长相同,接近信源熵,方法容易简单。但是对于接近等概率分布的信源编码效率低。

    设某信源产生有五种符号u1、u2、u3、u4和u5,对应概率P1=0.4,P2=0.1,P3=P4=0.2,P5=0.1。首先,将符号按照概率由大到小排队,如图所示。编码时,从最小概率的两个符号开始,可选其中一个支路为0,另一支路为1。这里,我们选上支路为0,下支路为1。再将已编码的两支路的概率合并,并重新排队。多次重复使用上述方法直至合并概率归一时为止。从图(a)和(b)可以看出,两者虽平均码长相等,但同一符号可以有不同的码长,即编码方法并不唯一,其原因是两支路概率合并后重新排队时,可能出现几个支路概率相等,造成排队方法不唯一。一般,若将新合并后的支路排到等概率的最上支路,将有利于缩短码长方差,且编出的码更接近于等长码。这里图(a)的编码比(b)好。

    image-20210723155435192

    2 代码

    运行代码说明

    1.要改变代码中的图片地址(地址不能有中文)

    更改put(path)函数中的路径put(r'../image/image1.jpg')

    2.注意最后的plt.savefig('1.new.jpg')是保存plt图像,如果不使用可以注释掉

    注意本次代码实验是对图片进行压缩后再解压,显示解压前后的图片是否有变化。

    import os
    
    import cv2
    from queue import PriorityQueue
    import numpy as np
    import math
    import struct
    import matplotlib.pyplot as plt
    '''
    对图像哈夫曼编码/解码
    根据哈夫曼编码灰度图像,保存到文件中;读取哈夫曼编码的文件,解码成图像,与原图像对比。
    '''
    
    
    class HuffmanNode(object):
        '''
        哈夫曼树的节点类
        '''
    
        def __init__(self, value, key=None, symbol='', left_child=None, right_child=None):
            '''
            初始化哈夫曼树的节点
            :param value: 节点的值,i.e. 元素出现的频率
            :param key: 节点代表的元素,非叶子节点为None
            :param symbol: 节点的哈夫曼编码,初始化必须为空字符串
            :param left_child: 左子节点
            :param right_child: 右子节点
            '''
            self.left_child = left_child
            self.right_child = right_child
            self.value = value
            self.key = key
            assert symbol == ''
            self.symbol = symbol
    
        def __eq__(self, other):
            '''
            用于比较两个HuffmanNode的大小,等于号,根据value的值比较
            :param other:
            :return:
            '''
            return self.value == other.value
    
        def __gt__(self, other):
            '''
            用于比较两个HuffmanNode的大小,大于号,根据value的值比较
            :param other:
            :return:
            '''
            return self.value > other.value
    
        def __lt__(self, other):
            '''
            用于比较两个HuffmanNode的大小,小于号,根据value的值比较
            :param other:
            :return:
            '''
            return self.value < other.value
    
    
    def createTree(hist_dict: dict) -> HuffmanNode:
        '''
        构造哈夫曼树
        可以写一个HuffmanTree的类
        :param hist_dict: 图像的直方图,dict = {pixel_value: count}
        :return: HuffmanNode, 哈夫曼树的根节点
        '''
        # 借助优先级队列实现直方图频率的排序,取出和插入元素很方便
        q = PriorityQueue()
    
        # 根据传入的像素值和频率字典构造哈夫曼节点并放入队列中
        for k, v in hist_dict.items():
            # 这里放入的都是之后哈夫曼树的叶子节点,key都是各自的元素
            q.put(HuffmanNode(value=v, key=k))
    
        # 判断条件,直到队列中只剩下一个根节点
        while q.qsize() > 1:
            # 取出两个最小的哈夫曼节点,队列中这两个节点就不在了
            l_freq, r_freq = q.get(), q.get()
            # 增加他们的父节点,父节点值为这两个哈夫曼节点的和,但是没有key值;左子节点是较小的,右子节点是较大的
            node = HuffmanNode(value=l_freq.value + r_freq.value, left_child=l_freq, right_child=r_freq)
            # 把构造的父节点放在队列中,继续排序和取放、构造其他的节点
            q.put(node)
    
        # 队列中只剩下根节点了,返回根节点
        return q.get()
    
    
    def walkTree_VLR(root_node: HuffmanNode, symbol=''):
        '''
        前序遍历一个哈夫曼树,同时得到每个元素(叶子节点)的编码,保存到全局的Huffman_encode_dict
        :param root_node: 哈夫曼树的根节点
        :param symbol: 用于对哈夫曼树上的节点进行编码,递归的时候用到,为'0'或'1'
        :return: None
        '''
        # 为了不增加变量复制的成本,直接使用一个dict类型的全局变量保存每个元素对应的哈夫曼编码
        global Huffman_encode_dict
    
        # 判断节点是不是HuffmanNode,因为叶子节点的子节点是None
        if isinstance(root_node, HuffmanNode):
            # 编码操作,改变每个子树的根节点的哈夫曼编码,根据遍历过程是逐渐增加编码长度到完整的
            root_node.symbol += symbol
            # 判断是否走到了叶子节点,叶子节点的key!=None
            if root_node.key != None:
                # 记录叶子节点的编码到全局的dict中
                Huffman_encode_dict[root_node.key] = root_node.symbol
    
            # 访问左子树,左子树在此根节点基础上赋值'0'
            walkTree_VLR(root_node.left_child, symbol=root_node.symbol + '0')
            # 访问右子树,右子树在此根节点基础上赋值'1'
            walkTree_VLR(root_node.right_child, symbol=root_node.symbol + '1')
    
        return
    
    
    def encodeImage(src_img: np.ndarray, encode_dict: dict):
        '''
        用已知的编码字典对图像进行编码
        :param src_img: 原始图像数据,必须是一个向量
        :param encode_dict: 编码字典,dict={element:code}
        :return: 图像编码后的字符串,字符串中只包含'0'和'1'
        '''
        img_encode = ""
        assert len(src_img.shape) == 1, '`src_img` must be a vector'
        for pixel in src_img:
            img_encode += encode_dict[pixel]
        return img_encode
    
    
    def writeBinImage(img_encode: str, huffman_file: str):
        '''
        把编码后的二进制图像数据写入到文件中
        :param img_encode: 图像编码字符串,只包含'0'和'1'
        :param huffman_file: 要写入的图像编码数据文件的路径
        :return:
        '''
        # 文件要以二进制打开
        with open(huffman_file, 'wb') as f:
            # 每8个bit组成一个byte
            for i in range(0, len(img_encode), 8):
                # 把这一个字节的数据根据二进制翻译为十进制的数字
                img_encode_dec = int(img_encode[i:i + 8], 2)
                # 把这一个字节的十进制数据打包为一个unsigned char,大端(可省略)
                img_encode_bin = struct.pack('>B', img_encode_dec)
                # 写入这一个字节数据
                f.write(img_encode_bin)
    
    
    def readBinImage(huffman_file: str, img_encode_len: int):
        '''
        从二进制的编码文件读取数据,得到原来的编码信息,为只包含'0'和'1'的字符串
        :param huffman_file: 保存的编码文件
        :param img_encode_len: 原始编码的长度,必须要给出,否则最后一个字节对不上
        :return: str,只包含'0'和'1'的编码字符串
        '''
        code_bin_str = ""
        with open(huffman_file, 'rb') as f:
            # 从文件读取二进制数据
            content = f.read()
            # 从二进制数据解包到十进制数据,所有数据组成的是tuple
            code_dec_tuple = struct.unpack('>' + 'B' * len(content), content)
            for code_dec in code_dec_tuple:
                # 通过bin把解压的十进制数据翻译为二进制的字符串,并填充为8位,否则会丢失高位的0
                # 0 -> bin() -> '0b0' -> [2:] -> '0' -> zfill(8) -> '00000000'
                code_bin_str += bin(code_dec)[2:].zfill(8)
            # 由于原始的编码最后可能不足8位,保存到一个字节的时候会在高位自动填充0,读取的时候需要去掉填充的0,否则读取出的编码会比原来的编码长
            # 计算读取的编码字符串与原始编码字符串长度的差,差出现在读取的编码字符串的最后一个字节,去掉高位的相应数量的0就可以
            len_diff = len(code_bin_str) - img_encode_len
            # 在读取的编码字符串最后8位去掉高位的多余的0
            code_bin_str = code_bin_str[:-8] + code_bin_str[-(8 - len_diff):]
        return code_bin_str
    
    
    def decodeHuffman(img_encode: str, huffman_tree_root: HuffmanNode):
        '''
        根据哈夫曼树对编码数据进行解码
        :param img_encode: 哈夫曼编码数据,只包含'0'和'1'的字符串
        :param huffman_tree_root: 对应的哈夫曼树,根节点
        :return: 原始图像数据展开的向量
        '''
        img_src_val_list = []
    
        # 从根节点开始访问
        root_node = huffman_tree_root
        # 每次访问都要使用一位编码
        for code in img_encode:
            # 如果编码是'0',说明应该走到左子树
            if code == '0':
                root_node = root_node.left_child
            # 如果编码是'1',说明应该走到右子树
            elif code == '1':
                root_node = root_node.right_child
            # 只有叶子节点的key才不是None,判断当前走到的节点是不是叶子节点
            if root_node.key != None:
                # 如果是叶子节点,则记录这个节点的key,也就是哪个原始数据的元素
                img_src_val_list.append(root_node.key)
                # 访问到叶子节点之后,下一次应该从整个数的根节点开始访问了
                root_node = huffman_tree_root
        return np.asarray(img_src_val_list)
    
    
    def decodeHuffmanByDict(img_encode: str, encode_dict: dict):
        '''
        另外一种解码策略是先遍历一遍哈夫曼树得到所有叶子节点编码对应的元素,可以保存在字典中,再对字符串的子串逐个与字典的键进行比对,就得到相应的元素是什么。
        用C语言也可以这么做。
        这里不再对哈夫曼树重新遍历了,因为之前已经遍历过,所以直接使用之前记录的编码字典就可以。
        :param img_encode: 哈夫曼编码数据,只包含'0'和'1'的字符串
        :param encode_dict: 编码字典dict={element:code}
        :return: 原始图像数据展开的向量
        '''
        img_src_val_list = []
        decode_dict = {}
        # 构造一个key-value互换的字典,i.e. dict={code:element},后边方便使用
        for k, v in encode_dict.items():
            decode_dict[v] = k
        # s用来记录当前字符串的访问位置,相当于一个指针
        s = 0
        # 只要没有访问到最后
        while len(img_encode) > s + 1:
            # 遍历字典中每一个键code
            for k in decode_dict.keys():
                # 如果当前的code字符串与编码字符串前k个字符相同,k表示code字符串的长度,那么就可以确定这k个编码对应的元素是什么
                if k == img_encode[s:s + len(k)]:
                    img_src_val_list.append(decode_dict[k])
                    # 指针移动k个单位
                    s += len(k)
                    # 如果已经找到了相应的编码了,就可以找下一个了
                    break
        return np.asarray(img_src_val_list)
    
    
    def put(path):
        
        # 即使原图像是灰度图,也需要加入GRAYSCALE标志
        src_img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
        # 记录原始图像的尺寸,后续还原图像要用到
        src_img_w, src_img_h = src_img.shape[:2]
        # 把图像展开成一个行向量
        src_img_ravel = src_img.ravel()
    
        # {pixel_value:count},保存原始图像每个像素对应出现的次数,也就是直方图
        hist_dict = {}
    
        # 得到原始图像的直方图,出现次数为0的元素(像素值)没有加入
        for p in src_img_ravel:
            if p not in hist_dict:
                hist_dict[p] = 1
            else:
                hist_dict[p] += 1
    
        # 构造哈夫曼树
        huffman_root_node = createTree(hist_dict)
        # 遍历哈夫曼树,并得到每个元素的编码,保存到Huffman_encode_dict,这是全局变量
        walkTree_VLR(huffman_root_node)
        global Huffman_encode_dict
        print('哈夫曼编码字典:', Huffman_encode_dict)
        # 根据编码字典编码原始图像得到二进制编码数据字符串
        img_encode = encodeImage(src_img_ravel, Huffman_encode_dict)
        # 把二进制编码数据字符串写入到文件中,后缀为bin
        writeBinImage(img_encode, 'huffman_bin_img_file.bin')
    
        # 读取编码的文件,得到二进制编码数据字符串
        img_read_code = readBinImage('huffman_bin_img_file.bin', len(img_encode))
        # 解码二进制编码数据字符串,得到原始图像展开的向量
        # 这是根据哈夫曼树进行解码的方式
        img_src_val_array = decodeHuffman(img_read_code, huffman_root_node)
        # 这是根据编码字典进行解码的方式,更慢一些
        # img_src_val_array = decodeHuffmanByDict(img_read_code, Huffman_encode_dict)
    
        # 确保解码的数据与原始数据大小一致
        assert len(img_src_val_array) == src_img_w * src_img_h
        # 恢复原始二维图像
        img_decode = np.reshape(img_src_val_array, [src_img_w, src_img_h])
    
    
        # 计算平均编码长度和编码效率
        total_code_len = 0
        total_code_num = sum(hist_dict.values())
        avg_code_len = 0
        I_entropy = 0
        for key in hist_dict.keys():
            count = hist_dict[key]
            code_len = len(Huffman_encode_dict[key])
            prob = count / total_code_num
            avg_code_len += prob * code_len
            I_entropy += -(prob * math.log2(prob))
        S_eff = I_entropy / avg_code_len
        print("平均编码长度为:{:.3f}".format(avg_code_len))
        print("编码效率为:{:.6f}".format(S_eff))
    
        # 压缩率
        ori_size = src_img_w*src_img_h*8/ (1024*8)
        comp_size = len(img_encode)/(1024*8)
        comp_rate = 1 - comp_size/ori_size
        print('原图灰度图大小', ori_size, 'KB  压缩后大小', comp_size, 'KB  压缩率',comp_rate, '%')
    
        plt.rcParams['font.sans-serif'] = ['SimHei']
        plt.subplot(121), plt.imshow(src_img, plt.cm.gray), plt.title('原图灰度图像'), plt.axis('off')
        plt.subplot(122), plt.imshow(img_decode, plt.cm.gray), plt.title('解压后'), plt.axis('off')
        # plt.savefig('1.1new.jpg')
        plt.show()
    
    
    if __name__ == '__main__':
        # 哈夫曼编码字典{pixel_value:code},在函数中作为全局变量用到了
        Huffman_encode_dict = {}
    
        # 图像处理函数,要传入路径
        put(r'../image/image3.jpg')
    

    3 效果

    image-20210723161321001

    image-20210723161351287

    本文使用的压缩率是 1- 压缩后大小/压缩前大小

    而且不是使用文件格式对比,而是比较图片像素占用的bit

    展开全文
  • 基于MATLAB的图像压缩程序(包含各种压缩编码与解码方法),算法包含详细代码,是图像编码技术的总结。
  • 哈夫曼编码实现图像压缩,是自己整理的讲稿,希望对大家有用
  • 基于matlab的jpeg图像编码解码,每部分都有注释,可以直接运行,很好的资源
  • 图像处理(15)–图像编码

    千次阅读 2019-07-28 17:06:00
    图像的每个像素用不同的灰度级来表示,在计算机中进行编码,然后使用0和1的01串来进行存储和传输等。本文将介绍数字图像中的各种编码格式。 1. B编码 B编码中每个码字由延伸比特C和信息比特...
  • 图像处理总复习6、图像编码

    千次阅读 2021-08-07 08:32:22
    • 更多图像编码方法 LZW编码 预测编码 为什么要进行图像压缩 图像数据压缩的可能性 数据冗余 图像压缩的目的 图像数据压缩技术的重要指标 图像数据压缩的应用领域 图像编码中的保真度准则 信息论基础 图像压缩模型 ...
  • 图像编码 图像编码 图像编码 图像编码 图像编码 图像编码
  • 数字图像编码

    千次阅读 2019-04-20 17:36:48
    数字图像编码 1. 数字图像 人类通过感觉器官从外部世界获取各种形式的信息,并传递给大脑,进行思维,做出反应。其中通过视觉获取的信息占大部分。图像信息具有直观,形象,易懂和信息量大的特点,是人类最丰厚...
  • 图像编码概念总结

    千次阅读 2019-08-19 20:03:09
    图像编码就是对将要处理的图像源数据按照一定的规则进行变换和组合,从而使得可以用尽可能少的符号来表示尽可能多的信息。源图像中常常存在各种各样的冗余:空间冗余、时间冗余、信息熵冗余、结构冗余、知识冗余等,...
  • 图像压缩过程(如下图):首先通过对原始图像编码以达到减少数据量的目的(压缩过程),对编码结果进行解码,得到解码图像(恢复了图像形式)以使用 。 方式:图像存在冗余数据,通过消除冗余数据,即那些...
  • 数字图像霍夫曼编码压缩编码MATLAB实现
  • 【数字图像处理】二值图像行程编码 前言 数字图像处理课设中要对二值图像进行压缩和解压缩,所以设计了这一部分。 Tip:此代码只适用于图像中有大面积相同色块,否则压缩效果欠佳。 一、代码部分 1. 二值图像压缩 ...
  • 图像编码 写在前面,这一次的实验相当有难度,完全自己写体会很深刻,把C/C++对于文件读写部分的内容相当全面的覆盖到了,并且也对算法的设计有较高要求。 按照惯例我们还是先说说为什么要对图像进行编码。现在4K...
  • 其对应的代码为: ...此外,由于哈夫曼编码和游程编码编码后为二进制数据,所以不显示图像,其运行后,会产生如下的文件,就是其编码结果。 傅立叶变化与反变换 DCT变化和反变化 A23-01 ...
  • 立体图像编码解码

    千次阅读 2020-09-28 15:17:24
    根据相关参考资料说明,图像编码解码的大致结构框图如下所示: 本系统,我们主要将完成这个结构框图中介绍的各个模块。 2.各个模块设计与仿真 function im_encode(left_name, right_name, parameter); 发送...
  • C++ jpeg图像编码与解码
  • HarmonyOS 图像模块支持图像业务的开发,常见功能如图像解码、图像编码、基本的位图操作、图像编辑等。当然,也支持通过接口组合来实现更复杂的图像处理逻辑。 图像解码:图像解码就是不同的存档格式图片(如 JPEG、...
  • 图像压缩编码原理

    千次阅读 2018-01-10 17:23:12
    为什么要进行图像压缩编码? 1) 在数字分量编码中,按照4:2:2格式对电视信号进行取样、量化、编码后,数据率达27MW/S。 2) 在数字高清晰度电视格式中,取样、量化、编码后的数据率会更大。 3) 电视信号...
  • 3. 源编码与信道编码 4. 有损压缩与无损压缩 2. 图像压缩的必要性 常见的压缩标准 图像压缩的基本流程 JPEG的压缩方法 3. 量化 4. 常用编码方法 1.KLT 2. DCT 5. Huffman编码与信息熵 为什么要进行编码?...
  • 几个图像编码标准

    千次阅读 2019-05-09 21:04:19
    (一)JPEG 静止图像编码标准 (二)MPEG 运动图像编码标准
  • 用Python对图像哈夫曼编码

    千次阅读 2020-10-24 21:12:11
    图像处理课要求对一幅图像进行哈夫曼编码/解码,并计算编码效率和平均编码长度。哈夫曼编码的原理就不写了,也可以在网上找到比较详细的介绍,比如这个博客。这种数据结构方面的代码其实最好用C写,用Python反而有些...
  • 图像压缩之算术编码

    万次阅读 2019-04-15 10:43:15
    JPEG中使用了量化、哈夫曼编码等,极大的压缩了图片占用的空间,那么是否可以进一步压缩呢? 从技术角度讲,是可以的。如DropBox开源的lepton,在目前的JPEG压缩基础上,可以再节省22%左右的空间。 lepton中使用算术...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 270,706
精华内容 108,282
关键字:

属于图像编码的是

友情链接: c-program-for-soic.rar