课程要求

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. 20, CSS 定义选择器

    1. ID 与类 2. 层叠 3. 分组 4. 继承 5. 上下文选择器 6. 子类选择器 7. 其他选择器 8. 结构与注释 20.1 ID 与类 选择器是用于控制页面设计的样式.即 ID 选择器何 ...

  2. vue从入门到进阶:Vuex状态管理(十)

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 在 Vue 之后引入 vuex 会进行自动 ...

  3. Dynamics CRM教程:制作普通图表并放入仪表盘中

    关注本人微信和易信公众号: 微软动态CRM专家罗勇,回复143或者20150325可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!     我有个小需求,就是看我家特 ...

  4. word中字体大小(pt)和网页中css设置font-size时用的px大小对应关系

    pt与px转换关系为 1px= 0.75pt. 所以word中五号字体(10.5pt)在网页中对应的大小为font-size:14px.(10.5 / 0.75 = 14) 初号44pt 小初36pt ...

  5. Android 通过反射获取DatePicker 中的控件,并改变其颜色

    到最后也只是成功改变了中间部分的颜色. private void setDatePickerDividerColor(DatePicker datePicker) { // Divider chang ...

  6. 对象的使用处理,作用域的和ajax中this的理解

    首先,封装类,理解清楚你需要用的哪几个变量,然后声明,然后在类里封装函数,其中,constructor就是存放初始变量的地方. 这里还是datatable的处理解决, constructor(tabl ...

  7. 领域驱动设计(DDD:Domain-Driven Design)

    领域驱动设计(DDD:Domain-Driven Design) Eric Evans的"Domain-Driven Design领域驱动设计"简称DDD,Evans DDD是一套 ...

  8. ORACLE中关于表的一些特殊查询语句

    1: 如何判断字段的值里面:那些数据包含小写字母或大小字母 判断字段NAME的值里面有小写字母的记录 方式1: SELECT NAME FROM TEST WHERE regexp_like(NAME ...

  9. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  10. 【PAT】B1016 部分A+B

    水题 以字符和字符串形式储存输入,比较,计算出两个个数的D的个数,用for循环拼成P,相加得出结果 #include<stdio.h> int main(){ char A[20],DA, ...