Matlab图像处理——图像编码解码

1.霍夫曼编码和解码
clear
clc
I=imread('lena.bmp');
I=im2double(I)*255;
[height,width]=size(I);				%求图像的大小
HWmatrix=zeros(height,width);
Mat=zeros(height,width);				%建立大小与原图像大小相同的矩阵HWmatrix和Mat,矩阵元素为0。
HWmatrix(1,1)=I(1,1);				%图像第一个像素值I(1,1)传给HWmatrix(1,1)
for i=2:height						%以下将图像像素值传递给矩阵Mat
    Mat(i,1)=I(i-1,1);
end
for j=2:width
    Mat(1,j)=I(1,j-1);
end
for i=2:height						%以下建立待编码的数组symbols和每个像素出现的概率矩阵p
    for j=2:width
        Mat(i,j)=I(i,j-1)/2+I(i-1,j)/2;
    end
end
Mat=floor(Mat);HWmatrix=I-Mat;
SymPro=zeros(2,1); SymNum=1; SymPro(1,1)=HWmatrix(1,1); SymExist=0;
for i=1:height
    for j=1:width
        SymExist=0;
        for k=1:SymNum
            if SymPro(1,k)==HWmatrix(i,j)
                SymPro(2,k)=SymPro(2,k)+1;
                SymExist=1;
                break;
            end
        end
        if SymExist==0
          SymNum=SymNum+1;
          SymPro(1,SymNum)=HWmatrix(i,j);
          SymPro(2,SymNum)=1;
        end
    end
end
for i=1:SymNum
    SymPro(3,i)=SymPro(2,i)/(height*width);
end
symbols=SymPro(1,:);p=SymPro(3,:);
[dict,avglen] = huffmandict(symbols,p);			%产生霍夫曼编码词典,返回编码词典dict和平均码长avglen
actualsig=reshape(HWmatrix',1,[]);
compress=huffmanenco(actualsig,dict); 			%利用dict对actuals来编码,其结果存放在compress中
UnitNum=ceil(size(compress,2)/8); 
Compressed=zeros(1,UnitNum,'uint8');
for i=1:UnitNum
    for j=1:8
        if ((i-1)*8+j)<=size(compress,2)
        Compressed(i)=bitset(Compressed(i),j,compress((i-1)*8+j));
        end
    end
end
NewHeight=ceil(UnitNum/512);Compressed(width*NewHeight)=0;
ReshapeCompressed=reshape(Compressed,NewHeight,width);
imwrite(ReshapeCompressed,'Compressed Image.bmp','bmp');
Restore=zeros(1,size(compress,2));
for i=1:UnitNum
    for j=1:8
        if ((i-1)*8+j)<=size(compress,2)
        Restore((i-1)*8+j)=bitget(Compressed(i),j);
        end
    end
end
decompress=huffmandeco(Restore,dict); 			%利用dict对Restore来解码,其结果存放在decompress中
RestoredImage=reshape(decompress,512,512);
RestoredImageGrayScale=uint8(RestoredImage'+Mat);
imwrite(RestoredImageGrayScale,'Restored Image.bmp','bmp');
figure;
subplot(1,3,1);imshow(I,[0,255]);				%显示原图
subplot(1,3,2);imshow(ReshapeCompressed);		%显示压缩后的图像
subplot(1,3,3);imshow('Restored Image.bmp');		%解压后的图像

 

2.行程编码方法对二值图像进行编解码
clear
clc
I1=imread('lena.bmp');  					%读入图像
I2=I1(:);  								%将原始图像写成一维的数据并设为 I2
I2length=length(I2); 						%计算I2的长度
I3=im2bw(I1,0.5);						%将原图转换为二值图像,阈值为0.5
%以下程序为对原图像进行行程编码,压缩
X=I3(:);  								%令X为新建的二值图像的一维数据组
L=length(X);
j=1;
I4(1)=1;
for z=1:1:(length(X)-1)  					%行程编码程序段
    if  X(z)==X(z+1)
        I4(j)=I4(j)+1;
    else
        data(j)=X(z);  							% data(j)代表相应的像素数据
        j=j+1;
        I4(j)=1;
    end
end
data(j)=X(length(X)); 					%最后一个像素数据赋给data
I4length=length(I4);  					%计算行程编码后的所占字节数,记为I4length
CR=I2length/I4length; 					%比较压缩前于压缩后的大小
%下面程序是行程编码解压
l=1;
for m=1:I4length
    for n=1:1:I4(m);
        decode_image1(l)=data(m);
        l=l+1;
    end
end
decode_image=reshape(decode_image1,512,512); %重建二维图像数组
figure,
x=1:1:length(X);
subplot(131),plot(x,X(x));%显示行程编码之前的图像数据
y=1:1:I4length ;
subplot(132),plot(y,I4(y));%显示编码后数据信息
u=1:1:length(decode_image1);
subplot(133),plot(u,decode_image1(u));%查看解压后的图像数据
subplot(121);imshow(I3);%显示原图的二值图像
subplot(122),imshow(decode_image); 			%显示解压恢复后的图像
disp('压缩比: ')
disp(CR);
disp('原图像数据的长度:')
disp(L);
disp('压缩后图像数据的长度:')
disp(I4length);
disp('解压后图像数据的长度:')
disp(length(decode_image1));

 

3.对图像进行JPEG编码
clear
clc
ORIGIN=imread('lena.bmp');			%读入原始图像 
%步骤1:正向离散余弦变换(FDCT)
fun=@DCT_Measure;
%步骤2:量化
B=blkproc(ORIGIN,[8,8],fun);			%得到量化后的系数矩阵,与原始图像尺寸相同,需要进一步处理
n=length(B)/8; 						%对每个维度分成的块数
C=zeros(8);						%初始化为8×8的全0矩阵
for y=0:n-1
    for x=0:n-1
        T1=C(:,[end-7:end]);			%取出上一组数据做差分,T1的所有8行和最后8列组成的8*8
        T2=B(1+8*x:8+8*x,1+8*y:8+8*y);
        T2(1)=T2(1)-T1(1);			%直流系数做差分
        C=[C,T2];					%将C和T2矩阵串联
    end
end
C=C(:,[9:end]);						%去除C的前8列,就是前面的全0
%步骤4:利用Code_Huffman( )函数实现上述JPEG算法步骤中的步骤3、4、5和6步
JPGCode={''};						%存储编码的元胞初始化为空的字符串
for a=0:n^2-1
    T=Code_Huffman(C(:,[1+a*8:8+a*8]));
    JPGCode=strcat(JPGCode,T);
end
sCode=cell2mat(JPGCode);			%将元胞转化为数组
Fid=fopen('JPGCode.txt','w');			%用变量fid标记I/O流,打开文本文件
fprintf(Fid,'%s',sCode);				%将压缩码sCode保存到文本文件中。添加而不是覆盖
fclose(Fid);						%关闭I/O流
[x y]=size(A);
b=x*y*8/length(sCode);
v=8/b; 							%计算压缩比和压缩效率
disp('JPEG压缩数据已保存至JPGCode.txt中!');
disp(['压缩比为:',num2str(b),';压缩效率:',num2str(v)]);

最后:

如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!

5a8015ddde1e41418a38e958eb12ecbd.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

清洁力强的洗地机什么牌子最好?深度清洁的洗地机推荐

在相信很多人在做家务时&#xff0c;或许都会遇到一个尴尬的境地&#xff1a;虽然使用吸尘器清理了地面上的尘土和杂物&#xff0c;然后再使用拖把擦洗地板&#xff0c;但往往还是无法达到十分干净的效果。扫地机器人对于着色严重的垃圾&#xff0c;往往会出现越拖越脏的情况。…

Vue3之生命周期基础介绍

让我为大家介绍一下vue3的生命周期吧&#xff01; 创建阶段&#xff1a;setup 我们直接console.log就可以了 console.log("创建");挂载阶段&#xff1a;onBeforeMount(挂载前)、onMounted(挂载完毕) import { onBeforeMount, onMounted } from vue; // 挂载前 on…

【前端】Vue-Cli 快速创建Vue3项目及一些项目初始化相关

文章目录 前言1. 安装1.1 安装 Vue 脚手架1.2 创建项目1.3 本地运行项目 2. 推送到仓库2.1 远程仓库准备2.2 关于gitIgnore文件2.3 通过git推送至远程仓库 3. 补充与总结3.1 npm 版本是否要升级到最新&#xff1f;3.2 这个项目建议的各种版本3.3 一般前端gitIgnore文件3.4 推荐…

蚂蚁集团开始招聘华为鸿蒙应用研发工程师

早在2023年12月7日支付宝宣布将全面启动鸿蒙原生应用开发。华为表示&#xff0c;支付宝将基于HarmonyOS NEXT版本开发应用&#xff0c;给消费者带来全场景的新体验。头部应用伙伴的加入&#xff0c;大力推动了鸿蒙生态进一步完善。 就近期蚂蚁集团开始招聘华为鸿蒙应用研发工程…

【2024软件测试面试必会技能】Jmeter+ant+jenkins实现持续集成

jmeterantjenkins持续集成 一、下载并配置jmeter 首先下载jmeter工具&#xff0c;并配置好环境变量&#xff1b;参考&#xff1a;https://www.cnblogs.com/YouJeffrey/p/16029894.html jmeter默认保存的是.jtl格式的文件&#xff0c;要设置一下bin/jmeter.properties,文件内容…

成为高级性能测试:发现性能瓶颈掌握性能调优

当下云计算、大数据盛行的背景下&#xff0c;大并发和大吞吐量的需求已经是摆在企业面前的问题了&#xff0c;其中网络的性能要求尤为关键&#xff0c;除了软件本身需要考虑到性能方面的要求&#xff0c;一些硬件上面的优化也是必不可少的。 作为一名测试工作者&#xff0c;对…

SICTF Round#3 の WP

Misc 签到 SICTF{1f4ce05a-0fed-42dc-9510-6e76dff8ff53} Crypto [签到]Vigenere 附件内容&#xff1a; Gn taj xirly gf Fxgjuakd, oe igywnd mt tegbs mnrxxlrivywd sngearbsw wakksre. Bs kpimj gf tank, it bx gur bslenmngn th jfdetagur mt ceei yze Ugnled Lystel t…

书生·浦语大模型实战营-第六课笔记

1.评测追魂夺命三连问 2.主流大拿有话说-评测框架 3.友商最棒儿子最亲&#xff0c;好瓜都是王婆的 4.真枪实弹上战场 为了给平台省点电&#xff0c;我用了自家的电和自家的电脑进行评测。评测的模型也是之前在自己电脑上跑了3轮花费30多个小时的第四课作业微调的法律大模型。s…

智能测径仪 针对设备自身抖动都做了哪些创新加强设计

关键字:测径仪外壳设计,测径仪内部结构,外壳刚性振动,产线共振现象,镜头纯手工擦拭清洗,测径仪智能防抖算法,测径仪多重防抖技术,测径仪防抖技术,测径仪自身防抖&#xff0c; 在生产过程中&#xff0c;被测物不可避免的会发生抖动&#xff0c;测径仪本身也会产生抖动,只是抖动幅…

数据库专题——分库分表

一. 分库分表介绍二. 分库分表实践 一. 分库分表介绍 1.1 分库分表解决了什么问题 先说分库&#xff1a; 《高性能MySQL》中提到了两种数据库扩展方式&#xff1a;垂直扩展和水平扩展。前者意味着买更多性能强悍的硬件&#xff0c;但是总会达到扩展的天花板&#xff0c;且成本…

数字信号处理:傅里叶分析

本文主要参考视频如下&#xff1a; 数字信号处理9-1_线性时不变系统对复指数信号的响应_哔哩哔哩_bilibili 傅里叶分析的主要研究内容如下所示&#xff1a; 注意&#xff0c;计算机中使用的离散傅里叶变换并不是离散时间傅里叶变换&#xff1b; 前四种都是理论上的变换方式&…

mysql 2-21

约束的分类 添加约束 查看表约束 非空约束 唯一性约束 复合的唯一性约束 只要有一个字段不重复&#xff0c;就可以添加成功 主键约束 自增列 mysql 8.0具有持久化&#xff0c;重启服务器会继续自增 外键约束 创建外键 关联必须有唯一性约束&#xff0c;或者是主键 约束等级 …

创意办公:专注 ONLYOFFICE,探索办公新境界

一.ONLYOFFICE 介绍 ONLYOFFICE 是一个基于 Web 的办公套件&#xff0c;提供了文档处理、电子表格和演示文稿编辑等功能。它被设计为一个协作工具&#xff0c;支持多人实时协作编辑文档&#xff0c;并且可以在本地部署或者作为云服务使用。 二.ONLYOFFICE 特点和功能 以下是 …

Eclipse的Java Project的入口main函数

在使用Eclipse创建java project项目的时候&#xff0c;一个项目里面通常只有一个main&#xff0c;那么一个项目里面是否可以有多个main函数呢&#xff1f;其实可以的&#xff0c;但是运行java application的时候要选择执行哪个main函数。 下面举个例子&#xff1a; 1、创建一个…

Unity3d Shader篇(七)— 纹理采样

文章目录 前言一、什么是纹理采样&#xff1f;1. 纹理采样的工作原理2. 纹理采样的优缺点优点缺点 二、使用步骤1. Shader 属性定义2. SubShader 设置3. 渲染 Pass4. 定义结构体和顶点着色器函数5. 片元着色器函数 三、效果四、总结使用场景 前言 纹理采样是一种常用的图形学技…

线性代数:向量组的秩

目录 回顾“秩” 及 向量组线性表示 相关特性 向量组的秩 例1 例2 矩阵的“秩” 及 向量组线性表示 相关特性 向量组的秩 例1 例2

详解动态内存管理!

目录 ​编辑 1.为什么要用动态内存分配 2.malloc和free 2.1 malloc 2.2 free 3.calloc和realloc 3.1 calloc 3.2 realloc 4.常见的动态内存的错误 4.1 对NULL的解引用操作 4.2 对动态内存开辟空间的越界访问 4.3 对非动态内存开辟空间用free释放 4.4 使用free释放动…

⭐北邮复试刷题106. 从中序与后序遍历序列构造二叉树__递归分治 (力扣每日一题)

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postor…

RLT8762D---WDG 模块

0 Preface/Foreword 1 working mechanism 1.1 看门狗配置 1.2 喂狗定时器驱动 喂狗定时器回调函数&#xff1a; 1.3 初始化定时器 1.3.1 启动喂狗定时器 1.3.2 使能ROM看门狗 1.4 喂狗 定时器发送喂狗消息。 WDG_Restart()用于喂狗&#xff0c;comment out之后&#xff0…

Stable Diffusion 绘画入门教程(webui)-ControlNet(姿态预处理器openpose)

本片文章接着上篇文章ControlNet介绍他的控制类型&#xff0c;本篇介绍的预处理器为openpose 预处理器&#xff1a;openpose 模型&#xff1a;control_v11p_sd15_openpose 没下载模型的看上篇文章去下载一下哦&#xff0c;不然用不了 文章目录 一、干什么用的二、详细用法1、选…