课程要求

Assignment IV Transform + Quantization + Entropy Coding

Input: an intra-frame or a residue picture after motion compensation.

Task: Code the input picture into a bitstream  and decode the picture from the generated bitstream.

Specifications: Implement a transform-based codec, consisting transform, quantization, and entropy coding.  The block size can be 8x8, 16x16, or other reasonable sizes. As in most existing image/video codecs, you can use 2D DCT. A simple uniform quantizer could be used for verification purpose.  For the entropy coding, you can use either Huffman coding or arithmetic coding

README

运行main函数,注意main函数用到了下面的Normalize函数
指定待处理的图片,依次对图片进行一下变换:
一、灰度化
二、8 * 8 DCT变换(这一步r)如果加上一个掩模可以去除图片中人眼不敏感的高频分量,从而进一步压缩图片
三、量化处理(采用JPEG亮度量化表,将DCT举证除以量化码表),由于量化后有取整操作,因此是有损压缩图片
四、Huffman编码,编码得到的比特流序列比原序列更加短小,进一步提高传输效率
五、发送方比特流序列传输(将上一步得到的比特流进行传输)
%中间对比了直接传输图片的比特流长度和经过压缩变换得到的比特流长度
六、接收方接收比特流序列
七、解码,是Huffman编码的逆过程,得到量化后的序列
八、反量化处理,是第三步的逆过程,将量化后的矩阵乘以量化码表
九、反DCT变换得到图片

main函数:

 clc;clear;

   %采用JPEG亮度量化表
Q =[ ]; X = ;%分块大小 I=imread('cameraman.jpg');%读取图像
gray_img = rgb2gray(I);%灰度化 I_DCT = blkproc(gray_img,[X X],'dct2');%对图像进行DCT变换, Iq = round(blkproc(I_DCT,[X X],'x./P1',Q));%量化处理 Iq = Iq + ;%量化处理之后,序列的symbol取-120到+120之间,为了方便编码,将其平移到0-255的区间 %哈夫曼编码
[M,N] = size(Iq);
I1 = Iq(:);
P = zeros(,);
for i = :
P(i+) = length(find(I1 == i))/(M*N);
end
k = :;
dict = huffmandict(k,P); %生成字典
enco = huffmanenco(I1,dict); %编码
%bitstream传输 %计算编码长度,计算压缩率
binaryComp = de2bi(enco);
encodedLen = numel(binaryComp);
imgLen = numel(de2bi(I1));
disp(strcat(['编码后传输的比特流长度为' num2str(encodedLen)]))
disp(strcat(['原图片二进制编码比特长度为' num2str(imgLen)]))
disp(strcat(['压缩率为' num2str(*(imgLen-encodedLen)/imgLen) '%'])) %bitstream接收
%哈夫曼解码
deco = huffmandeco(enco,dict);
Idq = col2im(deco,[M,N],[M,N],'distinct')-; %把向量重新转换成图像块,记得要把图像平移回去原来的区间; I_rq = round(blkproc(Idq,[X X],'x.*P1',Q));%反量化 I_rDCT = round(blkproc(I_rq,[X X],'idct2'));%对图像进行DCT反变换 I_rDCT = Normalize(I_rDCT);%归一化到0-255区间 figure
subplot(,,)
imshow(gray_img);
title('原图') subplot(,,)
%在matlab处理完数据好,我们希望显示或者imwrite写入图片时候,需要注意。如果直接对double之间的数据矩阵I运行imshow(I),
%我们会发现有时候显示的是一个白色的图像。 这是因为imshow()显示图像时对double型是认为在0~1范围内,即大于1时都是显示为白色,
%而imshow显示uint8型时是0~255范围。所以对double类型的图像显示的时候,要么归一化到0~1之间,
%要么将double类型的0~255数据转为uint8类型
imshow(I_rDCT/);
title('经压缩传输后解压的图像')

Normalize函数:

 function OutImg = Normalize(InImg)
ymax=;ymin=;
xmax = max(max(InImg)); %求得InImg中的最大值
xmin = min(min(InImg)); %求得InImg中的最小值
OutImg = round((ymax-ymin)*(InImg-xmin)/(xmax-xmin) + ymin); %归一化并取整
end

图像压缩编解码实验(DCT编码+量化+熵编码(哈夫曼编码))【MATLAB】的更多相关文章

  1. SDUT 3345 数据结构实验之二叉树六:哈夫曼编码

    数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 字符的编 ...

  2. SDUT OJ 数据结构实验之二叉树六:哈夫曼编码

    数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...

  3. 数据结构实验之二叉树六:哈夫曼编码(SDUT 3345)

    题解:离散中的"最小生成树(最优树)". #include <bits/stdc++.h> using namespace std; void qusort(int l ...

  4. Java实现哈夫曼编码和解码

    最近无意中想到关于api返回值加密的问题,譬如我们的api需要返回一些比较敏感或者重要不想让截获者得到的信息,像如果是做原创图文的,文章明文返回的话则有可能被抓包者窃取. 关于请求时加密的方式比较多, ...

  5. [数据结构与算法]哈夫曼(Huffman)树与哈夫曼编码

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. [C++]哈夫曼树(最优满二叉树) / 哈夫曼编码(贪心算法)

    一 哈夫曼树 1.1 基本概念 算法思想 贪心算法(以局部最优,谋求全局最优) 适用范围 1 [(约束)可行]:它必须满足问题的约束 2 [局部最优]它是当前步骤中所有可行选择中最佳的局部选择 3 [ ...

  7. 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)

    哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...

  8. 基于哈夫曼编码的文件压缩(c++版)

    本博客由Rcchio原创 我了解到很多压缩文件的程序是基于哈夫曼编码来实现的,所以产生了自己用哈夫曼编码写一个压缩软件的想法,经过查阅资料和自己的思考,我用c++语言写出了该程序,并通过这篇文章来记录 ...

  9. java实现哈夫曼编码

    java实现哈夫曼编码 哈夫曼树   既然是学习哈夫曼编码,我们首先需要知道什么是哈夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫 ...

随机推荐

  1. 面试题之(HTTP协议)【转】

    转自:http://www.cnblogs.com/ranyonsue/p/5984001.html HTTP简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协 ...

  2. [JS设计模式]:单例模式(1)

    什么是单例模式 所谓单例,就是一个类只有一个实例,实现的方法一般是先判断是否存在实例,如果存在就直接返回,如果不存在就创建了再返回.这样确保了一个类只有一个实例对象. 实现的单例有很多种方式,最简单的 ...

  3. 2019-02-20 在PyPI测试平台发布Python包

    参考Packaging Python Projects, 源码在nobodxbodon/test-package-for-pypi 包名/__init__.py: 测试变量 = "值&quo ...

  4. 仿9GAG制作过程(三)

    有话要说: 这次准备讲述后台服务器的搭建以及前台访问到数据的过程. 成果: 准备: 安装了eclipse 安装了Tomcat7 安装了数据库管理工具:Navicat 搭建服务器: 用eclipse直接 ...

  5. 【资源分享】ArcFace Demo [Android]

    虹软人脸识别引擎Android的Demo演示,可以直接下载使用. 下载地址: https://github.com/asdfqwrasdf/ArcFaceDemo readme: 工程如何使用? 下载 ...

  6. Kasaraju算法--强连通图遍历及其python实现

    在理解有向图和强连通分量前必须理解与其对应的两个概念,连通图(无向图)和连通分量. 连通图的定义是:如果一个图中的任何一个节点可以到达其他节点,那么它就是连通的. 例如以下图形: 这是最简单的一个连通 ...

  7. angular应用容器化部署

    angular 应用容器化部署 Intro 我自己有做一个个人主页,虽然效果不怎么样(不懂设计的典型程序猿...),但是记录了我对于前端框架及工具的一些实践, 从开始只有一个 angularjs 制作 ...

  8. Lua在Redis中的应用

    转载至笑松小站http://blog.seoui.com/2018/01/27/redis-lua/ redis从2.6版本开始内置支持Lua解释器,解释器提供了3个函数来处理redis的命令redi ...

  9. Mina的IoBuffer改造成Netty的ByteBuff

    背景:部标GPS通讯底层全部改造成基于Netty服务器实现的,现将Mina的依赖移除,修改过程中有用到缓冲区的读写.现做了如下修改: 原有基于Mina的IoBuffer对字节读写封装代码如下: pac ...

  10. 字符是否为SQL的保留字

    要想知道字符是否为MS SQL Server保留字,那我们必须把SQL所有保留字放在一个数据集中.然后我们才能判断所查找的字符是否被包含在数据集中. MS SQL Server保留字: ) = 'ad ...