MATLAB实现图像压缩-matlab图像处理第22期(附完整代码)

MATLAB实现基于DCT变换的图像压缩 在众多的图像压缩算法中,DCT(离散余弦变换)算法是一种简单、高效的方法,常用于JPEG图像压缩标准。需要注意的是,DCT变换是一种频域方法,对图像的高频成分进行抑制,从而实现图像压缩的目的。此外,基于DCT变换的图像压缩算法中,量化矩阵的选取和系数保留的比例都会影响压缩效果和图像质量,需要根据实际需求进行调整。DCT变换是一种将时域信号转换为频域信号的方法,其基本思想是将信号分解为一系列不同频率的正弦函数的叠加。其中X为需要进行DCT变换的矩阵,Y为DCT变换后的矩阵。2、将灰度图像分割为8x8的小块。 阅读详情

主要讲解了如何在 MATLAB 中进行图像压缩,包括离散余弦变换(DCT)的应用和行程编码(RLE)的实现。以下是每个部分的概述和 MATLAB 代码示例:


MATLAB实现图像压缩

目的

  1. 理解图像压缩的相关概念及图像压缩的主要原则和目的;
  2. 掌握霍夫曼编码
  3. 掌握几种常见的图像压缩编码方法
  4. 利用 MATLAB 程序进行图像压缩

原理

图像压缩原理

图像压缩主要是通过减少图像数据中的冗余信息来节省存储空间。压缩可分为无损压缩和有损压缩。

  • 无损压缩:解压后的图像与原图完全一致,常见方法包括哈夫曼编码、行程编码(RLE)。
  • 有损压缩:解压后的图像与原图存在一定差异,常见方法包括离散余弦变换(DCT)、JPEG等。

图像压缩的核心思想是通过各种编码方法减少冗余信息,达到节省空间的目的。

离散余弦变换(DCT)图像压缩原理

DCT 是一种将图像从空间域转换到频率域的变换方法。DCT 压缩的核心是将图像数据进行频域转换,然后对不重要的高频信息进行去除,从而达到压缩的目的。

在 JPEG 压缩中,DCT 作为一种标准变换方法,通常将图像分成 8×8 的块,对每块进行 DCT 变换,量化后进行编码。通过这种方式,图像的低频信息保留, 高频信息舍弃,最终减少图像的存储需求。

行程编码(RLE)原理

行程编码(RLE)是一种非常简单且高效的无损压缩方法,特别适用于像素值相同且连续的图像区域。其基本原理是对相邻的相同像素值进行压缩,例如表示为“数值+重复次数”。在图像中,长时间连续相同的像素值可以被有效压缩。

例如,二值图像中多个相邻的“1”或“0”可以通过“1 5”或者“0 3”的形式进行编码。

步骤

MATLAB 中的变长码映射

clear all
clc

% 输入图像数据
f2 = uint8([2 3 4 2; 3 2 4 4; 2 2 1 2; 1 1 2 2]);
whos('f2')

% 进行哈夫曼编码
c = huffman(hist(double(f2(:)), 4));
h1f2 = c(f2(:))';

% 输出编码后的数据
whos('h1f2')

% 将编码结果转换为字符表示
h2f2 = ['1 0 1 0 0 1 1 0 0 0 0 1 1 0 1 1';...
        '1 1 1 1 0 0 0 0 1 0 0 1 0 0 0 1';...
        '0 0 1 1 0 1 0 1 1 1 0 1 0 1 1 0'];
whos('h2f2')

% 转换为空格字符
h2f2 = h2f2(:);
h2f2(h2f2 == ' ') = [];

% 计算矩阵哈夫曼编码
h3f2 = mat2huff(f2);
whos('h3f2')

% 输出编码后的哈夫曼码
hcode = h3f2.code;
whos('hcode')
dec2bin(double(hcode))

% 哈夫曼编码实现
function CODE = huffman(p)
    error(nargchk(1, 1, nargin));
    if (ndims(p) ~= 2) | (min(size(p)) > 1) | ~isreal(p) | ~isnumeric(p)
        error('p must be a real numeric vector');
    end

    global CODE
    CODE = cell(length(p), 1); % 初始化哈夫曼编码单元
    if (length(p) > 1)
        p = p / sum(p);  % 归一化概率
        s = reduce(p);   % 执行哈夫曼源符号合并
        makecode(s, []);  % 递归生成编码
    else
        CODE = {'1'}; % 简单单一符号情况
    end;
end

% 子函数:合并概率
function s = reduce(p)
    s = cell(length(p), 1);
    for i = 1:length(p)
        s{i} = i;
    end

    while size(s) > 2
        [p, i] = sort(p);
        p(2) = p(1) + p(2); % 合并概率
        p(1) = [];  % 剪去最小概率

        s = s(i);
        s{2} = {s{1}, s{2}};
        s(1) = [];
    end
end

% 子函数:递归生成哈夫曼编码
function makecode(sc, codeword)
    global CODE
    if isa(sc, 'cell')
        makecode(sc{1}, [codeword 0]);
        makecode(sc{2}, [codeword 1]);
    else
        CODE{sc} = char('0' + codeword);
    end
end

% 子函数:将矩阵转换为哈夫曼编码
function y = mat2huff(x)
    if ndims(x) ~= 2 | ~isreal(x) | (~isnumeric(x) & ~islogical(x))
        error('x must be a 2-D real numeric or logical matrix');
    end

    y.size = uint32(size(x));
    x = round(double(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);
    if max(h) > 65535
        h = 65535 * h / max(h);
    end
    h = uint16(h);
    y.hist = h;

    % 执行哈夫曼编码
    map = huffman(double(h));
    hx = map(x(:) - xmin + 1);
    hx = ['1' ' ' '1' '0' ' ' '1' '1' '0' ' ' ' '...
        '0' '1' '1' ' ' '1' '1']';
    hx = hx(:)';
    hx(hx == ' ') = [];
    ysize = ceil(length(hx) / 16);
    hx16 = repmat('0', 1, ysize * 16);
    hx16(1:length(hx)) = hx;
    hx16 = reshape(hx16, 16, ysize);
    hx16 = hx16' - '0';
    twos = pow2(15:-1:0);
    y.code = uint16(sum(hx16 .* twos(ones(ysize, 1), :), 2))';
end

离散余弦变换(DCT)图像压缩

DCT 是图像压缩中常用的变换方法,主要将图像从空间域转为频率域,通过丢弃高频信息(对图像影响较小的部分)来实现压缩。以下代码展示了如何使用 DCT 来压缩图像。

clear all
clc

% 读取图像
I = imread('D:\pic\DIP3E_CH11_Original_Images\Fig1137(b)(painting_translated_padded).tif', 'tif');
I = im2double(I);

% 生成8x8的DCT矩阵
T = dctmtx(8);

% 对图像进行块处理,计算二维DCT
B = blkproc(I, [8, 8], 'P1*x*P2', T, T');

% 定义掩膜,保留左上角的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];

% 应用掩

膜,只保留DCT变换后的部分系数
B2 = blkproc(B, [8, 8], 'P1.*x', mask);

% 对压缩后的图像进行逆DCT变换
I2 = blkproc(B2, [8, 8], 'P1*x*P2', T', T);

% 显示原图像和压缩后的图像
imshow(I), title('原图像');
figure, imshow(I2), title('压缩后的图像');

利用离散余弦变换进行JPEG 图像压缩

clear all
clc

% 读取图像
I = imread('D:\pic\DIP3E_CH11_Original_Images\Fig1137(b)(painting_translated_padded).tif');
I = im2double(I);

% 生成8x8的DCT矩阵
T = dctmtx(8);

% 计算二维DCT变换
B = blkproc(I, [8 8], 'P1*x*P2', T, T');

% 定义掩膜,保留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], 'P1.*x', mask);

% 逆DCT恢复图像
I2 = blkproc(B2, [8, 8], 'P1*x*P2', T', T');

% 显示原图像和压缩后的图像
subplot(1,2,1);
imshow(I), title('原图像');
subplot(1,2,2);
imshow(I2), title('压缩图像');

这些代码展示了如何通过变换和编码方法对图像进行压缩。在实际应用中,DCT 和其他编码方法能够有效减少图像文件大小,特别是在存储和传输过程中非常有用。

图像压缩编码Matlab实现-主要参数计算 图像压缩编码是通过消除图像中的冗余信息来降低数据量并保持图像质量的技术。在本文中,我们将使用Matlab来实现图像压缩编码,并介绍常用的参数计算方法。这可以通过在Huffman编码之前将量化系数重新排序并将其转换为一维向量来实现。在进行图像压缩编码之前,我们需要对图像进行预处理。这包括将图像转换为灰度图像、调整图像大小和填充图像。在图像压缩编码中,离散余弦变换(DCT)是最常用的变换。在DCT域中,高频系数对图像质量的影响不如低频系数。我们可以将压缩后的信息存储在硬盘上,并在需要时解压缩。 阅读详情

相关推荐

【图像压缩】基于DCT变换实现图像压缩matlab代码

1 简介 介绍了JPEG图像压缩算法,并在MATLAB数学分析工具环境下从实验角度出发,较为直观地探讨了DCT在JPEG图像压缩中的应用.仿真实验表明,用MATLAB来实现离散余弦变换的图像压缩,具有方法简单,速度快,误差小的优点,大大提高了图像压缩的效率和精度. 2 部分代码 clc clearall closeall img=imread('sweden_input.jpg'); subplot(121);imshow(img);title('原图'); %显示原图 ...

qq_59747472的博客 3996

基于Matlab的图片压缩(超简单)

U,D结果为正交矩阵,这里不予展示。SVD压缩原理就是保留原矩阵的重要特征,在64.55,13.21,7.42中我们只要保留64.55,13.21这些较大的奇异值,舍弃较小的奇异值,就能保留原矩阵的大部分信息了。图像在计算机中用矩阵储存,值的大小在0~255,在这里我们令图像的矩阵为A。若为彩色矩阵则颜色通道由3种,分别B,G,R,分别对应三原色蓝色,绿色,红色,即三原色。我们用matlab编程得到3个程序,后面两个为函数,photo_compress()为压缩函数,调用New_svd()进行奇异值分解。

qq_57290048的博客 5752

【图像压缩】基于matlab小波变换图像压缩【含Matlab源码 229期】

小波变换图像压缩 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2031

利用Matlab进行图像的编码与压缩(仿照jpeg)

1.选择matlab自带图像cameraman.tif和westconcordorthophoto.png为编码压缩的测试图像。2.根据设计要求选择图像编码和压缩方法;3、设计编码与压缩的算法;4、显示原始图像和压缩重构图像;5、计算压缩的性能指标:压缩率和保真度;6、画出压缩率和保真度的关系曲线。本文章中有:图像读取,余弦变换,亮度量化,Z字形重排,游程编码,参数文件保存,参数文件读取,逆游程编码,逆Z字形重排,逆量化压缩,生成压缩比,保真度。

i道i的博客 8557

【图像重建】基于matlab主成分分析图像压缩重建【含Matlab源码 1173期】

主成分分析图像压缩重建 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2699

【图像压缩】基于 DCT变换图像压缩Matlab代码

1 简介 介绍了JPEG图像压缩算法,并在MATLAB数学分析工具环境下从实验角度出发,较为直观地探讨了DCT在JPEG图像压缩中的应用.仿真实验表明,用MATLAB来实现离散余弦变换的图像压缩,具有方法简单,速度快,误差小的优点,大大提高了图像压缩的效率和精度. 2 部分代码 clc clear all close all img=imread('sweden_input.jpg'); subplot(121);imshow(img);title('原图'); %显示原图 ...

qq_59747472的博客 1346

【图像压缩】基于matlab行程编码(RLE)图像压缩【含Matlab源码 404期】

行程编码(RLE)图像压缩 完整代码,直接运行,适合小白!可提供运行操作视频!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 5008

基于Matlab实现多个图像压缩案例(附上源码)

基于Matlab实现多个图像压缩案例(附上源码)

m0_62143653的博客 1898

【图像处理】图像压缩解密、图像加密解密和图像编码译码【含Matlab源码 9214期】

图像压缩解密、图像加密解密和图像编码译码 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 1094

ES快速入门,一篇就懂!

Elastic Search 入门前言什么是搜索为什么常用数据库不适合做搜索什么是Lucene什么是Elastic SearchES核心概念ES使用正常启动索引​增删改查ES增加常见问题:ES删除ES查询欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的

qq1592的博客 9310

手把手教你用UNet实现轨道缺陷检测(附RSDDs数据集下载与完整代码)

本文详细介绍了如何使用UNet模型实现轨道缺陷检测,包括RSDDs数据集的下载与处理、UNet架构的改进与优化、训练策略设计以及模型部署的全流程。通过实战案例,展示了如何利用深度学习技术提升工业质检效率,特别适合从事工业缺陷检测和图像处理的开发者参考。

dapp9builder的博客 746

【图像压缩】基于matlab GUI DCT图像压缩(含MAX MED MIN NONE)【含Matlab源码 9946期】

DCT图像压缩 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 869

Windows环境Oracle19C安装与配置全攻略

本文详细介绍了在Windows环境下安装与配置Oracle19C数据库的完整流程,包括环境准备、安装步骤、网络配置、客户端工具设置及常见问题解决方案。特别针对Windows 10和Windows Server 2016及以上版本提供了优化建议,帮助用户高效完成Oracle19C的部署与维护。

weixin_28455801的博客 487

【图像处理】基于matlab图像压缩解密、图像加密解密和图像编码译码【含Matlab源码 9214期】

图像压缩解密、图像加密解密和图像编码译码 完整代码,包运行;可提供运行操作视频!适合小白!

Matlab912100926的博客 744

嵌入式系统启动流程解析:ROM Code、Bootloader与启动代码的协同工作

本文深入解析嵌入式系统从通电到运行的完整启动流程,详细阐述了ROM Code、Bootloader与启动代码三者如何像接力赛般协同工作。ROM Code作为芯片固化的初始引导程序,负责硬件自检并加载Bootloader;Bootloader作为系统总指挥,初始化关键硬件并加载操作系统内核;启动代码则为C语言运行环境铺平道路。理解这三者的分工与协作,是进行系统移植和解决启动问题的关键。

dd012的博客 553

问题:dpkg-deb: error: paste subprocess was killed by signal (Broken pipe)

 1. 问题:Ubuntu安装软件的过程中出现依赖项的问题 “E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).” 按照指示执行如下两条命令都没有解决问题。 sudo apt-get -f install sudo apt-get --fix-broken ...

gloria_littlechi的博客 2万+

【图像压缩】基于matlab GUI IGS量化图像压缩【含Matlab源码 13446期】

IGS量化图像压缩 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 1125

功能安全实战系列12-英飞凌TC3xx锁步核及其自检开发

本文介绍了英飞凌Tricore系列芯片的锁步核(Lockstep Core)功能及其故障注入自检机制。锁步核通过主核和检查核同步执行指令,并比较输出结果来检测硬件故障。文章详细阐述了锁步核的工作原理、使能配置方法以及故障注入自检的实现过程。故障注入测试通过专用寄存器LCLTEST触发,系统会定期自动测试比较器节点,验证锁步核的故障检测能力。当检测到异常时,会触发SMU模块的警报机制。该技术为汽车电子系统提供了重要的功能安全保障。

initiallizer的博客 917

【图像压缩】IGS量化图像压缩【含GUI Matlab源码 13446期】

IGS量化图像压缩 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 724

FFmpeg入门详解之110:RTSP协议讲解

TCP/IP 协议体系中的一个应用层协议,该协议定义了一对多应用程序如何有效地通过 IP 网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。HTTP与RTSP相比,HTTP传送HTML,而RTSP传送的是多媒体数据。正在上传…重新上传取消RTSP是基于文本的协议,采用ISO10646字符集,使用UTF-8编码方案。行以CRLF中断(\r\n:10,13:0x0A,0x0D),包括消息类型、消息头、消息体和消息长。

福优学苑@音视频+流媒体 2528

代谢组数据分析(二十一):通过MetaboAnalystR标准化构建sPLSDA预测模型

本文介绍了如何使用R语言中的MetaboAnalystR包和mixOmics包进行代谢组学数据的标准化和sPLSDA分析。MetaboAnalystR包用于数据预处理,包括数据初始化、清洗、补足、过滤和标准化等步骤,以确保数据质量。mixOmics包则用于sPLSDA分析,通过Lasso惩罚进行变量选择,并建立分类模型。文章详细说明了安装和加载相关R包的步骤,并提供了数据导入和预处理的代码示例。最后,强调了数据预处理的重要性,以确保后续分析的准确性和可靠性。

专注生信领域 2426

【图像压缩】基于matlab GBP算法图像压缩感知(含PSNR)【含Matlab源码 9742期】

GBP算法图像压缩感知(含PSNR) 完整代码,包运行;可提供运行操作视频!适合小白!

Matlab912100926的博客 870

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【图像压缩】基于matlab GUI Haar小波变换图像压缩(含PSNR)【含Matlab源码 9979期】

Haar小波变换图像压缩 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 994

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【图像压缩】基于matlab小波变换图像压缩(含图像压缩后的熵值)【含Matlab源码 4793期】

小波变换图像压缩(含图像压缩后的熵值) 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 842

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: Matlab实现小波变换-matlab图像处理第21期(附完整代码)
下一篇: Matlab实现形态学图像处理-matlab图像处理第23期(附完整代码)
QQ44650067
博客等级 码龄9年 1085粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值