大家好,今天来为大家解答高效图像压缩技术:Matlab应用详解这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~
原理
图像压缩原理
图像压缩的主要目的是节省存储空间并提高传输速度。图像压缩的理想标准是最小的信息损失和最大的压缩比。不损失图像质量的压缩称为无损压缩,无损压缩无法达到高压缩比;不损失图像质量的压缩称为有损压缩,高压缩比是以牺牲图像质量为代价的。压缩是通过对图像重新编码来实现的,希望用更少的数据来表示图像。
信息冗余有很多种,比如空间冗余、时间冗余、结构冗余、知识冗余、视觉冗余等。数据压缩本质上是减少这些冗余。高效编码的主要方法是尽可能去除图像中的冗余成分,从而以最小的码元包含最多的图像信息。
编码和压缩方法有很多种,从不同的角度有不同的分类方法。从信息论的角度来看,它们可以分为两类。
(1)冗余压缩法,又称无损压缩、信息保留编码或直接编码。具体来说,解码后的图像与压缩编码前的图像严格一致,没有失真。从数学上来说,这是一个可逆操作。
(2)信息压缩法,也称有损压缩、失真编码或烟雾压缩编码。也就是说,解码后的图像与原始图像存在差异,并且允许一定的失真。
多媒体中使用的图像压缩编码方法根据压缩编码算法原理可分为以下三类:
(1) 无损压缩编码的类型
霍夫曼编码、算术编码、游程长度(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)首先将输入图像分解为88或1616的块,然后对每个子块进行二维DCT变换。
(2)将变换后得到的量化DCT系数进行编码传输,形成压缩图像格式。
用DCT解压的过程为:
(1)对每个88或1616块进行二维DCT逆变换。
(2) 将逆变换矩阵块组合成单个图像。
余弦变换具有集中高度相关数据的能量的趋势。经过DCT变换后,矩阵的能量集中在
大多数左上角和右下角的DCT系数值都非常接近0。对于正常图像,丢弃这些接近的
DCT系数值大于0不会显着降低重建图像的质量。因此,使用DCT
对图像进行压缩变换可以节省大量的存储空间。应使用压缩来最好地近似原始图像
最小系数。使用的系数数量也决定了压缩比。
在压缩过程的步骤2中,可以合理丢弃一些系数来达到压缩的目的。压缩中
在该过程的步骤2中,RLE和霍夫曼编码也可以用于进一步压缩。
行程编码(RLE)原理
例如,以下二值图像,
[图片上传失败.(image-c56dbf-1678149990054)]
如果使用游程编码,可以保存为以下格式
[图片上传失败.(image-e20741-1678149990054)]
其中10和8代表图像的宽度和高度。在这个小例子中,游程编码不会压缩图像。这是因为该图像的尺寸太小,而当图像尺寸较大时,游程编码仍然是一种很好的无损压缩方法。对于灰度图像和二值图像,游程编码通常具有较高的压缩率。游程编码方法易于实现,对于压缩具有长重复值的字符串非常有效。例如,对于有大面积阴影或相同颜色的图像,此方法效果很好。许多位图文件格式都使用游程编码,例如TIFF、PCX、GEM、BMP 等。
步骤
MATLAB 中的变长码映射
全部清除
CLC
f2=uint8([2 3 4 2;3 2 4 4;2 2 1 2;1 1 2 2])
谁("f2")
c=霍夫曼(hist(double(f2(:)),4))
h1f2=c(f2(:))"
谁("h1f2")
%h2f2=字符(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""]
谁("h2f2")
h2f2=h2f2(:);
h2f2(h2f2=="")=[];
谁("h2f2")
h3f2=mat2huff(f2)
谁("h3f2")
hcode=h3f2.code;
谁("hcode")
dec2bin(双(hcode))
%------------------------------------------%
函数代码=霍夫曼(p)
错误(nargchk(1,1,nargin));
if(ndims(p)~=2)|(min(size(p))1)|~isreal(p)|~isnumeric(p)
error("p 必须是实数值向量");
结尾
全球代码
CODE=cell(length(p),1);%初始化全局元胞数组
if (length(p)1) %当超过一个符号时.
p=p/sum(p);%对输入概率进行归一化
s=reduce(p);%进行霍夫曼源符号约简
makecode(s,[]);%递归生成代码
别的
CODE={"1"};%else,简单的一个符号情况
结尾;
%------------------------------------------------- --------%
函数s=reduce(p);
s=细胞(长度(p),1);
对于i=1: 长度(p)
s{i}=i;
结尾
而尺寸2
[p,i]=sort(p);%对符号概率进行排序
p(2)=p(1)+p(2);%合并2个最低概率
p(1)=[];% 和prune(,prune,delete) 最低的一个
s=s(i);
s{2}={s{1},s{2}};
s(1)=[];
结尾
%------------------------------------------------- ----------%
函数makecode(sc,代码字)
全球代码
if isa(sc,"细胞")
makecode(sc{1},[代码字0]);
makecode(sc{2},[代码字1]);
别的
CODE{sc}=char("0"+码字);
结尾
%------------------------------------------------- ----------%
函数y=mat2huff(x)
if ndims(x)~=2|~isreal(x)|(~isnumeric(x) ~islogic(x))
error("x 必须是二维实数值或逻辑矩阵");
结尾
y.size=uint32(大小(x));
x=圆(双(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);
如果最大(h)65535
h=65535*h/最大(h);
结尾
h=uint16(h);
y.hist=h;
%对输入矩阵进行编码并存储结果
地图=霍夫曼(双(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=="")=[];
y尺寸=ceil(长度(hx)/16);
hx16=repmat("0",1,ysize*16);
hx16(1:长度(hx))=hx;
hx16=重塑(hx16,16,ysize);
hx16=hx16" - "0";
二=pow2(15:-1:0);
y.code=uint16(sum(hx16.*twos(ones(ysize,1),),2))";
%------------------------------------------------- -----------------------%
离散余弦变换(DCT)图像压缩
离散余弦变换(DCT)常用于图像变换和压缩。 DCT能够将图像最重要的信息集中在DCT的几个系数上。正是由于这个原因,DCT经常被用于图像压缩。
全部清除
CLC
I=imread("D:picDIP3E_CH11_Original_ImagesFig1137(b)(painting_translated_padded).tif","tif");
I=im2double(I);
T=dctmtx(8);
B=blkproc(I,[8,8],"P1*x*P2",T,T");
掩码=[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",掩码);
I2=blkproc(B2,[8,8],"P1*x*P2",T",T);
imshow(I),title("原图");
figure,imshow(I2),title("变换后的图像");
利用离散余弦变换进行JPEG 图像压缩
全部清除
CLC
I=imread("D:picDIP3E_CH11_Original_ImagesFig1137(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 的参数
掩码=[ 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",掩码); %仅保留DCT变换的10个系数
I2=blkproc(B2,[8,8],"P1*x*P2",T",T); %逆DCT,重建图像
子图(1,2,1);
Imshow(I);title("原图");%显示原图
子图(1,2,2);
Imshow(I2);title("压缩图像");%显示压缩图像。比较原始图像和压缩图像,虽然
% 丢弃了85% 的DCT 系数,但图像仍然清晰(当然有一些质量损失)参考文献:
[1]拉斐尔·C·冈萨雷斯、理查德·E·伍兹和史蒂文·L·埃丁斯。 2003 年。使用MATLAB 进行数字图像处理。美国普伦蒂斯霍尔公司。
[2] 阮秋琪.数字图像处理(MATLAB版)[M]北京:电子工业出版社,2014。
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!
【高效图像压缩技术:Matlab应用详解】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
想学一下matlab怎么压缩图片教程
有17位网友表示赞同!
这篇文章能给我用得上吗?我需要把照片尺寸压缩,做个网页用
有8位网友表示赞同!
对图像压缩算法有点了解,但没实际操作过,看看这篇文章能不能开拓眼界
有17位网友表示赞同!
matlab的图片处理功能挺 kuat 的,没想到也能实现图像压缩!
有5位网友表示赞同!
最近看了一些关于图像压缩技术的介绍,matlab是不是最常用的工具?
有18位网友表示赞同!
希望这篇文章能讲清楚原理,让我知道图像是如何被压缩的!
有20位网友表示赞同!
我平时用其他软件压缩图片,有没有想过用matlab试试效率怎么样?
有9位网友表示赞同!
感觉matlab实现的效果应该比较好,比在线网站工具更强大吧?
有19位网友表示赞同!
学习了这篇文章,以后自己就能把图片压缩得小巧精致!
有15位网友表示赞同!
对matlab编程还不太熟悉,看看能不能理解这篇文章的代码讲解。
有18位网友表示赞同!
图像大小控制好很重要,这篇文章能帮助我减少文件体积吗?
有20位网友表示赞同!
分享一下你用matlab压缩图片后的效果吧,让我看看具体的效果!
有10位网友表示赞同!
有没有什么技巧可以提高压缩率,还能保证图片清晰度呢?
有14位网友表示赞同!
感觉matlab操作起来比较严谨,是不是图像压缩效果也更精准一点啊?
有20位网友表示赞同!
以后可以用matlab自己处理图片了,太方便啦!
有10位网友表示赞同!
想看看哪些常用算法都在这篇文章中介绍?
有7位网友表示赞同!
有没有什么推荐的学习资源,让我更好地掌握 matlab 图片处理?
有6位网友表示赞同!
图像压缩对于存储和传输都很重要,这篇博客能开阔我的视野。
有20位网友表示赞同!
matlab确实是一个强大的工具,可以实现很多复杂的应用场景!
有8位网友表示赞同!