Matlab实现图像压缩

文章和代码以及样例图片等相关资源,已经归档至【Github仓库:digital-image-processing-matlab】或者公众号【AIShareLab】回复 数字图像处理 也可获取。

文章目录

    • 目的
    • 原理
      • 图像压缩原理
      • 离散余弦变换(DCT)图像压缩原理
      • 行程编码(RLE)原理
    • 步骤
      • MATLAB 中的变长码映射
      • 离散余弦变换(DCT)图像压缩
      • 利用离散余弦变换进行JPEG 图像压缩

目的

1. 理解图像压缩的相关概念及图像压缩的主要原则和目的;
2. 掌握霍夫曼编码
3. 掌握几种常见的图像压缩编码方法
4. 利用 MATLAB 程序进行图像压缩

原理

图像压缩原理

图像压缩主要目的是为了节省存储空间,增加传输速度。图像压缩的理想标准是信息丢失最少,压缩比例最大。不损失图像质量的压缩称为无损压缩,无损压缩不可能达到很高的压缩比;损失图像质量的压缩称为有损压缩,高的压缩比是以牺牲图像质量为代价的。压缩的实现方法是对图像重新进行编码,希望用更少的数据表示图像。

信息的冗余量有许多种,如空间冗余,时间冗余,结构冗余,知识冗余,视觉冗余等,数据压缩实质上是减少这些冗余量。高效编码的主要方法是尽可能去除图像中的冗余成分,从而以最小的码元包含最大的图像信息。

编码压缩方法有许多种,从不同的角度出发有不同的分类方法,从信息论角度出发可分为两大类。

(1)冗余度压缩方法,也称无损压缩、信息保持编码或嫡编码。具体说就是解码图像和压缩编码前的图像严格相同,没有失真,从数学上讲是一种可逆运算。

(2)信息量压缩方法,也称有损压缩、失真度编码或烟压缩编码。也就是说解码图像和原始图像是有差别的,允许有一定的失真。

应用在多媒体中的图像压缩编码方法,从压缩编码算法原理上可以分为以下 3 类:

(1)无损压缩编码种类
哈夫曼(Huffman)编码,算术编码,行程(RLE)编码,Lempel zev 编码。

(2)有损压缩编码种类

  • 预测编码,DPCM,运动补偿

  • 频率域方法:正交变换编码(如DCT),子带编码;

  • 空间域方法:统计分块编码;

  • 模型方法:分形编码,模型基编码;

  • 基于重要性:滤波,子采样,比特分配,向量量化;

(3)混合编码。 有 JBIG,H261,JPEG,MPEG 等技术标准。

离散余弦变换(DCT)图像压缩原理

离散余弦变换 DCT 在图像压缩中具有广泛的应用,它是JPEG、MPEG 等数据压缩标准的
重要数学基础。

和相同图像质量的其他常用文件格式(如GIF(可交换的图像文件格式),TIFF(标签图像文件格式),PCX(图形文件格式))相比,JPEG 是目前静态图像中压缩比最高的。JPEG 比其他几种压缩比要高得多,而图像质量都差不多(JPEG 处理的图像只有真彩图和灰度图)。正是由于其高压缩比,使得JPEG 被广泛地应用于多媒体和网络程序中。JPEG 有几种模式,其中最常用的是基于DCT 变换的顺序型模式,又称为基本系统(Baseline)。

用DCT 压缩图像的过程为:

(1)首先将输入图像分解为8×8 或16×16 的块,然后对每个子块进行二维DCT变换。
(2)将变换后得到的量化的DCT 系数进行编码和传送,形成压缩后的图像格式。

用 DCT 解压的过程为:

(1)对每个8×8 或16×16 块进行二维DCT 反变换。
(2)将反变换的矩阵的块合成一个单一的图像。

余弦变换具有把高度相关数据能量集中的趋势,DCT 变换后矩阵的能量集中在矩阵的
左上角,右下的大多数的DCT 系数值非常接近于0。对于通常的图像来说,舍弃这些接近
于0 的DCT 的系数值,并不会对重构图像的画面质量带来显著的下降。所以,利用DCT
变换进行图像压缩可以节约大量的存储空间。压缩应该在最合理地近似原图像的情况下使用
最少的系数。使用系数的多少也决定了压缩比的大小。

在压缩过程的第 2 步中,可以合理地舍弃一些系数,从而得到压缩的目的。在压缩
过程的第2 步,还可以采用RLE 和Huffman 编码来进一步压缩。

行程编码(RLE)原理

例如如下这幅的二值图像,

如果采用行程编码可以按如下格式保存

其中10 和8 表示图像的宽和高。在这个小例子中行程编码并没有起到压缩图像的作用。这是由于这个图的尺寸过小,当图像尺寸较大时行程编码还是不错的无损压缩方法。对于灰度图像和二值图像,用行程编码—般都有很高的压缩率。行程编码方法实现起来很容易,对于具有长重复值的串的压缩编码很有效,例如:对于有大面积的阴影或颜色相同的图像,使用这种方法压缩效果很好。很多位图文件格式都采用行程编码,如TIFF,PCX,GEM,BMP等。

步骤

MATLAB 中的变长码映射

clear all
clcf2=uint8([2 3 4 2;3 2 4 4;2 2 1 2;1 1 2 2])
whos('f2')
c=huffman(hist(double(f2(:)),4))
h1f2=c(f2(:))'
whos('h1f2')
%h2f2=char(h1f2)'
h2f2=[1 0 1 0 0 1 1 0 0 0 0 1 1 0 1 1;...
' ' 1 ' ' 1 1 ' ' 1 0 0 1 ' ' 0 ' ';...
' ' 0 ' ' 1 0 ' ' 1 ' ' 1 ' ']
whos('h2f2')h2f2=h2f2(:);
h2f2(h2f2==' ')=[];
whos('h2f2')h3f2=mat2huff(f2)
whos('h3f2')hcode=h3f2.code;
whos('hcode')
dec2bin(double(hcode))%-----------------------------------------%
function CODE=huffman(p)error(nargchk(1,1,nargin));
if(ndims(p)~=2)|(min(size(p))>1)|~isreal(p)|~isnumeric(p)error('p must be a real numeric vector');
endglobal CODE
CODE=cell(length(p),1);%init the global cell array
if (length(p)>1) %when more than one symbol....p=p/sum(p);%Normalize the input probabilitiess=reduce(p);%Do Huffman source symbol reductionsmakecode(s,[]);%Recursively(递归) generate the code
elseCODE={'1'};%else, trivial(普通的) one symbol case
end;
%---------------------------------------------------------%function s=reduce(p);
s=cell(length(p),1);
for i=1:length(p)s{i}=i;
endwhile size(s)>2[p,i]=sort(p);%sort the symbol probabilitiesp(2)=p(1)+p(2);%Merge the 2 lowest probabilitiesp(1)=[];% and prune(,剪除、删除) the lowest ones=s(i);s{2}={s{1},s{2}};s(1)=[];
end
%------------------------------------------------------------%
function makecode(sc,codeword)global CODE
if isa(sc,'cell')makecode(sc{1},[codeword 0]);makecode(sc{2},[codeword 1]);
elseCODE{sc}=char('0'+codeword);
End
%-----------------------------------------------------------%
function y=mat2huff(x)if ndims(x)~=2|~isreal(x)|(~isnumeric(x) & ~islogical(x))error('x must be a 2-D real numeric or logical matrix');
endy.size=uint32(size(x));
x=round(double(x));
xmin=min(x(:));
xmax=max(x(:));
pmin=double(int16(xmin));
pmin=uint16(pmin+32768);%
y.min=pmin;
x=x(:)';
h=histc(x,xmin:xmax);
if max(h)>65535h=65535*h/max(h);
end
h=uint16(h);
y.hist=h;%code the input matrix and store the result
map=huffman(double(h));
hx=map(x(:)-xmin+1)
hx = ['1' ' ' '1' '0' ' ' '1' '1' '0' ' ' ' '...'0' '1' '1' ' ' '1' '1']';
%hx=char(hx);
hx=hx(:)';
hx(hx==' ')=[];
ysize=ceil(length(hx)/16);
hx16=repmat('0',1,ysize*16);
hx16(1:length(hx))=hx;
hx16=reshape(hx16,16,ysize);
hx16=hx16' - '0';
twos=pow2(15:-1:0);
y.code=uint16(sum(hx16.*twos(ones(ysize,1),:),2))';
%-----------------------------------------------------------------------%

离散余弦变换(DCT)图像压缩

在图像的变换和压缩中,常常用到离散余弦变换(DCT)。DCT 具有能使图像的最重要的信息集中在DCT 的几个系数上的性能。正是基于此,DCT 通常应用于图像的压缩。

clear all
clc
I=imread('D:\pic\DIP3E_CH11_Original_Images\Fig1137(b)(painting_translated_padded).tif','tif');I=im2double(I);
T=dctmtx(8);
B=blkproc(I,[8,8],'P1*x*P2',T,T');
mask=[1 1 1 1 0 0 0 0;1 1 1 0 0 0 0 0;1 1 0 0 0 0 0 0;...1 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0;...0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0];
B2=blkproc(B,[8,8],'P1.*x',mask);
I2=blkproc(B2,[8,8],'P1*x*P2',T',T);
imshow(I),title('原图象');
figure,imshow(I2),title('变换后的图象');

利用离散余弦变换进行JPEG 图像压缩

clear all
clc
I=imread('D:\pic\DIP3E_CH11_Original_Images\Fig1137(b)(painting_translated_padded).tif'); %读入原图像;
I=im2double(I); %将原图像转为双精度数据类型;
T=dctmtx(8); %产生二维DCT 变换矩阵
B=blkproc(I,[8 8],'P1*x*P2',T,T'); %计算二维DCT,矩阵T 及其转置T’是DCT 函数
%P1*x*P2 的参数
mask=[ 1 1 1 1 0 0 0 0;1 1 1 0 0 0 0 0;1 1 0 0 0 0 0 0;1 0 0 0 0 0 0 0;...0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0];
%二值掩膜,用来压缩DCT 系数,只留下DCT 系数中左上角的10 个
B2=blkproc(B,[8 8],'P1.*x',mask); %只保留DCT 变换的10 个系数
I2= blkproc(B2,[8,8],'P1*x*P2',T',T); %逆DCT,重构图像
Subplot(1,2,1);
Imshow(I);title('原图像');%显示原图像
Subplot(1,2,2);
Imshow(I2);title('压缩图像');%显示压缩后的图像。对比原始图像和压缩后的图像,虽然
%舍弃了85%的DCT 系数,但图像仍然清晰(当然有一些质量损失)

参考文献:

[1] Rafael C. Gonzalez, Richard E. Woods, and Steven L. Eddins. 2003. Digital Image Processing Using MATLAB. Prentice-Hall, Inc., USA.

[2] 阮秋琦. 数字图像处理(MATLAB版)[M]. 北京:电子工业出版社, 2014.

[3] 冈萨雷斯. 数字图像处理(第三版)[M]. 北京:电子工业出版社, 2011.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/353175.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

图像压缩相关内容简介

历史 图像压缩的研究起源于20世纪40年代。1948年香农的经典论文《通信的数学原理》中首次提到信息率深圳函数的概念,1959年他又建立了率失真理论,从而奠定了信源编码的理论基础。随后伯杰等人有对其进行了深入的研究,并取得了一定的进步&…

移动端做安全测试的重要性

安全性测试的目的是发现危害手机中数据的安全和完整性的错误和缺陷。发现安全错误通常是比较困难的,软件通常功能运行正常但却不安全。 一、软件权限 APP软件权限包括:网络通信、信息发送、自动启动、 媒体录制、读取用户信息、写入用户数据等权限,因关系到用户个人信息和隐私…

cad 打开硬件加速卡_CAD如何根据已知条件设计图形

1、打开CAD,在左下角把极轴追踪打开(鼠标右键点击,选择90度打√)、把对象捕捉打开(鼠标右键点击,选择中点)。 2、然后在操作界面画线,如图我们已知直角边885和750,方法是按长8852、高750来绘制三点定圆弧。先画8852177…

C#ObjectArx Cad将图形范围缩放至指定实体

先上代码&#xff08;亲测可用&#xff09;&#xff1a; /// <summary>/// 定位缩放值指定实体/// </summary>/// <param name"oid"></param>public static void Orientate(ObjectId oid){try{Entity current_entity GetEntity(oid);curren…

CAD图层设置

一、图层介绍 我们可以把图层想象为一张没有厚度的透明纸&#xff0c;各层之间完全对齐&#xff0c;一层上的某一基准点准确地对准其他各层上的同一基准点。用户可以给每一图层指定所用的线型、颜色&#xff0c;并将具有相同线型和颜色的对象放在统一图层&#xff0c;这些图层…

cad打印本计算机未配置,CAD打印的基本设置详细教程

CAD打印的基本设置详细教程 开始画图之前我们就考虑到打印的需要&#xff0c;要用多大纸张&#xff0c;打印比例应该设置成多少&#xff0c;打印后的字高、线宽、颜色应该设置成多少&#xff0c;在绘制图形的时候&#xff0c;这些为打印而做的准备工作必须做好。要想正确地打印…

CAD打印图形、输出图形

打印图形 指定打印范围、打印比例、图纸大小、打印样式、页边距等参数&#xff0c;打印图纸。 1.单击常用工具栏的“打印图形”按钮。 2.在命令行中输入Plot&#xff0c;按回车键。 打印界面如下 &#xff1a; 界面信息 &#xff08;1&#xff09;选择打印机&#xff1a;默…

CAD梦想画图中如何设置图层

图层介绍 我们可以把CAD对象想象成一张没有厚度的透明纸&#xff0c;各层之间完全对齐&#xff0c;一层上的某一基准点准确的对准其它各层上的同一基准点。用户可以给每一图层指定所用的线型、颜色与线宽&#xff0c;并将其相同线型和颜色的对象放在同一图层&#xff0c;这些图…

AUTOCAD——图形单位与图形边界

图形单位 控制长度与角度的显示精度与格式。 1.执行方式 命令行&#xff1a;DDUNITS 菜单栏&#xff1a;格式→单位 “图形单位操作命令位置”界面 执行以上命令后&#xff0c;系统会弹出如下图所示的“图形单位”对话框。 2.选项说明 &#xff08;1&#xff09;长度与角…

OSSIM进行主机漏洞扫描(03)

OSSIM进行主机漏洞扫描方式 按照如图选择&#xff0c;ENVIRONMENT–SCAN JOBS–NEW SCAN JOB进入新增页面 其中各选项含义如下 Job Name:扫描任务名称。 Select Sensor:扫描的嗅探器。 Profile:扫描的类型&#xff0c;包括Deep- Non destructive Full and Slow scan(深入)、D…

Spring Boot 系统初始化器详解

Spring Boot 3.x系列文章 Spring Boot 2.7.8 中文参考指南(一)Spring Boot 2.7.8 中文参考指南(二)-WebSpring Boot 源码阅读初始化环境搭建Spring Boot 框架整体启动流程详解Spring Boot 系统初始化器详解 自定义系统初始化器 Spring Boot 有多种加载自定义初始化器的方法&am…

网络故障管理

网络故障管理是以最快的方式查找、隔离和排除网络故障的过程。故障管理是网络管理的重要组成部分&#xff0c;它通过快速解决故障来最大限度地减少停机时间并防止设备故障&#xff0c;从而确保最佳的网络可用性并防止业务损失。 网络故障监控是故障管理的第一步&#xff0c;因…

NLP+VS︱深度学习数据集标注工具、图像语料数据库、实验室搜索ing....

from: https://blog.csdn.net/sinat_26917383/article/details/54908389 一、NLP标注工具 来源&#xff1a;《构想&#xff1a;中文文本标注工具&#xff08;附开源文本标注工具列表&#xff09;》 Chinese-Annotator 来源&#xff1a;https://github.com/crownpku/Chinese-…

wince集锦

为什么80%的码农都做不了架构师&#xff1f;>>> WinCE驱动开发问题精华集锦在mediaplayer全屏播放的时候&#xff0c;我可以用键盘上的某一个键调节声音大小&#xff0c;现在我想在屏幕上显示调节的结果就跟我们看电视一样能出来一些标记。当声音变大在屏幕上就增多…

k8s技术预研8--深入掌握Kubernetes Service

本文内容已经基于k8s v1.8.8进行了验证测试。 k8s的Service定义了一个服务的访问入口地址&#xff0c;前端的应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例&#xff0c;来自外部的访问请求被负载均衡到后端的各个容器应用上。Service与其后端Pod副本集群之间则…

spring boot 与 iview 前后端分离架构之开发环境基于docker的部署的实现(三十六)

spring boot 与 iview 前后端分离架构之开发环境基于docker的后端的部署的实现&#xff08;三十六&#xff09; 公众号基于docker的后端的部署安装mysql数据库创建数据库 安装redis安装docker创建基础镜像编写后台管理系统的DockerFile文件pom.xml的配置新增application-prod.y…

回归模型评价指标R2_score

搞清楚R2_score计算之前&#xff0c;我们还需要了解几个统计学概念。 若用 y i y_i yi​表示真实的观测值&#xff0c;用 y ˉ \bar{y} yˉ​表示真实观测值的平均值&#xff0c;用 y i ^ \hat{y_i} yi​^​表示预测值,则&#xff1a; 回归平方和&#xff1a;SSR 即估计值与…

Python网络编程

查看Python中支持的编码方式&#xff1a;https://docs.python.org/3/library/codecs.html?highlightutf IP地址工具&#xff1a;http://ipblock.chacuo.net/ 查看应用程序进程PID&#xff1a; 1.启动任务管理器&#xff0c;点击进程&#xff1a;默认是这样的&#xff1a; 2…

Redis的安装等相关问题

1.1 下载 从官网下载&#xff0c;Redis官网点击下载 或者直接下载整合下好的&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Vj9jNq2mh5lZLVFSVo5cFw&shflsharepset 提取码&#xff1a;m599 通过SecureCRT将下载的文件上传到/opt/work目录 如果上传rz不能使用…

路由器 ------ 动态路由 (1) ---- RIP

RIP &#xff1a; 根据Bellman-Ford算法计算路由 距离矢量型协议&#xff08;DV&#xff09;---- 路由器之间传递路由条目 &#xff1b;距离就是开销值&#xff0c;矢量就是下一跳 邻居关系 ---- 相邻的两个路由器&#xff0c;链接在共同的广播域内&#xff0c;通过广播的形…