【图像压缩】Matlab实现JPEG编码压缩

 1 简介

首先介绍了基于离散余弦变换的JPEG图像压缩编码算法,接着用MATLAB6.5对标准灰度图像进行仿真,并对同一幅Lena图像做不同的压缩,绘制了率失真曲线.实验结果表明,在很大的压缩范围内,在不同的压缩比和编码比特率下,重建图像的峰值信噪比都在30dB以上,仍然能满足人们的视觉需要.对图像做不同的压缩,满足了不同的场合,不同的控制码率下要求不同的图像质量的实际需要.用MATLAB做仿真实验,方法简单而且误差小,大大提高了图像压缩的效率和精度.

2 部分代码

function JPEG;close all;clear all;clc;J=imread('05.jpg'); imwrite(J,'05 质量因子80.jpg','quality',80);x=imread('05 质量因子80.jpg');R=rgb2gray(x);I=double(R);imwrite(R,'05 灰度图.jpg');%% 图像分割 以8x8为最小单元分割,可分割成4096个方块,从上往下,得到32768x8的矩阵% lena512: 512*512% Block: 32768*8Block=[];for numi=1:64 %逐行取方阵    m=(numi-1)*8+1; %每块行的开头    for numj=1:64 %逐列取方阵        n=(numj-1)*8+1; %每块列的开头        Block=[Block; I(m:m+7,n:n+7)];    endend%% 离散余弦变换 DCT变换 对4096个方阵分别进行DCT变换,得到4096个变换方阵,从上往下存,32768x8的矩阵% Block: 32768*8% FBlock: 32768*8for num=1:4096    start=(num-1)*8+1;    FBlock(start:start+7,:)=dct2(Block(start:start+7,:));end%% 压缩率OB=512*512*8;CR=OB/sumcode;D=I-reI;MSE = sum(D(:).*D(:))/prod(size(I));disp(['原图 Bit:                  ',num2str(OB),' bit']);disp(['压缩图像 Bit:               ',num2str(sumcode),' bit']);disp(['压缩比:                     ',num2str(CR)]);disp(['均方根误差:                  ',num2str(MSE)]);end

3 仿真结果

4 参考文献


[1]王成优, 侯正信. JPEG图像压缩编码及其MATLAB仿真实现[J]. 电子测量技术, 2007, 30(1):3.​

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

5 代码下载

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
JPEG(Joint Photographic Experts Group)是一种针对彩色图像的有损压缩格式。它可以将图像压缩到原始大小的1/10或更小,但在这个过程中会丢失一些信息。在本文中,我们将使用MATLAB实现JPEG图像压缩和解压缩。 ## JPEG图像压缩 ### 分块和DCT变换 首先,我们需要将图像分成8x8的块。对于每个块,在进行压缩之前,我们需要进行DCT(Discrete Cosine Transform,离散余弦变换)变换。MATLAB提供了一个名为`dct2`的函数来执行DCT变换。 ``` % 读取图像 img = imread('lena.png'); % 将图像转换为灰度图像 img_gray = rgb2gray(img); % 将图像分块为8x8的块 blocks = mat2cell(img_gray, 8*ones(1,size(img_gray,1)/8), 8*ones(1,size(img_gray,2)/8)); % 对每个块执行DCT变换 dct_blocks = cellfun(@dct2, blocks, 'UniformOutput', false); ``` ### 量化和熵编码 接下来,我们需要将DCT系数量化并对其进行熵编码。量化是一个有损过程,它将DCT系数舍入到最接近的量化级别。这可以减少数据量,但会导致信息丢失。 我们可以使用JPEG标准中定义的量化矩阵来量化DCT系数。该矩阵包含了高频和低频系数的权重,其中高频系数的权重较小,因此它们通常会被量化为0或接近0的值。低频系数的权重较大,因此它们通常会被保留下来。 ``` % 定义JPEG标准的量化矩阵 Q = [16 11 10 16 24 40 51 61; 12 12 14 19 26 58 60 55; 14 13 16 24 40 57 69 56; 14 17 22 29 51 87 80 62; 18 22 37 56 68 109 103 77; 24 35 55 64 81 104 113 92; 49 64 78 87 103 121 120 101; 72 92 95 98 112 100 103 99]; % 对DCT系数进行量化 quant_blocks = cellfun(@(block) round(block ./ (Q*0.1)), dct_blocks, 'UniformOutput', false); ``` 接下来,我们需要对量化系数进行熵编码。在这里,我们将使用MATLAB的`jpeg_write`函数来完成此操作。该函数将量化系数写入JPEG文件中,并使用Huffman编码对它们进行压缩。 ``` % 将量化系数写入JPEG文件中 jpeg_write(quant_blocks, 'compressed.jpg'); ``` ## JPEG图像解压缩 ### 解码和逆量化 现在,我们将解压缩JPEG文件并还原原始图像。首先,我们需要将JPEG文件中的量化系数解码。我们可以使用MATLAB的`jpeg_read`函数来完成此操作。 ``` % 从JPEG文件中读取量化系数 quant_blocks = jpeg_read('compressed.jpg'); quant_blocks = quant_blocks.coef_arrays{1}; ``` 然后,我们需要将量化系数进行逆量化,以还原DCT系数。这可以通过将量化系数乘以JPEG标准的量化矩阵来实现。 ``` % 对量化系数进行逆量化 dct_blocks = cellfun(@(block) block .* (Q*0.1), quant_blocks, 'UniformOutput', false); ``` ### 逆DCT变换和重构图像 最后,我们需要将DCT系数进行逆DCT变换,并将它们组合成原始图像。MATLAB提供了一个名为`idct2`的函数来执行逆DCT变换。 ``` % 对每个块执行逆DCT变换 idct_blocks = cellfun(@idct2, dct_blocks, 'UniformOutput', false); % 将块组合成原始图像 img_gray_reconstructed = cell2mat(idct_blocks); ``` 现在我们已经得到了还原的灰度图像。如果需要,我们可以将其转换回彩色图像,以便进行可视化。 ``` % 将图像转换为彩色图像 img_reconstructed = cat(3, img_gray_reconstructed, img_gray_reconstructed, img_gray_reconstructed); % 显示重构的图像 imshow(img_reconstructed); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值