基于MATLAB的JPEG压缩编码
图像编码实验报告

图像编码实验报告图像编码实验报告一、引言图像编码是一项重要的技术,它可以将图像数据进行压缩和传输,以节省存储空间和传输带宽。
本实验旨在探究图像编码的原理和方法,并通过实验验证不同编码算法的性能和效果。
二、实验目的1. 理解图像编码的基本原理和概念;2. 掌握JPEG和PNG两种常见的图像编码算法;3. 分析和比较不同编码算法的压缩率和图像质量。
三、实验过程1. 实验环境搭建在本实验中,我们使用MATLAB软件进行图像编码实验。
首先,安装MATLAB 并导入实验所需的图像处理工具箱。
2. 图像压缩选择一张分辨率较高的彩色图像作为实验对象。
首先,使用JPEG编码算法对图像进行压缩。
在压缩过程中,可以调整压缩比例参数,观察压缩后图像的质量变化。
然后,使用PNG编码算法对同一张图像进行压缩,并比较JPEG和PNG 两种算法的压缩率和图像质量。
3. 实验结果分析根据实验结果,我们可以得出以下结论:- JPEG算法在高压缩比下会出现明显的失真,但在适当的压缩比下可以获得较好的图像质量;- PNG算法在压缩过程中不会导致明显的失真,但压缩率相对较低。
四、实验讨论1. 图像编码的原理图像编码是将图像数据转换为二进制码流的过程。
常见的图像编码方法包括无损编码和有损编码。
无损编码可以完全还原原始图像,但压缩率较低;有损编码可以获得较高的压缩率,但会引入一定的失真。
2. JPEG编码算法JPEG是一种常用的有损图像编码算法。
它采用离散余弦变换(DCT)将图像从空间域转换为频域,并通过量化和熵编码实现压缩。
JPEG算法在高频部分进行较大幅度的量化,从而实现高压缩率,但也导致了明显的失真。
3. PNG编码算法PNG是一种无损图像编码算法。
它采用预测编码和差分编码的方法,将图像数据转换为无损的二进制码流。
PNG算法在压缩过程中不引入明显的失真,但压缩率相对较低。
五、实验总结通过本次实验,我们深入了解了图像编码的原理和方法,并通过实验验证了JPEG和PNG两种编码算法的性能和效果。
基于Matlab的JPEG图像压缩编码仿真实现

MATLAB图象压缩

MATLAB图象压缩预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制1.图像压缩的概念减少表示数字图像时需要的数据量2.图像压缩的基本原理去除多余数据.以数学的观点来看,这一过程实际上就是将二维像素阵列变换为一个在统计上无关联的数据集合图像压缩是指以较少的比特有损或无损地表示原来的像素矩阵的技术,也称图像编码.图像数据之所以能被压缩,就是因为数据中存在着冗余。
图像数据的冗余主要表现为:(1)图像中相邻像素间的相关性引起的空间冗余;(2)图像序列中不同帧之间存在相关性引起的时间冗余;(3)不同彩色平面或频谱带的相关性引起的频谱冗余。
3数据压缩的目的就是通过去除这些数据冗余来减少表示数据所需的比特数。
由于图像数据量的庞大,在存储、传输、处理时非常困难,因此图像数据的压缩就显得非常重要。
信息时代带来了“信息爆炸”,使数据量大增,因此,无论传输或存储都需要对数据进行有效的压缩。
在遥感技术中,各种航天探测器采用压缩编码技术,将获取的巨大信息送回地面。
图像压缩是数据压缩技术在数字图像上的应用,它的目的是减少图像数据中的冗余信息从而用更加高效的格式存储和传输数据。
4、图像压缩基本方法图像压缩可以是有损数据压缩也可以是无损数据压缩。
对于如绘制的技术图、图表或者漫画优先使用无损压缩,这是因为有损压缩方法,尤其是在低的位速条件下将会带来压缩失真。
如医疗图像或者用于存档的扫描图像等这些有价值的内容的压缩也尽量选择无损压缩方法。
有损方法非常适合于自然的图像,例如一些应用中图像的微小损失是可以接受的(有时是无法感知的),这样就可以大幅度地减小位速。
从压缩编码算法原理上可以分为以下3类:(1)无损压缩编码种类哈夫曼(Huffman)编码,算术编码,行程(RLE)编码,Lempel zev编码。
(2)有损压缩编码种类预测编码,DPCM,运动补偿;频率域方法:正交变换编码(如DCT),子带编码;空间域方法:统计分块编码;模型方法:分形编码,模型基编码;基于重要性:滤波,子采样,比特分配,向量量化;(3)混合编码。
基于DCT的JPEG图像压缩编码算法的MATLAB实现

维普资讯
第1 第 1 5卷 期
20 年 3 02 - 月
J u a fZ i gWa l U iesy o r l } a ni nv ri n o n t
浙 江万里学院学报
V
b , o】
Ma 2 0 r 02
文章 编号 :6 1 2o2o ]l 0 2 —0. 17 —25 io 2o 一 08 4 -
和解 压过程 .
12 结 合 M T  ̄ 53仿 真对上 述算法 的几点 解释 . A LB. 12 1 离散 余 弦 变挟 ( c ) D r 定义
二维 D T的解 析式定 义 可 以由下式表示 : C
F f= (yF, 等 ( ) ( )N ) ( ) c o , 0 ,,O o s
D T系数值 , 中 1 数 值是 直 流 ( C 系数 , 8×8空域 图像 子块 的平 均值 , 余 的 6 C 其 个 D) 即 其 3个 是交 流 ( c 系 A ) 数, 接下 来对 D T系数进 行量 化 , 将变 换得到 的量 比的 D T系数进 行编码 和传 送 , 成压 缩后 的图像 格 C 最后 C 形
二维 D T反变换 (D T 解析 式定 义可 以表示 为 : C IC )
几 =m, 啬 击 o ) +
+ m cs o
c o s
os o
+ os 等 m.o ) c
matlab实现jpeg算法进行图像压缩的源代码

function jpeg %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% THIS WORK IS SUBMITTED BY:%%%% OHAD GAL%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%close all;% ==================% section 1.2 + 1.3% ==================% the following use of the function:%% plot_bases( base_size,resolution,plot_type )%% will plot the 64 wanted bases. I will use "zero-padding" forincreased resolution% NOTE THAT THESE ARE THE SAME BASES !% for reference I plot the following 3 graphs:% a) 3D plot with basic resolution (64 plots of 8x8 pixels) using "surf" function% b) 3D plot with x20 resolution (64 plots of 160x160 pixels) using "mesh" function% c) 2D plot with x10 resolution (64 plots of 80x80 pixels) using "mesh" function% d) 2D plot with x10 resolution (64 plots of 80x80 pixels) using "imshow" function%% NOTE: matrix size of pictures (b),(c) and (d), can support higher frequency = higher bases% but I am not asked to draw these (higher bases) in this section ! % the zero padding is used ONLY for resolution increase !%% get all base pictures (3D surface figure)plot_bases( 8,1,'surf3d' );% get all base pictures (3D surface figure), x20 resolutionplot_bases( 8,20,'mesh3d' );% get all base pictures (2D mesh figure), x10 resolutionplot_bases( 8,10,'mesh2d' );% get all base pictures (2D mesh figure), x10 resolutionplot_bases( 8,10,'gray2d' );% ==================% section 1.4 + 1.5% ==================% for each picture {'0'..'9'} perform a 2 dimensional dct on 8x8 blocks.% save the dct inside a cell of the size: 10 cells of 128x128 matrix% show for each picture, it's dct 8x8 block transform.for idx = 0:9% load a pictureswitch idxcase {0,1}, input_image_128x128 =im2double( imread( sprintf( '%d.tif',idx ),'tiff' ) );otherwise, input_image_128x128 =im2double( imread( sprintf( '%d.tif',idx),'jpeg' ) );end% perform DCT in 2 dimension over blocks of 8x8 in the given picture dct_8x8_image_of_128x128{idx+1} =image_8x8_block_dct( input_image_128x128 );if (mod(idx,2)==0)figure;endsubplot(2,2,mod(idx,2)*2+1);imshow(input_image_128x128);title( sprintf('image #%d',idx) );subplot(2,2,mod(idx,2)*2+2);imshow(dct_8x8_image_of_128x128{idx+1});title( sprintf('8x8 DCT of image #%d',idx) );end% ==================% section 1.6% ==================% do statistics on the cell array of the dct transforms% create a matrix of 8x8 that will describe the value of each "dct-base"% over the transform of the 10 given pictures. since some of the values are% negative, and we are interested in the energy of the coefficients, we will% add the abs()^2 values into the matrix.% this is consistent with the definition of the "Parseval relation" in Fourier Coefficients% initialize the "average" matrixmean_matrix_8x8 = zeros( 8,8 );% loop over all the picturesfor idx = 1:10% in each picture loop over 8x8 elements (128x128 = 256 * 8x8 elements)for m = 0:15for n = 0:15mean_matrix_8x8 = mean_matrix_8x8 + ...abs( dct_8x8_image_of_128x128{idx}(m*8+[1:8],n*8+[1:8]) ).^2;endendend% transpose the matrix since the order of the matrix is elements along the columns,% while in the subplot function the order is of elements along the rows mean_matrix_8x8_transposed = mean_matrix_8x8';% make the mean matrix (8x8) into a vector (64x1)mean_vector = mean_matrix_8x8_transposed(:);% sort the vector (from small to big)[sorted_mean_vector,original_indices] = sort( mean_vector );% reverse order (from big to small)sorted_mean_vector = sorted_mean_vector(end:-1:1);original_indices = original_indices(end:-1:1);% plot the corresponding matrix as asked in section 1.6figure;for idx = 1:64subplot(8,8,original_indices(idx));axis off;h = text(0,0,sprintf('%4d',idx));set(h,'FontWeight','bold');text(0,0,sprintf('\n_{%1.1fdb}',20*log10(sorted_mean_vector(idx)) ));end% add a title to the figuresubplot(8,8,4);h = title( 'Power of DCT coefficients (section 1.6)' );set( h,'FontWeight','bold' );% ==================% section 1.8% ==================% picture 8 is chosen% In this section I will calculate the SNR of a compressed image againts% the level of compression. the SNR calculation is defined in the header% of the function: <<calc_snr>> which is given below.%% if we decide to take 10 coefficients with the most energy, we will% zeros to the other coefficients and remain with a vector 64 elements long% (or a matrix of 8x8)% load the original imageoriginal_image = im2double( imread( '8.tif','jpeg' ) );% I will use this matrix to choose only the wanted number ofcoefficients% the matrix is initialized to zeros -> don't choose any coefficient at allcoef_selection_matrix = zeros(8,8);% compressed picture set (to show the degrading)compressed_set = [1 3 5 10 15 20 30 40];% this loop will choose each time, the "next-most-energetic"coefficient,% to be added to the compressed image -> and thus to improove the SNRfor number_of_coefficient = 1:64% find the most energetic coefficient from the mean_matrix[y,x] = find(mean_matrix_8x8==max(max(mean_matrix_8x8)));% select if for the compressed imagecoef_selection_matrix(y,x) = 1;% replicate the selection matrix for all the parts of the dct transform% (remember that the DCT transform creates a set of 8x8 matrices, where% in each matrix I need to choose the coefficients defined by the % <<coef_selection_matrix>> matrix )selection_matrix = repmat( coef_selection_matrix,16,16 );% set it as zero in the mean_matrix, so that in the next loop, we will% choose the "next-most-energetic" coefficientmean_matrix_8x8(y,x) = 0;% choose the most energetic coefficients from the original image% (total of <<number_of_coefficient>> coefficients for this run in the loop)compressed_image = image_8x8_block_dct(original_image) .*selection_matrix;% restore the compressed image from the given set of coeficientsrestored_image = image_8x8_block_inv_dct( compressed_image );% calculate the snr of this image (based on the original image)SNR(number_of_coefficient) =calc_snr( original_image,restored_image );if ~isempty(find(number_of_coefficient==compressed_set))if (number_of_coefficient==1)figure;subplot(3,3,1);imshow( original_image );title( 'original image' );endsubplot(3,3,find(number_of_coefficient==compressed_set)+1);imshow( restored_image );title( sprintf('restored image with %dcoeffs',number_of_coefficient) );endend% plot the SNR graphfigure;plot( [1:64],20*log10(SNR) );xlabel( 'numer of coefficients taken for compression' );ylabel( 'SNR [db] ( 20*log10(.) )' );title( 'SNR graph for picture number 8, section 1.8' );grid on; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%% --------------------------------------------------------------------------------%% I N N E R F U N C T I O N I M P L E M E N T A T I O N%% --------------------------------------------------------------------------------%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%% ---------------------------------------------------------------------------------% pdip_dct2 - implementation of a 2 Dimensional DCT%% assumption: input matrix is a square matrix !% ---------------------------------------------------------------------------------function out = pdip_dct2( in )% get input matrix sizeN = size(in,1);% build the matrixn = 0:N-1;for k = 0:N-1if (k>0)C(k+1,n+1) = cos(pi*(2*n+1)*k/2/N)/sqrt(N)*sqrt(2);elseC(k+1,n+1) = cos(pi*(2*n+1)*k/2/N)/sqrt(N);endendout = C*in*(C');% ---------------------------------------------------------------------------------% pdip_inv_dct2 - implementation of an inverse 2 Dimensional DCT%% assumption: input matrix is a square matrix !% ---------------------------------------------------------------------------------function out = pdip_inv_dct2( in )% get input matrix sizeN = size(in,1);% build the matrixn = 0:N-1;for k = 0:N-1if (k>0)C(k+1,n+1) = cos(pi*(2*n+1)*k/2/N)/sqrt(N)*sqrt(2);elseC(k+1,n+1) = cos(pi*(2*n+1)*k/2/N)/sqrt(N);endendout = (C')*in*C;% ---------------------------------------------------------------------------------% plot_bases - use the inverse DCT in 2 dimensions to plot the base pictures%% Note: we can get resolution be zero pading of the input matrix% that is by calling: in = zeros(base_size*resolution)% where: resolution is an integer > 1% So I will use zero pading for resolution (same as in the fourier theory)% instead of linear interpolation.% ---------------------------------------------------------------------------------function plot_bases( base_size,resolution,plot_type )figure;for k = 1:base_sizefor l = 1:base_sizein = zeros(base_size*resolution);in(k,l) = 1; % "ask" for the "base-harmonic (k,l)"subplot( base_size,base_size,(k-1)*base_size+l );switch lower(plot_type)case'surf3d', surf( pdip_inv_dct2( in ) );case'mesh3d', mesh( pdip_inv_dct2( in ) );case'mesh2d', mesh( pdip_inv_dct2( in ) ); view(0,90);case'gray2d', imshow( 256*pdip_inv_dct2( in ) );endaxis off;end% add a title to the figuresubplot(base_size,base_size,round(base_size/2));h = title( 'Bases of the DCT transform (section 1.3)' );set( h,'FontWeight','bold' );% ---------------------------------------------------------------------------------% image_8x8_block_dct - perform a block DCT for an image% ---------------------------------------------------------------------------------function transform_image = image_8x8_block_dct( input_image )transform_image = zeros( size( input_image,1 ),size( input_image,2 ) ); for m = 0:15for n = 0:15transform_image( m*8+[1:8],n*8+[1:8] ) = ...pdip_dct2( input_image( m*8+[1:8],n*8+[1:8] ) );endend% ---------------------------------------------------------------------------------% image_8x8_block_inv_dct - perform a block inverse DCT for an image% ---------------------------------------------------------------------------------function restored_image = image_8x8_block_inv_dct( transform_image ) restored_image =zeros( size( transform_image,1 ),size( transform_image,2 ) );for m = 0:15for n = 0:15restored_image( m*8+[1:8],n*8+[1:8] ) = ...pdip_inv_dct2( transform_image( m*8+[1:8],n*8+[1:8] ) );endend% ---------------------------------------------------------------------------------% calc_snr - calculates the snr of a figure being compressed%% assumption: SNR calculation is done in the following manner:% the deviation from the original image is considered% to be the noise therefore:%% noise = original_image - compressed_image%% the SNR is defined as:%% SNR = energy_of_image/energy_of_noise%% which yields:% SNR = energy_of_image/((original_image-compressed_image)^2)% ---------------------------------------------------------------------------------function SNR = calc_snr( original_image,noisy_image )original_image_energy = sum( original_image(:).^2 );noise_energy = sum( (original_image(:)-noisy_image(:)).^2 );SNR = original_image_energy/noise_energy;以下是1-9号原图像,放到matlab的.m文件目录里,重命名9个图像名为1、2、3、4、5、6、7、8、9。
基于Matlab环境的JPEG图像压缩算法

量 化
便 于传输 、 存储和译码器进 行译码 , 这样组织 的数据通常 称 为 JE P G位数据流(P G bt t a 。图像 的离散余弦变换 JE i sem) r
具 有把 高 度 相关 数 据 能 量 集 中 的趋 势 , 正 是 他 用 于 图 像 压 这 缩 的优 点 所 在 , 这 一点 被 广 泛 应 用 于 图 像 压 缩 。对 通 常 的 故 图像 来 说 , 多 数 D T系 数 的值 非 常 接 近 0 如 果 舍 弃 这 些 大 C 。
接近零 的 D T系数 值 , 重构 图像 是并 不会带来 画面质量 C 在
(, =0 d H , I u ) r n ” ul
,
() 5
的 显著 下 降 。所 以 , 用 D T进 行 图 像 压 缩 可 以节 约 大 量 利 C
的存储空间 。压缩应 该在最合 理的近似原 图像 的情 况下使
JE (o t it eepr gop , P G ji c r xe ru ) 即联 合 图像 专家 组 。 np u t
JE P G算法 中首先对 图像进行 分块处理 , 在对 每一 快进行 二 维离散余 弦变换 , 变换后 的系数基 本不相关 , 系数矩 阵的 且
Fu ) c )( ∑ ∑f , ・ (, = ( c ) (y x)
一
于空间线性 预测技术 ( 即差分脉冲编码调制) 算法 , 该算法 属
于无失真压缩算法 ; 2种算 法是基 于离散余 弦变换 、 程 第 行 编码 、 熵编码 的有 失真 压缩算 法。 目前 比较 流行后 一种算 法, 即有失真 D T压缩编码 。 C
基于MATLAB的JPEG压缩编码
本文对 J PEG 压缩 算法进行 了初步的研 究, 并编程 实现 了相应 的算法 , 实验结果进 对 行了分析研究 , 出结论 。 得
1 图像压缩技术的现 状
图像 压缩 技术是 数 字时 代的产 物和 重要 组成部 分 , 它的进步对整个社会 的数字化和信 息化都 有不 可估量 的推 动作用 。 然而 , 尽管各种通信媒介容量越来越大并 且各种 通信 协议不断升级 , 随着通 信量爆 炸式 此 , 图像压缩技术得 到国际上学术界 和工程 界极高 的重视 , 由此得到飞 速发展 。 并 各种 图像和 视频 压缩 国际标 准 己出现并 得到 广泛应用 , 中 J G( 其 PE 用于静态图像压缩) 和 MP G( E 用于动态图像压缩) 应用最广。 图像压缩技术的发展趋势是 : 算法更复杂 , 压 缩率更高 , E J G的压缩率在 1 o P : 左右, E 2 0 2 J G 0o P 的压缩率更高 , E 压缩标准也己经几代的发 MP G
个的进 行的 , 则称 标准量化 , 若量化 是成组的 进行 的, 则称矢量 量化 , 量化总会造成 某些信 息丢失 , 形成失真 , 即量化失真或量化噪声 , 为 使失真小 , 应量化的精细 , 但压缩比就高不 了, 这是一对矛盾 , 应选 用恰当的量化级数和 量化 曲线形状来缓解这对 矛盾 , 量化 器的引入是图 像编码产生失真的根源 , 在要求复原 图像 与原 图完全 一致 的无 失真 编码 器中必 须不 用量化 器, 但这样一来 , 压缩 比难以提 高, 在多数应用 中, 存在少量 失真并不 可怕 , 只要把失真 的程 度和性 质控 制在允许的范 围内 , 也就是把 复原 图像 的主观 质量控制在允许 的程 度内 , 可以 就 在满足 应用要 求的前提下提高 压缩 比 , 得注 值 意 的是 , 对于 同样的量化 失真 , 同的映射变 不 换和 反变换反映不 同性质 的复原图像的失 真 , 人 眼对某 些性 质的 失真 敏感而 对 另一些性 质
MATLAB中的图像压缩和编码方法
MATLAB中的图像压缩和编码方法图像压缩和编码是数字图像处理的重要领域,在各种图像应用中起着至关重要的作用。
在本文中,我们将探讨MATLAB中的图像压缩和编码方法,包括无损压缩和有损压缩,并介绍其中的一些经典算法和技术。
一、图像压缩和编码概述图像压缩是指通过一定的算法和技术来减少图像数据的存储量或传输带宽,以达到节约存储空间和提高传输效率的目的。
而图像编码则是将原始图像数据转换为一系列二进制编码的过程,以便存储或传输。
图像压缩和编码通常可以分为无损压缩和有损压缩两种方法。
无损压缩是指压缩后的数据可以完全还原为原始图像数据,不会引入任何失真或变化。
常见的无损压缩算法有Run-Length Encoding (RLE)、Lempel-Ziv-Welch (LZW)、Huffman编码等。
这些算法通常针对图像中的冗余数据进行编码,如重复的像素值或相似的图像区域。
有损压缩则是在保证一定程度的视觉质量下,通过舍弃或近似原始图像数据来减小存储或传输的数据量。
常见的有损压缩算法有JPEG、JPEG2000、GIF等。
这些算法通过离散余弦变换(DCT)、小波变换或颜色量化等方法,将图像数据转换为频域或颜色空间的系数,并通过量化、编码和压缩等步骤来减小数据量。
二、无损压缩方法1. Run-Length Encoding (RLE)RLE是一种简单高效的无损压缩算法,通过计算连续重复像素值的数量来减小数据量。
在MATLAB中,可以使用`rle`函数实现RLE编码和解码。
例如,对于一幅图像,可以将连续的像素值(如白色)编码为重复的个数,然后在解码时根据重复的个数恢复原始像素值。
2. Lempel-Ziv-Welch (LZW)LZW是一种字典压缩算法,通过将图像中连续的像素序列映射为一个短代码来减小数据量。
在MATLAB中,可以使用`lzwencode`和`lzwdecode`函数实现LZW 编码和解码。
例如,对于一段连续的像素序列,可以将其映射为一个短代码,然后在解码时根据代码恢复原始像素序列。
基于Matlab的JPEG图像压缩编码仿真实现
用 Ma a t b做 仿真 实验 , l 方法 简单 而且误 差小 , 大大提 高 了图像 压 缩的效 率和精 度 。 关键 词 : 合 图像 专 家组 ; 联 图像 压 缩算 法 ; 离散 余 弦变换 ; f a Hu m n编码 ; f 峰值 信 噪 比 中图分类 号 :P 1 T 32 文 献标识 码 : A 文章编 号 :01 45(07 1 09 — 3 10 — 5 120 )0— 07 0
( o e eo c a i l n l t c l n ier g H b C l g oaina d Tc n l y H b 4 8 3 ,C ia C l g l fMeh n a a d Ee r a E gn ei , ei ol eo V c t n eh oo , ei 5 0 0 h ) c ci n e f o g n
Ke r s on h tga hee p rsgo p( P ywo d :jitp oolp i x et ru J EG);i g o rsin ag r h 。 ma ec mpe s loi m;dsrt o iet n fr ( Ct o t i e, s r s m D —);lu - c  ̄c n a o l f
S mul to m p e n a i n o i a i n i l me t to fJPEG m a e c mpr s in b s d o a lb i g o e so a e n M ta
Z HA0 W e . ..D nj u ONG Hu— n.Z h. n imi HU Z imi
基于Matlab环境的JPEG图像压缩算法
F( u, v) = C( u) C( v)
y) · ∑ ∑ f( x,
x =0 y =0
π( 2 x + 1 ) u π( 2 y + 1 ) v cos cos 2M 2N
( 1)
收稿日期:2011 - 03 - 15 作者简介:程丽( 1982 —) , 女, 硕士研究生, 讲师, 主要从事系统工程研究 。
21 世纪以来, 随着计算机软硬件以及操作系统的不断 “多媒体技术 ” 发展, 人们对 一词已经耳熟能详, 它有非常重 要的存在必要性, 如图形和图像处理的需要 、 大量数据存储 。“多媒体技术” 的需要等 定义为利用个人计算机对文字 、 图 逻辑关系和人机交互作用的产物 像、 图形、 动3 ] 。 多媒体技术应运而
2011 年 5 月 第 32 卷 第 5 期 四 川 兵 工 学 报 【自动化技术】
基于 Matlab 环境的 JPEG 图像压缩算法
程 丽, 王聪丽, 侯著荣, 王 凯
( 军械工程学院 计算机工程系 , 石家庄 050003 ) 摘要:压缩是多媒体技术得到长足发展的关键技术 , 而图像是多媒体信息的重要组成部分 。 针对图像压缩问题, 分 析了 JPEG 图像压缩系统的原理, 提出了一种基于 DCT 的 JPEG 图像压缩技术, 并在 Matlab 环境下实现了编码和解 演示了一幅图像压缩后的效果 。 码的几个关键步骤, 关键词:图像压缩; DCT; JPEG 图像压缩算法 中图分类号:TP751 文献标识码:A 文章编号:1006 - 0707 ( 2011 ) 05 - 0100 - 03 通过保留低频区部分系数 , 去掉高频区 能量集中在低频区, 的部分, 从而达到压缩目的, 余弦变换时经典谱分析的工具 , 它考察的是整个时域过程中的频域特性 , 或者整个频域过程 中的时域特性, 该算法具有较强的块内去相关的能力 , 适于 较平坦的压缩, 它的特点是没有利用图像中局域间的相关特 性, 在压缩倍数高时, 恢复图像出现明显的方块效应 。 JPEG2000 是由 ISO / IEC JTC1SC29 标准化组织负责的全 新静止图像压缩标准, 一个最大的改进是他采用小波变换代 它既能考查局 替了余弦变换。小波变换是现代谱分析工具 , 部时域过程的频域特性 , 又能考查局部频域过程中的时域问 。 JPEG2000 几何算法在高压缩比下跟传统的 JPEG 压 题 用 缩方式相比, 图像质量并没有明显的降低 , 来自 RAPH LEVIEN 于 2000 年三月所作的对比测试报告表明 : 在中度与低度 的压缩比率下, 传统的 JPEG 表现的更为出色, 但是在较高的 压缩比率下传统的 JPEG 方式就不那么让人满意 , 与传统的 JPEG 压缩方式对比, JPEG2000 的表 在较高的压缩比率小, 现更为优秀。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图像信息是人类赖以获取信息的最重要的来 源之一,大约有70%的信息是通过视觉系统获得的 图像信息。
随着多媒体技术的广泛应用,过去经典的 图像压缩技术已经不能满足人们的需要,人们 迫切的期望更高性能的图像压缩技术的出现。 图像压缩技术水平的高低主要取决于图像压 缩编码的技术水平。
虽然图像信息有着许多优点,但也存在不可 回避的潜在问题,其中一个主要问题就是其数据量 过于庞大。大数据量的图像信息会给存储器的存 储容量,通信干线信道的带宽,以及计算机的处理 速度增加极大的压力。单纯靠增加存储器容量,提 高信道带宽以及计算机的处理速度等方法来解决 这个问题是不现实的,因此对视频图像信号进行压 缩显得尤为必要。数字图像压缩就是对要处理的 图像源数据用一定的规则进行变换和组合,从而达 到以尽可能少的代码来表示尽可能多的数据信息 的目的。
4
科技咨询导报 Science and Technology Consulting Herald
高 新 技 术
有相同的颜色值。在这些情况下不需要存储 每一个像素的颜色值,而只需存储一个像素值 以及具有相同颜色的像素数目。这种编码方 式称为游程编码(Run_Length Encoding, R L E ) 。其中具有同一颜色的连续像素的数目 称为游程长度。例如:aaabcccccccdddeeee 可 以用 3a1b7c3d4e 来代替。对于拥有大量连续 相同数值的数据用 RLE 非常有效。
根据 D C T 系数集中在低频区域、越是高 频区域系数值越小的特点, 根据人眼的视觉特 性, 通过设置不同的视觉阈值或量化电平, 将 许多能量较小的高频分量量化为 0 , 可以增加 变换系数中“0 ”的个数, 同时保留能量较大的 系数分量, 从而获得进一步的压缩。
3 JPEG标准简介及算法研究 3.1 关于 JPEG 标准
(2)哈夫曼(Huffman)编码。哈夫曼编码是 20 世纪 50 年代提出的一种基于统计的无损编码方 法,它利用变长的码来使冗余量达到最小。通过一 个二叉树来编码,是常出现的字符用较短的码来表 示,不常出现的字符用较长的码代表。这些代码都 是二进制码,且码的长度是可变的。如:有一个原 始数据序列 A B A C C C D A A , 则编码为: A ( 0 ) , B (10),C(110),D(111),压缩后为010011011011011100。 静态哈夫曼编码使用一棵依据字符出现的概率事 先生成好的编码树进行编码。而动态哈夫曼编码 需要在编码的过程中建立编码树,并对原始数据扫 描两遍,第一遍扫描要精确地统计出原始数据中的 每个值出现的频率,第二遍是建立哈夫曼树并进行 编码。由于哈夫曼编码需要建立哈夫曼二叉树,并 遍历二叉树生成编码,因此其数据压缩速度和还原 速度都较慢,但简单有效,因而得到了广泛的应用。
J P E G 标准中定义了两种不同性能的系 统:基本系统(Baseline System)和扩展系统 (Extended System)。基本系统采用顺序工作方 法, 在熵编码阶段使用 Huffman 编码方法来降 低冗余度, 解码器只存储两个 Huffman 表。扩 展系统提供增强功能, 它是基本系统的扩展, 使用累进方法工作, 编码过程采用自适应的算 术编码。之所以在 J P E G 中定义两种性能不同 的系统, 主要是考虑到 J P E G 设备的兼容性和 实现的方便性。每个标准解码器都应该能解 释用基本系统编码方法编码的数据。在扩展 中,仅当编码器和解码器都配置相应的选项时才具 有增强功能扩展系统提供增强功能。为了加快 JPEG 压缩算法的执行时间,C-Cube 公司专门推 出 C-CubeC L550 芯片。CL550 是一种单芯片 图像压缩解压缩处理器,它能以视频速率对灰度图 像和彩色图像进行编码和解码,图像压缩比率由片
本文对 J P E G 压缩算法进行了初步的研 究, 并编程实现了相应的算法, 对实验结果进 行了分析研究, 得出结论。
1 图像压缩技术的现状 图像压缩技术是数字时代的产物和重要
组成部分, 它的进步对整个社会的数字化和信 息化都有不可估量的推动作用。
然而, 尽管各种通信媒介容量越来越大并 且各种通信协议不断升级, 随着通信量爆炸式 的增长, 各种传输媒体的带宽却相对显得越来 越窄, 因此, 图像压缩技术得到国际上学术界 和工程界极高的重视, 并由此得到飞速发展。 各种图像和视频压缩国际标准己出现并得到 广泛应用, 其中 J P E G ( 用于静态图像压缩) 和 M P E G ( 用于动态图像压缩) 应用最广。
( 3 ) 按所用方法的原理分类。可将图像编 码方法分为基于图像统计特性, 基于人眼视觉 特性, 基于图像特征提取等方法。在实际编码 中, 常常要同时用到图像的统计特性和人眼视 觉特征才能进行有效的编码, 难于把它们截然 分开。而有些编码方法的类别还可进一步细 分, 如基于统计特性的编码方法还可分为帧内 预测、帧间预测、变换编码等。许多新的国 际图像编码标准使用了混合编码方法, 即同时 用到了帧内、帧间预测和 D C T 编码。 2.3 图像压缩编码的原理
(3)预测编码。预测编码是一种设备简单而 质量较佳的高效编码法。预测编码的方法主要 有两种, 一种是△ M 编码法, 另一种是 DPCM 编 码法。D P C M 编码器纪录与传输的不是样本的 真实值,而是它与预测值的差。由于空间相关性, 真实值与预测值之间差值变化范围远小于真实值 变化范围,因此可以采用较少的位数来纪录数据。
旧存在着缺陷, 主要体现在编解码时间较长, 重构图象边缘有毛刺, 不平滑等方面都需要改进。实验证明用小波变换代替 J P E G 算法中的
D C T 模块可取得较好的视觉效果。
关键词:JPEG 图像编码 DCT 编码
中图分类号: T N 9 1 9 :1673-0534(2007)10(b)-0003-04
2.3.1 冗余信息的几种形式 从信息论观点看, 描述图像信源的数据是 由有效信息量和冗余量两部分组的, 去除冗余 量能够节省存储和传输的开销, 同时又不损害 图像信源的有效信息量。图像数据具有高度 的相关性, 即图像中含有大量的冗余信息。冗 余信息分为: 空间冗余、时间冗余、结构冗余、 知识冗余、信息熵冗余和视觉冗余。 图像压缩编码的可能性就在于图像信息 的基本特性、图像信息理论( 信源) 和人眼视觉 特性( 信宿) 。图像压缩的目的就是要除去这些 冗余信息, 在有些场合, 一定限度的失真是允 许的, 因此可以对图像信源作一定程度有时甚 至是很大程度的压缩。 2.3.2 图像压缩编码的技术原理 视频图像编码技术是一项正在发展中的 复杂技术, 它涉及的知识领域包括计算机视 觉、计算机图形学、信息论、应用数学等。以 下对图像编码技术中常用的重要技术做简要 的介绍。 ( 1 ) 游程编码。有些图像, 尤其是计算机 生成的图形往往有许多颜色相同的图块。在 这些图块中,许多连续的扫描行都具有一种颜 色,或者同一扫描行上有许多连续的像素都具
图像压缩技术的发展趋势是:算法更复杂,压 缩率更高,JPEG 的压缩率在 1:20 左右,JPEG2000 的压缩率更高,MPEG 压缩标准也己经几代的发 展,从 MPEG1,MPEG2,到现在的 MPEG4,压缩算 法越来越复杂,运算量越来越大,压缩率也越来越 高。
2 图像压缩编码概论与理论基础 2.1 图像压缩编码的概念
科技咨询导报 2007 NO.29 Science and Technology Consulting Herald 基于 M A T L A B 的 J P E G 压缩编码
高 新 技 术
朱孔亮 (辽宁大学信息科学与技术学院 110036)
摘 要: J P E G 图像压缩技术以其具备的兼容性和实现的方便性, 以及压缩比最高、质量最好的特点赢得了人们的认可, 但在某些方面依
恢复的失真,无失真编码的压缩比低,可达到的最 高压缩比取决于信源熵,在限失真编码中允许的失 真愈大,可达到的压缩比愈高,即与量化的粗细有 很大关系,在限失真编码中把失真控制在视觉闽值 以下或控制在可容忍的程度是有效的提高压缩比 的关键。
( 2 ) 按压缩图像的不同属性分类。有不同 的分类方法, 如按图像的光学特征分, 有单色、 彩色、多光谱图像的压缩编码; 以灰度等级 分, 有二值图、多值图与灰度图像编码; 若以 动静来分, 有静止图像与序列图像编码, 在静 止图像编码中, 只能进行帧内编码, 而且人眼 对静止图像的失真较运动图像更为敏感, 压缩 比就没有运动图像编码来的高, 但运动图像编 码对实时性的要求很高, 这是它特有的难点, 对不同要求( 无失真、小失真、较大失真) , 不 同性质的图像用适当的编码方法和编码参数 ( 如量化级大小) 进行压缩编码是达到预期效果 的关键。
压缩的理论基础是信息论。从信息论的
图 1 图像压缩编码的一般框图
角度来看, 压缩就是去掉信息中的冗余, 即保 留不确定的信息,去掉确定的信息(可推知的), 也就是用一种更接近信息本质的描述来代替 原有冗余的描述。这个本质的东西就是信息 量(即不确定因素)。 2.2 图像压缩编码一般框图和分类
2.2.1 图像压缩编码的一般框图 图像压缩的过程可以概括成图 1 所示的 三个步骤, 原始图像经映射变换后的数据再经 量化器和熵编码器成为码流输出。 ( 1 ) 映射变换。其目的是通过映射改变图 像数据的特性, 使之更有利于压缩编码。 ( 2 ) 量化器。在限失真编码中要对映射后 的数据进行量化, 若量化是对映射后的数据逐 个的进行的, 则称标准量化, 若量化是成组的 进行的, 则称矢量量化, 量化总会造成某些信 息丢失, 形成失真, 即量化失真或量化噪声, 为 使失真小, 应量化的精细, 但压缩比就高不了, 这是一对矛盾, 应选用恰当的量化级数和量化 曲线形状来缓解这对矛盾, 量化器的引入是图 像编码产生失真的根源, 在要求复原图像与原 图完全一致的无失真编码器中必须不用量化 器, 但这样一来, 压缩比难以提高, 在多数应用 中, 存在少量失真并不可怕, 只要把失真的程 度和性质控制在允许的范围内, 也就是把复原 图像的主观质量控制在允许的程度内, 就可以 在满足应用要求的前提下提高压缩比, 值得注 意的是, 对于同样的量化失真, 不同的映射变 换和反变换反映不同性质的复原图像的失真, 人眼对某些性质的失真敏感而对另一些性质 的失真不敏感。 ( 3 ) 熵编码器。这一步是用来消除符号编 码冗余度的, 它一般不产生失真, 理想的情况 是编出的码流的平均码长等于量化后数据的 信息熵, 常用的编码方法有许多种, 例如分组 码、行程码(RLC) 和变长码(VLC) 、不分组码 以及算术码(Arithmatic Coding)等。行程码传输 的是数据行程长度而不是数据本身,例如要传 108 个 0,用行程码是改为传行程码标记和行程长度 1080 在变长码中最常用的是霍夫曼(Huffman)码, 基本原则是对出现概率大的数值用短码来编,对出 现概率小的数值用长码来编,从而使平均码长减 小。降低码率, 在实际编码器中常把 R L C 和 Huffman 码结合起来,称为霍夫曼行程码,在 H. 261,JPEG,MPEG 等国际标准中用到它,而算术码 则用于 JPEG,H.263,JBIG 等国际标准中。 2.2.2 图像压缩编码的分类 ( 1 ) 按复原图像是否与原图一致。可将编 码方法分为两大类: 无失真编码和限失真编 码。无失真编码又称信息保持编码或可逆编 码, 限失真编码又称非信息保持编码或不可逆 编码, 编码会造成失真, 不过这些失真可以被 控制在一定的限度内,不致影响使用效果,在无失 真编码中不可使用量化器,因为量化总会带来不可