当前位置:首页 » 文件管理 » 图像压缩matlab程序

图像压缩matlab程序

发布时间: 2023-01-27 07:30:20

❶ MATLAB编写基于离散正弦变换(DCT)的图像压缩程序

I=imread('cameraman.tif')
I=im2double(I) %转换图像矩阵为双精度型。
T=dctmtx(8) %产生二维DCT变换矩阵
%计算二维DCT,矩阵T及其转置是DCT函数P1*X*P2的参数
B=blkproc(I,[8,8],'P1*x*P2',T,T') %二值掩模,用来压缩DCT系数,只留下DCT系数中左上角的10个
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) %只保留DCT变换的10个系数
I2=blkproc(B2,[8 8],'P1*x*P2',T',T) %重构图像
subplot(1,2,1)
imshow(I)
title('原始图像');
subplot(1,2,2)
imshow(I2);
title('压缩图像');
我这个程序也是改了后的,不过我运行过了,图片压缩效果都能出来,就是压缩比没有变小,我也不知道为什么,如果有人给决绝了麻烦通知一下,我邮箱[email protected]

❷ 怎么用matlab把压缩成tiff

1.用matlab实现图像压缩时,如何将图片仿真
图像压缩是当今信息时代迫切需求的一门图像处理技术,它极大的减少了图像的数据量,为图像的存储,传输提供了方便。

小波变换,是一种广泛用于图像压缩的方法。它能让图像按不同的分辨率分析。

根据Mallat算法的思想,图像能分解成一个轮廓信号(低频子图)和水平,垂直,对角线三个方向上的细节信号(高频子图)。而轮廓信号又可以进一步分解。

而图像的主要能量部分是低频部分,而且人眼视觉系统对低频部分更为敏感,所以可以对低频部分采用较低压缩比;对高频部分采用较大压缩比来进行压缩。 本文提出的是一种结合小波变换,DCT变换和矢量量化的压缩方法。

根据人眼的视觉特性,首先对图像进行小波分解,然后,对低频分量进行压缩比不大的DCT变换;对不同方向不同分辨率的高频分量进行不同码字大小的矢量量化编码,然后对反变换和解码后的系数进行小波重构。矢量量化过程中的码书设计采用的是LBG算法。

这样,根据对图像质量的不同要求,我们可以改变小波分解的层数,来得到不同压缩比的图像。本篇论文只对小波分解一层和两层后压缩进行了仿真和分析,表明该方案结合了各种压缩方法的优点,在满足图像质量的同时能得到较大的压缩比。

目前,在包装装潢设计中常用的图形处理软件有Pho-toshop,CorelDraw,AutoCAD等。但是这些软件中很少涉及到对图像进行压缩处理,以满足图像进行传输和储存的需要。

基于这一点考虑,在此尝试着用MATLAB编程来处理包装装潢图像的压缩,实现包装与计算机的紧密结合。 1 MATLAB MATLAB是MathWorks公司推出的一套高性能的数值计算和可视化软件,它集数值分析、矩阵运算、信号处理和图像显示于一体,它附带的小波分析工具箱功能强大,可以完成小波分析的绝大部分工作。

MATLAB工具箱的出现避免了程序设计中的重复性劳动,缩短了开发周期,降低了成本,因而受到工科院校师生和研究人员的青睐。 在介绍利用MATLAB小波工具压缩图像的文献中,总是将真彩色RGB图像转换为灰度级索引图像进行处理.经过这种处理以后,图像的存储数据能得到一定的压缩,但由压缩后的数据难以恢复成理想的彩色图像。

文中用MATLAB中有关函数处理图像压缩,而且由压缩后的数据可以还原出图像.实验结果表明,还原出的图像效果是理想的。文中主要以lena图像的处理为例,对它进行二进小波多层分解后,将低频和高频近似的系数矩阵作相应的处理,来研究用MATLAB中的小波工具箱压缩图像的方法。

2 图像压缩方法 在实际应用中,首先需要从图像文件中读取图像数据.MATLAB使用imreed()函数完这一任务.例如,在电脑D盘中有一彩色图像文件picl.jps,则可由下述语句读取: X=imread(′D:\picl.′); MATLAB图像处理工具箱支持4种基本图像类型:索引图像、灰度图像、二进制图像和RGB图像.MATLAB直接从图像文件中读取的图像为RGB图像.它存储在三维数组中。这个三维数组有3个面,依次对应子红(Red)、绿(Green)、蓝(Blue)3种颜色,而面中的数据则分别是这3种颜色的强度值,面中的元素对应于图像中的像素点。

索引图像数据包括图像矩阵X与颜色图数组map,其中颜色图map是按图像中颜色值进行排序后的数组。对于每个像素,图像矩阵X包含一个值,这个值就是颜色图数组map中的索引。

颜色图map为m*3双精度矩阵,各行分别指定红、绿、蓝(R、G、B)单色值,map=〔RGB〕,R、C、B为值域为〔0,1〕的实数值,m为索引图像包含的像素个数.然后可根据情况采用不同的小波函数,进行索引图像的分解压缩。这里对上面产生的索引图像X用dbl小波进行2层分解。

〔c,l〕=wavedec2(X,2,′dbl′)。 在这里,一个索引图像作小波分解后,可得到一系列不同分辨率的子图像,不同分辨率的子图像对应的频率是不相同的.高分辨率(即高频细节)子图像上大部分点的数值接近于0,越是高频这种现象越明显.对一个图像来说,表现一个图像最主要的部分是低频(即近似)部分。

多层小波分解的所有成分系数均保存在向量c中,低频近似与高频细节的系数需从向量C中提取。MATLAB分别使用appcoet2()和detcoef2()函数来完成这一工作。

这种方法是对低频和高频部分进行处理,因而提取低频和高频近似系数。 cAl=appcoef2(c,1,′dbl,′1);cH1=detcoef2(′h′,c,1,1); cDl=detcoef2(′d′,c,l,1);cVl=detcoef2(′v′,c,l,1)。

matlab实现离散余弦变换压缩(JPEG压缩原理) JPEG图像压缩算法: 输入图像被分成8*8或16*16的小块,然后对每一小块进行二维DCT(离散余弦变换)变换,变换后的系数量化、编码并传输; JPEG文件解码量化了的DCT系数,对每一块计算二维逆DCT变换,最后把结果块拼接成一个完整的图像。在DCT变换后舍弃那些不严重影响图像重构的接近0的系数。

DCT变换的特点是变换后图像大部分能量集中在左上角,因为左上放映原图像低频部分数据,右下反映原图像高频部分数据。而图像的能量通常集中在低频部分。

实例程序: function Jpeg I=imread('D:\MATLAB7\toolbox\images\imdemos\cameraman.tif'); %该图片在安装matlab的目录中找,原图为灰度图象 。
2.使用MATLAB图像压缩怎么做
I = imread('cameraman.tif'); % 输入图像

I = im2double(I); % 数据类型转换

T = dctmtx(8); % 计算二维离散DCT矩阵

dct = @(x)T * x * T'; % 设置函数句柄

B = blkproc(I,[8 8],dct); % 图像块处理

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],@(x)mask.* x); % 图像块处理

invdct = @(x)T' * x * T; % 设置函数句柄

I2 = blkproc(B2,[8 8],invdct); % 图像块处理

imshow(I), figure, imshow(I2) % 显示原始图像和压缩重构图像
3.用matlab把11张tif图片做成一个连续动画
使用如下代码方式可以达到你想要的效果。

clear;

clc;

for i=2:50

c=strcat('a',num2str(i));%这里可以根据自己图片名字儿作相应的修改

c=strcat(c,'.bmp');

I=imread(c);

% I=rgb2gray(I)

figure(1);

imshow(I);

end

图片的保存方式如:a21.bmp,这样可以实现你的汽车动画。如果想要使用你的汽车图片做的话,请把汽车图片发给我,我帮你看看。

❸ 如何用MATLAB进行图像压缩

I=imread('cameraman.tif');%输入图像
I=im2double(I);%数据类型转换
T=dctmtx(8);%计算二维离散DCT矩阵
dct=@(x)T*x*T';%设置函数句柄
B=blkproc(I,[88],dct);%图像块处理
mask=[11110000%掩膜
11100000
11000000
10000000
00000000
00000000
00000000
00000000];
B2=blkproc(B,[88],@(x)mask.*x);%图像块处理
invdct=@(x)T'*x*T;%设置函数句柄
I2=blkproc(B2,[88],invdct);%图像块处理
imshow(I),figure,imshow(I2)%显示原始图像和压缩重构图像

❹ matlab 如何将图像缩放到指定像素大小的函数

1、首先打开电脑,然后在电脑中找到并打开matlab软件主界面,如图所示。

❺ 用matlab编DCT图像压缩的程序

兄弟 我题目跟你一样 你做出来了吗? 做出来给我也发下 万分感谢 QQ:380683781

❻ 用matlab压缩彩色图片可能变色吗

用matlab压缩彩色图片不会变色。matlab程序使用带有分块和子采样的余弦变换对灰度图像使用JPEG进行彩色图像压缩,不会产生变色问题。

❼ matlab图像压缩怎样换图片

可以整体去DCT转换编码;当我们拿到了一个图片,我们要将其压缩并且我们使用8*8的模块去分割;根据数学知识我们知道,如果我们想要用8*8分割并且不...

❽ matlab 图像压缩问题

通常进行小波压缩重构后的图像是与原图像相同尺寸的,除非你将其它高频系数都删去不用。压缩后的图像如果是xcomp的话,直接用size就行了吧。
据我所知xcomp应该不是重构后的图像,只是去噪后的图像,还得进行重构才能得到真正重构的图像。

那可能是我孤陋寡闻了,不过要评价是否被压缩了不是看图像的大小变了没有,而是看压缩后的图像占多少空间,即所占字节数,与原图所占空间相比,这样可以算出被压缩了多少了

那这样的话我看你要修改一下你的参数了,比如thr等应该是阈值吧。如果他里边的数据都成片的相同,应该说已经阈值分割了呀。那我就不太了解了。

❾ 图像压缩 MATLAB实现 如何解压缩一个被压缩过的图像 急急急

法对图像进行压缩,得到一组压缩编码,然后解码这组编码,得到一幅解压缩图像.对解码图像与原始图像求差值,得到一差值图像,然后对该差值图像进行适当的编码.对差值图像的编码与初级编码共同构成对原始图像的编码.这种方法需要选择合适的初级编码方法与差值编码方法,使得这两者相结合,可以得到一种综合性能较好的编码方法。
其定义如图。
%%%%%%%%%%%%%%

clear
tic
%Image1=imread('pic\cameraman.tif');
xianshi;
number=input(' input the number:');
Image1=suoxiao('pic\cameraman.tif',number);
[imagem imagen]=size(Image1);
Sr=4;Sd=8;
Rnum=(imagem/Sr)*(imagen/Sr);
Dnum=(imagem/Sd)*(imagen/Sd);
Image2=zeros(Dnum,Sr,Sr);
Image2=blkproc(Image1,[Sd/Sr,Sd/Sr],'mean(mean(x))');
%压缩image1为原来1/2
% there are no eight tranformation for simpleness
RBlocks=zeros(Rnum,Sr,Sr);
DBlocks=zeros(Dnum,Sd,Sd);
DBlocksRece=zeros(Dnum*8,Sr,Sr);
%%取R块,K记标号----------------------------------
for i=1:imagem/Sr
for j=1:imagen/Sr
k=(i-1)*imagen/Sr+j;
RBlocks(k,:,:)=Image1((i-1)*Sr+1:i*Sr,(j-1)*Sr+1:j*Sr);

end
end
%取R块,K记标号----------------------------------
for i=1:imagem/Sd
for j=1:imagen/Sd
k=(i-1)*imagen/Sd+j;
m=Sr;n=Sr;
DBlocksRece(k,:,:)=Image2((i-1)*Sr+1:i*Sr,(j-1)*Sr+1:j*Sr);
DBlocksRece(k+Dnum,:,:)=DBlocksRece(k,m:-1:1,:); % 行上下翻转===(x轴对称)
DBlocksRece(k+2*Dnum,:,:)=DBlocksRece(k,:,n:-1:1); % 列左右翻转 ==== y轴对称
DBlocksRece(k+3*Dnum,:,:)=DBlocksRece(k,m:-1:1,n:-1:1); % 先行翻,再列翻 旋转180度
DBlocksRece(k+4*Dnum,:,:)=reshape(DBlocksRece(k,:,:),Sr,Sr)'; % 关于y=-x对称
A=reshape( DBlocksRece(k+3*Dnum,:,:),Sr,Sr)';
DBlocksRece(k+5*Dnum,:,:)=A(:,n:-1:1); % 关于y=x对称
DBlocksRece(k+6*Dnum,:,:)=imrotate(reshape(DBlocksRece(k,:,:),Sr,Sr),90); % 逆时针旋转90度
DBlocksRece(k+7*Dnum,:,:)=imrotate(reshape(DBlocksRece(k,:,:),Sr,Sr),270); % 逆时针旋转270度

DBlocks(k,:,:)=Image1((i-1)*Sd+1:i*Sd,(j-1)*Sd+1:j*Sd);
end
end
RandDbest=zeros(Rnum,1)+256^3;
RandDbests=zeros(Rnum,1);
RandDbesto=zeros(Rnum,1);
RandDbestj=zeros(Rnum,1);
for i=1:Rnum
x=reshape(RBlocks(i,:,:),Sr*Sr,1);
meanx=mean(x);
for j=1:Dnum*8
y=reshape(DBlocksRece(j,:,:),Sr*Sr,1);
meany=mean(y);
s=(x-meanx)'*(y-meany)/((y-meany)'*(y-meany));%计算s
o=(meanx-s*meany);%计算o
c=(x-s*y-o)'*(x-s*y-o);%距离
if (RandDbest(i)>c)&(abs(s)<1)
RandDbest(i)=c;
RandDbests(i)=s;
RandDbesto(i)=o;
RandDbestj(i)=j;%可以找到对应变换和D块
end
end
end
%iteration limit
toc
tic
m=8;%解码迭代次数
e=mean(mean(Image1));
Image3=e*ones(imagem,imagen);%解码初始图象
for L=1:m
Image4=blkproc(Image3,[Sd/Sr,Sd/Sr],'mean(mean(x))');

for i=1:imagem/Sr
for j=1:imagen/Sr
m=Sr;n=Sr;
k=(i-1)*imagen/Sr+j;
l=RandDbestj(k);
k1=mod(l-1,Dnum)+1;%第几个D
l1=(l-k1)/Dnum+1;%变换号
%R对应D在Image4的起始点
j1=mod(k1-1,imagen/Sd)+1;
i1=(k1-j1)/(imagen/Sd)+1;
%变换------------------------------------------------------------------------
DBlocksRece(k1,:,:)=Image4((i1-1)*Sr+1:i1*Sr,(j1-1)*Sr+1:j1*Sr);
switch l1-1
case 0
DBlocksRece(l,:,:)=Image4((i1-1)*Sr+1:i1*Sr,(j1-1)*Sr+1:j1*Sr);
case 1
DBlocksRece(l,:,:)=DBlocksRece(k1,m:-1:1,:);
case 2
DBlocksRece(l,:,:)=DBlocksRece(k1,:,n:-1:1);
case 3
DBlocksRece(l,:,:)=DBlocksRece(k1,m:-1:1,n:-1:1);
case 4
DBlocksRece(l,:,:)=reshape(DBlocksRece(k1,:,:),Sr,Sr)';
case 5
DBlocksRece(k1+3*Dnum,:,:)=DBlocksRece(k1,m:-1:1,n:-1:1);
A=reshape( DBlocksRece(k1+3*Dnum,:,:),Sr,Sr)';
DBlocksRece(l,:,:)=A(:,n:-1:1);
case 6
DBlocksRece(l,:,:)=imrotate(reshape(DBlocksRece(k1,:,:),Sr,Sr),90);
case 7
DBlocksRece(l,:,:)=imrotate(reshape(DBlocksRece(k1,:,:),Sr,Sr),270);
end
%变换结束--------------------------------------------------------------------
RBlocks(k,:,:)=RandDbests(k)*DBlocksRece(l,:,:)+RandDbesto(k);
%生成R---------------------------
Image3((i-1)*Sr+1:i*Sr,(j-1)*Sr+1:j*Sr)=reshape(RBlocks(k,:,:),Sr,Sr);%更新迭代图象
end
end
wucha=double(Image1)-Image3;%误差图

Ps1(L)=20*log10(255/(sqrt(mean(mean(wucha.^2)))))
PSNR=psnr(wucha)
figure
imshow(uint8(Image3))
end
toc
figure
wucha=uint8(wucha);
imshow(wucha)
figure
imshow(uint8(Image1)),title('原图');
save('sa.mat')
fangtu(wucha);%%%%分形主函数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
子函数:1:
function b=suoxiao(filename,bili)
a=imread(filename);
a=double(a);
[m,n]=size(a);
i=1;
while i=m/bili
j=1;
while j=n/bili
k=mean(mean(a(bili*(i-1)+1:bili*(i-1)+bili,bili*(j-1)+1:bili*(j-1)+bili)));
b(i,j)=k;
j=j+1;
end
i=i+1;
end
%b=uint8(b);
size(b)
%imshow(b)
子函数2:
%clc
function fangtu(a)
J=a;
%计算灰度图象的直方图数据,a为如象数组
L=256; %灰度级
Ps = zeros(L,1); %统计直方图结果数据
nk=zeros(L,1);
[row,col]=size(a);
n=row*col; %总像素个数
for i = 1:row
for j = 1:col
num = double(a(i,j))+1; %获取像素点灰度级
nk(num) = nk(num)+1; %统计nk
end
end
%计算直方图概率估计
for i=1:L
Ps(i)=nk(i)/n;
end
figure;
subplot(3,1,1);imshow(J),title('误差图');
subplot(3,1,2),plot(nk),title('直方图(nk)');
subplot(3,1,3),plot(Ps),title('直方图(Ps)');
子函数3:
function PSNR=psnr(a)
[m,n]=size(a);
a=uint8(a);
a=double(a);
imagesize=m*n;
MSE=sum(dot(a,a))/ imagesize;
PSNR=10*log10(255^2/MSE);
%%%%%%%%%%%%%%%%%%%%%%
说明:
1、因为本程序时间长,FX中先选择图片的大小
2、编码与解码
3、做误差图和只方图
4:画出每次迭代的解码图象

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:713
制作脚本网站 发布:2025-10-20 08:17:34 浏览:977
python中的init方法 发布:2025-10-20 08:17:33 浏览:686
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:838
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:745
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1085
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:314
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:194
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:882
python股票数据获取 发布:2025-10-20 07:39:44 浏览:840