实验10 图像压缩的MATLAB实现

合集下载

MATLAB图象压缩

MATLAB图象压缩

MATLAB图象压缩预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制1.图像压缩的概念减少表示数字图像时需要的数据量2.图像压缩的基本原理去除多余数据.以数学的观点来看,这一过程实际上就是将二维像素阵列变换为一个在统计上无关联的数据集合图像压缩是指以较少的比特有损或无损地表示原来的像素矩阵的技术,也称图像编码.图像数据之所以能被压缩,就是因为数据中存在着冗余。

图像数据的冗余主要表现为:(1)图像中相邻像素间的相关性引起的空间冗余;(2)图像序列中不同帧之间存在相关性引起的时间冗余;(3)不同彩色平面或频谱带的相关性引起的频谱冗余。

3数据压缩的目的就是通过去除这些数据冗余来减少表示数据所需的比特数。

由于图像数据量的庞大,在存储、传输、处理时非常困难,因此图像数据的压缩就显得非常重要。

信息时代带来了“信息爆炸”,使数据量大增,因此,无论传输或存储都需要对数据进行有效的压缩。

在遥感技术中,各种航天探测器采用压缩编码技术,将获取的巨大信息送回地面。

图像压缩是数据压缩技术在数字图像上的应用,它的目的是减少图像数据中的冗余信息从而用更加高效的格式存储和传输数据。

4、图像压缩基本方法图像压缩可以是有损数据压缩也可以是无损数据压缩。

对于如绘制的技术图、图表或者漫画优先使用无损压缩,这是因为有损压缩方法,尤其是在低的位速条件下将会带来压缩失真。

如医疗图像或者用于存档的扫描图像等这些有价值的内容的压缩也尽量选择无损压缩方法。

有损方法非常适合于自然的图像,例如一些应用中图像的微小损失是可以接受的(有时是无法感知的),这样就可以大幅度地减小位速。

从压缩编码算法原理上可以分为以下3类:(1)无损压缩编码种类哈夫曼(Huffman)编码,算术编码,行程(RLE)编码,Lempel zev编码。

(2)有损压缩编码种类预测编码,DPCM,运动补偿;频率域方法:正交变换编码(如DCT),子带编码;空间域方法:统计分块编码;模型方法:分形编码,模型基编码;基于重要性:滤波,子采样,比特分配,向量量化;(3)混合编码。

图像压缩的matlab代码

图像压缩的matlab代码

(1) file_name='baboon.bmp';H=imread(file_name);H=double(H);Grgb=0.2990*H(:,:,1)+0.5870*H(:,:,2)+0.1140*H(:,:,3); NbColors=255;%对矩阵进行量化编码G=wcodemat(Grgb,NbColors);%gray线性的灰阶色调map2=gray(NbColors);%建立图形窗口1figure(1);%建立图像Gimage(G);%应用调色板colormap(map2);title('原图像的灰度图');%显示workplace的变量的详细信息whos('G');%转换成为灰度级索引图像%dwt2单尺度二维离散小波变换[CA1,CH1,CV1,CD1]=dwt2(G,'bior3.7');%从分解系数中提取近似和细节% upcoef2二维系数的直接小波重构A1=upcoef2('a',CA1,'bior3.7',1);H1=upcoef2('h',CH1,'bior3.7',1);V1=upcoef2('v',CV1,'bior3.7',1);D1=upcoef2('d',CD1,'bior3.7',1);%第二幅图像%显示近似和细节figure (2);colormap(map2);subplot(2,2,1);%对矩阵进行量化编码image(wcodemat(A1,192));title('近似A1');subplot(2,2,2);image(wcodemat(H1,192));title('水平细节H1');subplot(2,2,3);image(wcodemat(V1,192));title('垂直细节V1');subplot(2,2,4);image(wcodemat(D1,192));title('对角细节D1');%对图像进行多尺度分解[C,S]=wavedec2(G,2,'bior3.7');%提取分解后的近似和细节系数%提取一维小波变换低频系数CA2=appcoef2(C,S,'bior3.7',2);%提取小波变换高频系数[CH2,CV2,CD2]=detcoef2('all',C,S,2); [CH1,CV1,CD1]=detcoef2('all',C,S,1); %从系数C重构第二层近似A2=wrcoef2('a',C,S,'bior3.7',2);H1=wrcoef2('h',C,S,'bior3.7',1);V1=wrcoef2('v',C,S,'bior3.7',1);D1=wrcoef2('d',C,S,'bior3.7',1);H2=wrcoef2('h',C,S,'bior3.7',2);V2=wrcoef2('v',C,S,'bior3.7',2);D2=wrcoef2('d',C,S,'bior3.7',2);%第三幅图像%显示多尺度分解的结果figure (3);colormap(map2);subplot(2,4,1);image(wcodemat(A1,192));title('近似A1');subplot(2,4,2);image(wcodemat(H1,192));title('水平细节H1');subplot(2,4,3);image(wcodemat(V1,192));title('垂直细节V1');subplot(2,4,4);image(wcodemat(D1,192));title('对角细节D1');subplot(2,4,5);image(wcodemat(A2,192));title('近似A2');subplot(2,4,6);image(wcodemat(H2,192));title('水平细节H2');subplot(2,4,7);image(wcodemat(V2,192));title('垂直细节V2');subplot(2,4,8);image(wcodemat(D2,192));title('对角细节D2');%第四幅图像%从多尺度分解后的系数重构原始图像并显示结果G0=waverec2(C,S,'bior3.7');%建立图形窗口4figure (4);%建立图像G0image(G0);%应用调色板colormap(map2);%绘制调色板的内容colorbar;whos('G0')(2)file_name=('bab.bmp');H=imread(file_name);H=double(H);ca=0.2990*H(:,:,1)+0.5870*H(:,:,2)+0.1140*H(:,:,3);NbColors=255;G=wcodemat(ca,NbColors);map2=gray(NbColors);figure(1);image(G);colormap(map2);title('原图像的灰度图');whos('G');%对图像进行多尺度二维小波分解[c,s]=wavedec2(G,2,'bior3.7');ca1=appcoef2(c,s,'bior3.7',1);ch1=detcoef2('h',c,s,1);cv1=detcoef2('v',c,s,1);cd1=detcoef2('d',c,s,1);%对各频率进行小波重构a1=wrcoef2('a',c,s,'bior3.7',1);h1=wrcoef2('h',c,s,'bior3.7',1);v1=wrcoef2('v',c,s,'bior3.7',1);d1=wrcoef2('d',c,s,'bior3.7',1);G1=[a1,h1;v1,d1];figure(2);image(G1);colormap(map2);axis square;title('分解后低频和高频信息') whos('G1');ca1=appcoef2(c,s,'bior3.7',1);ca1=wcodemat(ca1,440,'mat',1);ca2=0.6*ca1;figure(3);image(ca2);colormap(map2);title('低频压缩图像');whos('ca2');ca3=appcoef2(c,s,'bior3.7',2);ca3=wcodemat(ca3,440,'mat',0); ca4=0.5*ca3;figure(4);image(ca4);title('二层分解后低频压缩图像'); colormap(map2);whos('ca4');。

matlab实现jpeg算法进行图像压缩的源代码

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进行图像压缩的技巧

使用Matlab进行图像压缩的技巧

使用Matlab进行图像压缩的技巧引言图像是一种重要的信息表达方式,广泛应用于数字媒体、通信和计算机视觉等领域。

然而,由于图像所占用的存储空间较大,如何有效地进行图像压缩成为了一个重要的问题。

Matlab作为一种强大的数学计算和数据处理工具,可以提供多种图像压缩的技巧,本文将介绍一些常用且有效的图像压缩技巧。

一、离散余弦变换(Discrete Cosine Transformation, DCT)离散余弦变换是一种将空间域中图像转换为频域中的图像的技术。

在Matlab中,可以通过dct2函数实现离散余弦变换。

该函数将图像分块,并对每个块进行DCT变换,然后将变换后的系数进行量化。

通过调整量化步长,可以实现不同程度的压缩。

DCT在图像压缩中的应用广泛,特别是在JPEG压缩中得到了广泛的应用。

二、小波变换(Wavelet Transformation)小波变换是一种将时域信号转换为时频域信号的技术。

在图像压缩中,小波变换可以将图像表示为不同尺度和频率的小波系数。

通过对小波系数进行量化和编码,可以实现图像的有效压缩。

Matlab提供了多种小波变换函数,如wavedec2和waverec2。

这些函数可以对图像进行多尺度小波分解和重构,从而实现图像的压缩。

三、奇异值分解(Singular Value Decomposition, SVD)奇异值分解是一种将矩阵分解为三个矩阵乘积的技术。

在图像压缩中,可以将图像矩阵进行奇异值分解,并保留较大的奇异值,从而实现图像的压缩。

Matlab提供了svd函数,可以方便地实现奇异值分解。

通过调整保留的奇异值个数,可以实现不同程度的图像压缩。

四、量化(Quantization)量化是将连续数值转换为离散数值的过程。

在图像压缩中,量化用于将变换后的图像系数转换为整数值。

通过调整量化步长,可以实现不同程度的压缩。

在JPEG压缩中,量化是一个重要的步骤,通过调整量化表的参数,可以实现不同质量的压缩图像。

MATLAB中的图像压缩和编码方法

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进行图像压缩的最佳实践

使用MATLAB进行图像压缩的最佳实践

使用MATLAB进行图像压缩的最佳实践图像压缩在现代生活中扮演着重要的角色,使得我们能够在网络上共享和传输大量的图像。

其中,MATLAB作为一种强大的数学软件,被广泛应用于图像处理领域。

本文将讨论使用MATLAB进行图像压缩的最佳实践,包括常用的图像压缩算法、压缩参数的选择,以及压缩质量和压缩比之间的关系。

一、图像压缩算法图像压缩的目标是通过减少图像的冗余信息来减小图像文件的大小。

常用的图像压缩算法包括无损压缩和有损压缩两种类型。

1. 无损压缩无损压缩算法通过保留图像的所有细节和像素信息来减小文件大小。

这种算法可以用于具有强烈需求的应用场景,如医学图像和卫星图像等需要完全保留细节的领域。

MATLAB中提供了多种无损压缩算法,如Lempel-Ziv-Welch (LZW)、Run Length Encoding (RLE)等。

用户可以根据具体需求选择合适的无损压缩算法。

2. 有损压缩与无损压缩相反,有损压缩算法通过舍弃图像中的一些细节和像素信息来减小文件大小。

这种算法可以在一定程度上降低图像的质量,但能够在较小的文件大小下提供更高的压缩比。

在MATLAB中,常用的有损压缩算法有JPEG、JPEG 2000等。

这些算法可以通过调整压缩参数来平衡图像的压缩质量和压缩比。

二、压缩参数的选择在进行图像压缩时,选择合适的压缩参数对于达到所需的压缩质量和压缩比非常重要。

通常,压缩参数与压缩算法有关。

以下是常用的压缩参数及其含义:1. 压缩比压缩比通常用来衡量图像压缩的效果,即原始图像的大小与压缩后图像的大小之比。

压缩比越大表示压缩效果越好,但可能导致图像质量的损失。

2. 色彩深度色彩深度指图像中每个像素表示颜色的位数。

较低的色彩深度会导致颜色表达的不准确,而较高的色彩深度会增加图像的大小。

根据具体需求,可以在舍弃一些细节的情况下选择较低的色彩深度,从而达到更高的压缩比。

3. 量化级别量化级别用来衡量图像压缩过程中对颜色信息的丢失程度。

MATLAB通过DCT对图像进行区域编码以及门限编码压缩

MATLAB通过DCT对图像进行区域编码以及门限编码压缩

实验作业7分别用区域编码和阈值编码方法实现图像压缩,用8×8DCT变换,保留50%的大系数,并对解码图像进行比较。

要求:DCT要自己实现,不能用matlab中的DCT函数区域编码程序代码:clear;I=imread('d:\3.jpg');I=double(rgb2gray(I));figure(1);imshow(uint8(I));title('原图像');Y=zeros(8,8);for i=1:8for j=1:8if i==1Y(i,j)=sqrt(1/8);elseY(i,j)=sqrt(2/8)*cos((pi*(2*(j-1)+1)*(i-1))/16);endendends=blkproc(I,[8 8],'P1*x*P2',Y,Y'); figure(2);imshow(uint8(s));for j=1:8for i=1:8if j<=8-i+1a(i,j)=1;elsea(i,j)=0;end;end;end;s=blkproc(s,[8 8],'P1.*x',a); figure(3);imshow(uint8(s));s=blkproc(s,[8 8],'P1*x*P2',Y',Y); figure(4);imshow(uint8(s));title('经过压缩处理的图像')运行结果:阈值编码程序代码clear;I=imread('d:\3.jpg'); I=rgb2gray(I); imshow(uint8(I)); title('原图像'); I=double(I); for i=1:8 for j=1:8 if (i==1)Y(i,j)=sqrt(1/8); elseY(i,j)=sqrt(2/8)*cos((i-1)*(2*j-1)*pi/(2*8)); end; end; end; s=blkproc(I,[8 8],'P1*x*P2',Y,Y'); a=ones(8,8); b=reshape(Y,1,64); midvalue=median(b); for i=1:8 for j=1:8if(abs(Y(i,j))<midvalue) a(i,j)=0; end; end; end;s=blkproc(s,[8 8],'P1.*x',a); s=blkproc(s,[8 8],'P1*x*P2',Y',Y); figure(2); imshow(uint8(s));title('被与之编码方式压缩的图像');运行结果:心得体会:由于第八章内容上课听的不是很明白,所以作业题拿到之后不知道怎么做,重新把第八章看了一遍,可是很多地方看了好久好多次还是不明白其原理,就像这次所涉及的DCT (虽然会做作业,但是实在是不理解),区域编码,门限编码,都是不明白什么意思!后来网上搜罗资料,看了颇久,请教了同学,才慢慢知道是什么一回事,做这题目的时候,遇到过不知道怎么分块的问题,后来也是同学告诉有个blkproc 的函数可以用,才使到程序精简化。

基于变换域的图像压缩及Matlab实现

基于变换域的图像压缩及Matlab实现
cm rsi , i rt cs et nf m (C ) n ae tr s rl ae nt nf m dm i a sd a dteep r e t a o pes n ds ee oi a s r D T a dw vl a f n bsdo a s r o anw sue , n x e m n w s o c n r o e tn o r o h i
小波变换( ae t r sr ) W vl a f 等多种方法[ eT n o m 3 ] 。这些变换算法本
身并不能实现 图像 的编码 , 但是经过变换 的信号具 有 良好 的
能量集 中性 ,通过对反应信号能量分 布的变换 系数 的取舍 , 再采用适 当的系数量化 和符号编码 , 就可 以实 现其 在变换域
W ANG i g Jn
(. ui l g, ui h a x,10 0 C la2 h ax oma U ies y X ’nS a n i7 0 6 , hn ) 1Y l Col e Y l S a n i7 9 0 , hn ;. a n i r l nv ri , ia h a x ,10 2 C ia n e n S N t
中的元素值大小。 最后将变换得到 的量化的 D T系数进行编 C
图像压缩 的方法很多 ,变换域压缩 属于有损压缩方法 ,
直接对 图像像 素在 图像变换 空间进行 操作 。包括基 于 K— ( L K ru e— ev 变换 、 ar ah nn L oe) H a 变换 、 ls— dm r 换 、 Wa h Haa ad变 斜 (ln 变换 、 S t a) 离散余弦变换 D T Dsrt C s eTas r ) C ( i e oi rnf 和 c e n o m

JPEG图像压缩Matlab程序

JPEG图像压缩Matlab程序

% function ReconImage=func_DCTJPEG(I,q)%% 1.This function tests the DCTJPEG codec%% ReconImage=DCTJPEG(I,q),I为待压缩图像,q为量化因子,ReconImage为解压缩重建图像。

%% 2.This function calls:%% blkproc.m,DCHuffmanEncoding.m,ACHuffmanEncoding.m,zigzag.m,PSNR.m, %% 对灰度图像进行DCT变换,量化,ZigZag扫描,Huffman编解码,反量化,反DCT 变换而重建图像。

%% 其中,blkproc.m为分块DCT变换函数;%% DCHuffmanEncoding.m,ACHuffmanEncoding.m分别为DC和AC变换系数的Huffman码表函数;%% zigzag.m为ZigZag扫描函数;PSNR.m为求图像峰值信噪比函数。

%% Copyright 2008 Reserved @ Wang Chengyou @ Tianjin University, P.R.China.%%******************************************************************* *******************%%%%Testclose all;clear all;clc;% fname=input('Please input the bmp image name:','s');%%读一幅bmp灰度图像% [I,map]=imread(fname,'bmp');I=imread('lena512.bmp');%%读bmp灰度图像q=1;%%设定量化因子OriginalImage=I;Q=q;OriginalImage=double(OriginalImage);%%图像数据类型转换ImageSub=OriginalImage-128;%%电平平移128[Row,Col]=size(OriginalImage);%%图像的大小BlockNumber=Row*Col/64;%%8*8分块数%% dct2变换:把ImageSub分成8*8像素块,分别进行dct2变换,得变换系数矩阵CoefCoef=blkproc(ImageSub,[8,8],'dct2(x)');%% 量化:用量化矩阵L量化Coef得CoefAfterQ%% JPEG建议量化矩阵L=Q*[16 11 10 16 24 40 51 6112 12 14 19 26 58 60 5514 13 16 24 40 57 69 5614 17 22 29 51 87 80 6218 22 37 56 68 109 103 7724 35 55 64 81 104 113 9249 64 78 87 103 121 120 10172 92 95 98 112 100 103 99];CoefAfterQ=blkproc(Coef,[8,8],'round(x./P1)',L);%%向靠近的整数取圆整%% 把CoefAfterQ分成8*8的块得分块矩阵CoefBlockm=0;for row=1:Row/8for col=1:Col/8m=m+1;CoefBlock(:,:,m)=CoefAfterQ(((row-1)*8+1):(row*8),((col-1)*8+1):(col*8));endendm;%% 把量化后各个分块的DC系数存放到行矩阵DC中DC(m)=0;for i=1:mDC(i)=CoefBlock(1,1,i);endDC;%% 求由各个DC系数的差值组成的行矩阵DCdifDCdif(BlockNumber)=0;DCdif(1)=DC(1);for i=2:BlockNumberDCdif(i)=DC(i)-DC(i-1);endDCdif;%% 用行矩阵DCdif中的差值替换原来系数矩阵CoefBlock中各个分块的DC系数m=0;for i=1:Row/8for j=1:Col/8m=m+1;CoefBlock(1,1,m)=DCdif(m);endendm;%% 把分块矩阵CoefBlock放到变换系数大矩阵CoefDCchanged中n=0;forrow=1:Row/8for col=1:Col/8n=n+1;CoefDCchanged(((row-1)*8+1):(row*8),((col-1)*8+1):(col*8))=CoefBlock(:,:,n);endendn;%%******************************************************************* *******************************%% 至此,完成了所有块中DC系数的替换(除第一个分块以外),为以后的DC系数差分编码做好了准备%%******************************************************************* *******************************%%*********************** the first--end blocks ************************%% 以下对每个分块进行量化,ZigZag扫描和编码(分别对DC系数和AC系数)%%******************************************************************* ***%% 整个图像编码后的bit序列以及bit序列的长度ImageBitSeq=[];ImageBitLen=[];%% 调试用,用来记循环的次数rowloop=0;for row=1:Row/8colloop=0;for col=1:Col/8m(1:8,1:8)=CoefDCchanged((row-1)*8+1:(row-1)*8+8,(col-1)*8+1:(col-1)*8+8);k= round(m); %% 就近取整%k;%% k为变换系数矩阵经量化并就近取整后的矩阵%% ZigZag Scaning%%*********************************************************t=zigzag(k);%t;%% t为zigzag扫描结果。

如何使用Matlab进行图像压缩和图像恢复技术实现

如何使用Matlab进行图像压缩和图像恢复技术实现

如何使用Matlab进行图像压缩和图像恢复技术实现图像压缩和图像恢复技术在数字图像处理领域中起着至关重要的作用。

随着数字图像的广泛应用,图像压缩已经成为了一种必要的手段。

而图像恢复技术则可以使压缩后的图像更好地还原,提高图像质量。

本文将介绍如何使用Matlab进行图像压缩和图像恢复技术的实现。

首先,我们需要了解图像压缩的基本原理。

图像压缩通常包括有损压缩和无损压缩两种方式。

有损压缩是指在压缩图像的过程中会有一定的信息损失,而无损压缩则是保证图像质量不受损失的压缩方式。

在Matlab中,我们可以使用多种算法实现图像压缩。

其中,最常用的算法是基于离散余弦变换(DCT)的JPEG压缩算法。

JPEG算法的基本思想是将图像分成若干个8x8的小块,然后对每个小块进行DCT变换,再对变换后的系数进行量化,最后采用熵编码的方式进行压缩。

具体操作如下:1. 将彩色图像转换为灰度图像:在Matlab中,可以使用rgb2gray函数将彩色图像转换为灰度图像。

2. 将图像分成若干个8x8的小块:可以使用im2col函数将图像转换为列,然后使用reshape函数将列重新组合成8x8的小块。

3. 对每个小块进行DCT变换:可以使用dct2函数对每个小块进行DCT变换。

4. 对变换后的系数进行量化:将变换后的系数除以一个预定义的量化矩阵,然后四舍五入取整。

5. 采用熵编码进行压缩:根据量化后的系数,使用Huffman编码或算术编码等方法进行压缩。

在实际应用中,我们还可以对JPEG算法进行一些改进,以提高压缩效果。

例如,可以根据图像内容的特点对量化矩阵进行优化,可以使用小波变换代替DCT变换等。

接下来,我们将介绍如何使用Matlab进行图像的恢复。

图像恢复通常包括去噪和超分辨率重建两个步骤。

对于图像去噪,Matlab提供了多种滤波器和去噪算法,例如中值滤波、均值滤波、小波去噪等。

我们可以使用这些工具对图像进行去噪处理。

对于图像的超分辨率重建,Matlab中有多种算法可供选择,例如插值法、边缘增强法、小波插值法等。

在Matlab中进行图像压缩与图像解密的方法与技巧

在Matlab中进行图像压缩与图像解密的方法与技巧

在Matlab中进行图像压缩与图像解密的方法与技巧Matlab是一种强大的工具,被广泛用于图像处理和计算机视觉领域。

在本文中,我们将讨论如何利用Matlab进行图像压缩与图像解密,并探讨一些相应的方法和技巧。

首先,让我们来了解一下图像压缩的基本概念和原理。

图像压缩是通过减少图像占用的存储空间或传输带宽来减小图像文件的大小。

压缩分为有损压缩和无损压缩两种类型。

有损压缩会丢失一些图像信息,以达到压缩的目的,而无损压缩则尽量保留所有图像信息。

在Matlab中,我们可以使用多种方法进行图像压缩。

常见的方法之一是使用离散余弦变换(Discrete Cosine Transform,DCT)。

DCT将图像分解为一系列互不相关的频率成分,然后根据其重要性对这些成分进行量化和编码。

通过调整量化步长可以控制压缩比率和图像质量。

除了DCT,还有其他一些常用的压缩方法,如小波变换(Wavelet Transform),它可以提供更好的局部逼近能力,适用于不同尺度和方向的图像特征。

Matlab中有许多内置函数可以实现小波变换,例如waverec和wavedec函数。

另一个常用的图像压缩方法是基于向量量化(Vector Quantization,VQ)的编码。

VQ将图像划分为不重叠的块,并使用聚类算法将每个块映射到具有较少位数的代表向量。

然后,通过编码代表向量和其在图像中的位置来表示整个图像。

这种方法对于有损压缩非常有效,但在无损压缩方面效果较差。

一旦我们对图像进行了压缩,接下来我们需要了解如何进行图像解密。

在Matlab中,解密可以通过逆向操作来实现。

对于DCT压缩,我们可以通过应用逆离散余弦变换(Inverse Discrete Cosine Transform,IDCT)来恢复原始图像。

同样,对于小波变换压缩,我们可以使用逆小波变换(Inverse Wavelet Transform)来还原图像。

需要注意的是,如果进行了有损压缩,解密后的图像与原始图像之间很可能有一些质量损失。

图像JPEG压缩的matlab实现

图像JPEG压缩的matlab实现

图像JPEG压缩的matlab实现图像JPEG压缩的matlab实现图像JPEG压缩的matlab实现作者姓名:专业名称:信息⼯程指导教师:讲师摘要随着现代经济的发展,影像风暴已经席卷了我们的⽇常⽣活,图像对于⼈们已经息息相关。

⼈们对计算机实时处理图像的要求就相对有所提⾼。

现在我们就⾯对⼀个问题,如何在保证图像质量的前提下,同时能够考虑到实时性和⾼效性就成了⼀个⼤家关注的问题。

那么对图像数据信息进⾏必要的压缩,以便能够保证图像的快速存储和传输。

但是,我们通常看到的图像是⼀种重要的⼆维信号,所以它本⾝就包含⾮常庞⼤的数据量,为了快速存储和实时传输,就必须对图像信息进⾏相应的压缩处理。

新兴的数学⼯具是局域DCT变换是⼀种新兴的数学⼯具,在现在社会中,图像压缩技术现在正受到⼤量的关注与研究。

本次课题设计在分析近年来,在图像处理领域,对图像压缩普遍⽅法的基础之上,充分学习和分析了基于DCT变换的图像压缩的相关编码及其基本原理和实现步骤。

简单概述了图像压缩的基本原理以及发展现状和⽅向,全⾯分析了DCT变换算法以及思路,提出了采⽤DCT变换压缩的依据和优势。

本⽂同时也介绍了图像压缩过程的重要步骤——编码量的⽅法和原理。

为了⽅便简单,将使⽤MATLAB2010实现JPEG图像压缩的仿真。

在论⽂最后,将介绍仿真的过程以及仿真结果说明,阐述⽤MATLAB来实现离散余弦变换的图像压缩的基本过程,并总结相关⽅法的优缺点。

同时也将充分展⽰压缩前后的图像,并做相应的⽐较。

关键词:图像压缩DCT matlab仿真AbstractWith the development of modern economy, the storm has swept through the image of our daily life, people have been closely related to the image for the. People's requirements on image real-time processing is relatively improved. Now we face a problem, how to guarantee the quality of the image, at the same time can be old enough considering the real-time and efficiency has become an issue of concern. This information is certain to image compression and processing has become a very important link. However, the image is an important signal, due to the large amount of data, while the storage and transmission of the compressed. New mathematical tools are discrete cosine transform is a new mathematical tool, based on the discrete cosine transform image compression technology is now being a lot of attention and research.In this paper, based on the analysis of the general methods of image compression in recent years, the basic principles and implementation steps of image compression based on DCT transform are also discussed. In this paper, the principle and development of image compression are introduced briefly, and the DCT transform algorithm is analyzed and compared with other compression methods. The basis of DCT transform compression is proposed. The final step of the image compression process is to encode the quantized image. This. We use MATLAB6.5 to realize the simulation of JPEG image compression. The simulation results show that using MATLAB to achieve the image discrete cosine transform compression method is simple, fast, small error advantages, greatly improves the efficiency and accuracy of image compression.Keywords: DCT ,matlab,simulation image, compression⽬录图像JPEG压缩的matlab实现........................................................ I 摘要. (I)Abstract.......................................................................................... II ⽬录. (III)前⾔ (1)1 绪论 (3)1.1论⽂研究背景及意义 (3)1.2 JPEG图像的发展历史及简介 (4)1.3 JPEG图像在DCT中压缩的作⽤ (5)1.4 本⽂研究的主要内容 (6)2 图像压缩编码原理 (7)2.1 DCT变换的来源 (7)2.2基于DCT的JPEG图像压缩编码步骤 (8)2.3图像压缩处理技术基本理论 (9)3 图像压缩的MATLAB实现 (12)3.1离散余弦变换的定义及原理 (12)3.2离散余弦变换的算法实现 (13)3.3图形⽤户界⾯介绍 (14)3.3.1图像⽂件读取 (15)3.3.2图像⽂件输出 (16)4 运⾏结果及分析 (18)4.1 程序流程图 (18)4.2 MATLAB仿真结果 (19)4.3 实验结果及分析 (20)总结 (23)参考⽂献 (25)致谢 (26)附件1 图像JPEG压缩的matlab程序 (27)前⾔在当今,⼈们⼤多都都已经迈⼊了信息化的社会,信息交换技术已经发展出不同的形式,主要的信息分为三种形式:1.⽂字2.⾳频3.图像。

数字图像处理实验报告图像压缩

数字图像处理实验报告图像压缩

数字图像处理实验报告图像压缩竭诚为您提供优质文档/双击可除数字图像处理实验报告图像压缩篇一:数字图像处理实验报告数字图像处理实验报告课程:班级:学号:姓名:指导老师:日期:实验一内容一mATLAb数字图像处理初步一、实验目的与要求1.熟悉及掌握在mATLAb中能够处理哪些格式图像。

2.熟练掌握在mATLAb中如何读取图像。

3.掌握如何利用mATLAb来获取图像的大小、颜色、高度、宽度等等相关信息。

4.掌握如何在mATLAb中按照指定要求存储一幅图像的方法。

5.图像间如何转化。

二、实验内容及步骤1.利用imread()函数读取一幅图像,假设其名为flower.tif,存入一个数组中;解:读取图像,存入数组I 中:I=imread(flower.tif);2.利用whos命令提取该读入图像flower.tif的基本信息;解:查询数组I的信息:3.利用imshow()函数来显示这幅图像;解:因为imshow()方法不能直接显示tif图像矩阵,因此要先转换成Rgb模式,再调用imshow()显示。

代码如下:>>I1=I(:,:,1);>>I2=I(:,:,2);>>I3=I(:,:,3);>>Rgb=cat(3,I1,I2,I3);>>imshow(Rgb);显示的图像为:4.利用imfinfo函数来获取图像文件的压缩,颜色等等其他的详细信息;解:代码如下:>>imfinfo(flower.tif)结果截图:5.利用imwrite()函数来压缩这幅图象,将其保存为一幅压缩了像素的jpg文件,设为flower.jpg;语法:imwrite(原图像,新图像,‘quality’,q),q取0-100。

解:代码:>>imwrite(Rgb,flower.jpg,quality,80);结果截图:6.同样利用imwrite()函数将最初读入的tif图象另存为一幅bmp 图像,设为flower.bmp。

matlab压缩JPEG实验及程序

matlab压缩JPEG实验及程序

实验四JPEG压缩一、实验原理1、数据分块对图像进行编码前,将每个分量图像分割成不重叠的8×8像素块,每一个8×8像素块称为一个数据单元(DU)。

在彩色图像中,JPEG分别压缩图像的每个彩色分量。

虽然JPEG可以压缩通常的红绿蓝分量,但在YCbCr 空间的压缩效果会更好。

这是因为人眼对色彩的变化不如对亮度的变化敏感,因而对色彩的编码可以比对亮度的编码粗糙些,这主要体现在不同的采样频率和量化精度上。

因此,编码前一般先将图像从RGB空间转换到YCbCr 空间,再把各分量图像分割成8×8数据块。

在对图像采样时,可以采用不同的采样频率,这种技术称为二次采样。

由于亮度比色彩更重要,因而对Y分量的采样频率可高于对Cb、Cr的采样频率,这样有利于节省存储空间。

常用的采样方案有YUV422和YUV411。

把采样频率最低的分量图像中一个DU所对应的像区上覆盖的所有各分量上的DU按顺序编组为一个最小编码单元(MCU)。

对灰度图像而言,只有一个Y分量,MCU就是一个数据单元。

而对彩色图像而言,以4:1:1的采样方案为例,则一个MCU由4个Y分量的DU、1个Cb分量的DU和1个Cr 分量的DU组成。

2、DCT处理图像数据块分割后,即以MCU为单位顺序将DU进行二维离散余弦变换。

对以无符号数表示的具有P位精度的输入数据,在DCT前要减去2P-1,转换成有符号数,而在IDCT后,应加上2P-1,转换成无符号数。

对每个8×8的数据块DU进行DCT后,得到的64个系数代表了该图像块的频率成分,其中低频分量集中在左上角,高频分量分布在右下角。

系数矩阵左上角的叫做直流(DC)系数,它代表了该数据块的平均值,其余63个叫交流(AC)系数。

3、系数量化在DCT处理中得到的64个系数中,低频分量包含了图像亮度等主要信息。

在从空间域到频域的变换中,图像中的缓慢变化比快速变化更易引起人眼的注意,所以在重建图像时,低频分量的重要性高于高频分量。

如何使用Matlab进行图像压缩与解压

如何使用Matlab进行图像压缩与解压

如何使用Matlab进行图像压缩与解压1.引言图像是数字时代中不可或缺的一部分,它们在各种领域中扮演着重要角色,如电视、电影、医学和计算机视觉等。

然而,随着图像质量和分辨率的提升,图像的文件大小也大幅增加,对存储和传输带来了不小的挑战。

为解决这一问题,图像压缩技术应运而生。

本文将介绍如何使用Matlab进行图像压缩与解压,以提升图像的存储和传输效率。

2.图像压缩的基本原理图像压缩的目标是通过减少图像文件的大小来节省存储空间和传输带宽。

它通常分为有损压缩和无损压缩两种类型。

有损压缩通过牺牲一部分图像细节来减小文件大小,而无损压缩则保持图像的完整性。

本文主要讨论有损压缩方法。

有损压缩的主要原理是通过利用图像的冗余性和视觉感知特性来去除冗余信息和减少图像细节。

常见的有损压缩方法有基于变换的压缩和基于预测的压缩。

其中,基于变换的压缩方法利用离散余弦变换(DCT)或小波变换等将图像转换成频域表示,然后通过量化和熵编码等步骤来减少数据量。

基于预测的压缩方法则通过对图像中的像素进行预测,并对预测误差进行编码来减小数据量。

3.使用Matlab进行图像压缩Matlab是一种功能强大的数学软件,也是进行图像处理和压缩的理想选择。

Matlab提供了丰富的图像处理工具箱,使我们能够轻松地实现图像压缩算法。

首先,我们需要将图像加载到Matlab中。

通过使用imread函数,我们可以将图像文件读取为一个矩阵。

```matlabimage = imread('image.jpg');```然后,我们可以使用不同的压缩算法对图像进行压缩。

以基于DCT的压缩为例,我们可以使用dct2函数将图像转换为频域表示。

```matlabdct_image = dct2(image);```接下来,我们可以对频域表示的图像进行量化。

量化是将图像的频域系数映射到一组有限的离散值的过程。

可以通过设计一个量化矩阵来控制图像的压缩比率。

MATLAB图象压缩讲解

MATLAB图象压缩讲解

1.图像压缩的概念减少表示数字图像时需要的数据量2.图像压缩的基本原理去除多余数据.以数学的观点来看,这一过程实际上就是将二维像素阵列变换为一个在统计上无关联的数据集合图像压缩是指以较少的比特有损或无损地表示原来的像素矩阵的技术,也称图像编码.图像数据之所以能被压缩,就是因为数据中存在着冗余。

图像数据的冗余主要表现为:(1)图像中相邻像素间的相关性引起的空间冗余;(2)图像序列中不同帧之间存在相关性引起的时间冗余;(3)不同彩色平面或频谱带的相关性引起的频谱冗余。

3数据压缩的目的就是通过去除这些数据冗余来减少表示数据所需的比特数。

由于图像数据量的庞大,在存储、传输、处理时非常困难,因此图像数据的压缩就显得非常重要。

信息时代带来了“信息爆炸”,使数据量大增,因此,无论传输或存储都需要对数据进行有效的压缩。

在遥感技术中,各种航天探测器采用压缩编码技术,将获取的巨大信息送回地面。

图像压缩是数据压缩技术在数字图像上的应用,它的目的是减少图像数据中的冗余信息从而用更加高效的格式存储和传输数据。

4、图像压缩基本方法图像压缩可以是有损数据压缩也可以是无损数据压缩。

对于如绘制的技术图、图表或者漫画优先使用无损压缩,这是因为有损压缩方法,尤其是在低的位速条件下将会带来压缩失真。

如医疗图像或者用于存档的扫描图像等这些有价值的内容的压缩也尽量选择无损压缩方法。

有损方法非常适合于自然的图像,例如一些应用中图像的微小损失是可以接受的(有时是无法感知的),这样就可以大幅度地减小位速。

从压缩编码算法原理上可以分为以下3类:(1)无损压缩编码种类哈夫曼(Huffman)编码,算术编码,行程(RLE)编码,Lempel zev编码。

(2)有损压缩编码种类预测编码,DPCM,运动补偿;频率域方法:正交变换编码(如DCT),子带编码;空间域方法:统计分块编码;模型方法:分形编码,模型基编码;基于重要性:滤波,子采样,比特分配,向量量化;(3)混合编码。

JPEG图像压缩Matlab程序

JPEG图像压缩Matlab程序

% function ReconImage=func_DCTJPEG(I,q)%%**************************************************************************** **********%%%% 1.This function tests the DCTJPEG codec%% written by Wang Chengyou in Tianjin University,China in Apr. 2006.%% Contact me: E-mail: wangchengyou@%% Address: Mailbox 23,School of Electronic Information Engineering,%% Tianjin University,Tianjin,P.R.China,300072%% ReconImage=DCTJPEG(I,q),I为待压缩图像,q为量化因子,ReconImage为解压缩重建图像。

%% 2.This function calls:%% blkproc.m,DCHuffmanEncoding.m,ACHuffmanEncoding.m,zigzag.m,PSNR.m,%% 对灰度图像进行DCT变换,量化,ZigZag扫描,Huffman编解码,反量化,反DCT变换而重建图像。

%% 其中,blkproc.m为分块DCT变换函数;%% DCHuffmanEncoding.m,ACHuffmanEncoding.m分别为DC和AC变换系数的Huffman 码表函数;%% zigzag.m为ZigZag扫描函数;PSNR.m为求图像峰值信噪比函数。

%% Copyright 2008 Reserved @ Wang Chengyou @ Tianjin University, P.R.China.%%**************************************************************************** **********%%%%Testclose all;clear all;clc;% fname=input('Please input the bmp image name:','s');%%读一幅bmp灰度图像% [I,map]=imread(fname,'bmp');I=imread('lena512.bmp');%%读bmp灰度图像q=1;%%设定量化因子OriginalImage=I;Q=q;OriginalImage=double(OriginalImage);%%图像数据类型转换ImageSub=OriginalImage-128;%%电平平移128[Row,Col]=size(OriginalImage);%%图像的大小BlockNumber=Row*Col/64;%%8*8分块数%% dct2变换:把ImageSub分成8*8像素块,分别进行dct2变换,得变换系数矩阵Coef Coef=blkproc(ImageSub,[8,8],'dct2(x)');%% 量化:用量化矩阵L量化Coef得CoefAfterQ%% JPEG建议量化矩阵L=Q*[16 11 10 16 24 40 51 6112 12 14 19 26 58 60 5514 13 16 24 40 57 69 5614 17 22 29 51 87 80 6218 22 37 56 68 109 103 7724 35 55 64 81 104 113 9249 64 78 87 103 121 120 10172 92 95 98 112 100 103 99];CoefAfterQ=blkproc(Coef,[8,8],'round(x./P1)',L);%%向靠近的整数取圆整%% 把CoefAfterQ分成8*8的块得分块矩阵CoefBlockm=0;for row=1:Row/8for col=1:Col/8m=m+1;CoefBlock(:,:,m)=CoefAfterQ(((row-1)*8+1):(row*8),((col-1)*8+1):(col*8));endendm;%% 把量化后各个分块的DC系数存放到行矩阵DC中DC(m)=0;for i=1:mDC(i)=CoefBlock(1,1,i);endDC;%% 求由各个DC系数的差值组成的行矩阵DCdifDCdif(BlockNumber)=0;DCdif(1)=DC(1);for i=2:BlockNumberDCdif(i)=DC(i)-DC(i-1);endDCdif;%% 用行矩阵DCdif中的差值替换原来系数矩阵CoefBlock中各个分块的DC系数m=0;for i=1:Row/8for j=1:Col/8m=m+1;CoefBlock(1,1,m)=DCdif(m);endendm;%% 把分块矩阵CoefBlock放到变换系数大矩阵CoefDCchanged中n=0;forrow=1:Row/8for col=1:Col/8n=n+1;CoefDCchanged(((row-1)*8+1):(row*8),((col-1)*8+1):(col*8))=CoefBlock(:,:,n);endendn;%%**************************************************************************** **********************%% 至此,完成了所有块中DC系数的替换(除第一个分块以外),为以后的DC系数差分编码做好了准备%%**************************************************************************** **********************%%*********************** the first--end blocks ************************%% 以下对每个分块进行量化,ZigZag扫描和编码(分别对DC系数和AC系数)%%**********************************************************************%% 整个图像编码后的bit序列以及bit序列的长度ImageBitSeq=[];ImageBitLen=[];%% 调试用,用来记循环的次数rowloop=0;for row=1:Row/8colloop=0;for col=1:Col/8m(1:8,1:8)=CoefDCchanged((row-1)*8+1:(row-1)*8+8,(col-1)*8+1:(col-1)*8+8);k= round(m); %% 就近取整%k;%% k为变换系数矩阵经量化并就近取整后的矩阵%% ZigZag Scaning%%*********************************************************t=zigzag(k);%t;%% t为zigzag扫描结果%% Removing Extra Zeros%%*********************************************************w=0;u=64;while u ~= 0if t(u) ~= 0w=u;break;endu=u-1;endw;%% 分块中后面的63个系数全为0的情况,因为下面的程序要对e赋初值,而矩阵的下标不能为0,所以另w=1if w==0w=1;end%% w为最后一个不为0的系数的下标(从1开始计数)e(w)=0;for i=1:we(i)=t(i);end%e;%% e为zigzag扫描结果t去掉末尾的0后得到的一维行向量%%*********************************************************%% ENCODING TO BINARY BITS%% Encoded Values Generation%%*********************************************************%%*********************************************************%% 对DC系数进行Huffman编码%e(1);[blockDCbit_seq,blockDCcode_len]=DCHuffmanEncoding(e(1));blockDCbit_seq;blockDCcode_len;%%********************** VLE code **************************%% zerolen为连0串中0的个数,amplitude为连0串后非0值的幅度,%% 对AC系数游程二维事件进行Huffman编码:%% bit_seq为对每个二维事件的编码结果,%% blockACbit_seq为所有AC系数的编码结果,%% *********************************************************eob_seq=dec2bin(10,4);%%eob=1010(块结束符EOB码)blockACbit_seq=[];blockbit_seq=[];zrl_seq=[];trt_seq=[];zerolen=0;zeronumber=0;%% 分块中只有第一个DC系数为0或不为0,AC系数全为0的情况if numel(e)==1blockACbit_seq=[];blockbit_seq=[blockDCbit_seq,eob_seq];blockbit_len=length(blockbit_seq);elsefor i=2:wif ( e(i)==0 & zeronumber<16)zeronumber=zeronumber+1;elseif (e(i)==0 & zeronumber==16);bit_seq=dec2bin(2041,11);%%zrl=1111 1111 001zeronumber=1;blockACbit_seq=[blockACbit_seq,bit_seq];elseif (e(i)~=0 & zeronumber==16)zrl_seq=dec2bin(2041,11);amplitude=e(i);trt_seq=ACHuffmanEncoding(0,amplitude);bit_seq=[zrl_seq,trt_seq];blockACbit_seq=[blockACbit_seq,bit_seq];zeronumber=0;elseif(e(i))zerolen=zeronumber;amplitude=e(i);zeronumber=0;bit_seq=ACHuffmanEncoding(zerolen,amplitude);blockACbit_seq=[blockACbit_seq,bit_seq];endendendblockbit_seq=[blockDCbit_seq,blockACbit_seq,eob_seq];blockbit_len=length(blockbit_seq);%% blockbit_seq为整个块的编码序列,blockbit_len为整个块的编码长度blockbit_seq;blockbit_len;ImageBitSeq=[ImageBitSeq,blockbit_seq];ImageBitLen=numel(ImageBitSeq);colloop=colloop+1;endrowloop=rowloop+1;end%% 整个图像编码后的bit序列ImageBitSeq以及bit序列的长度ImageBitLen ImageBitSeq;ImageBitLen;CompressionRatio=Row*Col*8/ImageBitLen;disp('DCTJPEG压缩编码比特率(bpp)')AverageBit=ImageBitLen/Row/Col%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%************************* Encoding is finished ******************************** %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%% Huffman解码程序省略%% 反量化:把矩阵CoefAfterQDecode反量化得矩阵CoefInverseQCoefInverseQ=blkproc(CoefAfterQ,[8,8],'x.*P1',L);%% 反dct2变换:把CoefInverseQ分成8*8像素块,分别进行反dct2变换重建图像ImageSubRecon,并显示ImageSubRecon=blkproc(CoefInverseQ,[8,8],'idct2(x)');ReconImage=round(ImageSubRecon)+128;%%向靠近的整数取圆整,反向电平平移128% figure,imshow(ReconImage,[]);%%title('DCTJPEG压缩重建图像');%% 求峰值信噪比PSNR:disp('DCTJPEG压缩前后图像峰值信噪比(dB)')PSNR0=PSNR(OriginalImage,ReconImage)。

MATLAB实现JPEG标准下的静态图像压缩

MATLAB实现JPEG标准下的静态图像压缩

MATLAB实现JPEG标准下的静态图像压缩1引言众所周知,原始图像数据会占用大量的存储空间,对于需要大量存储和传输图像的应用领域,需要有效的方法来存储及传输这些图像文件。

因此,对图像信息进行一定的压缩处理成为一个不可或缺的重要环节。

图像数据压缩是指在满足一定图像质量的情况下,用尽可能少的数据量来表示图像。

通常情况下,图像中含有大量的冗余信息,图像压缩的目的就是通过消除这种冗余性,减少图像的存储空间,即保留不确定的信息,去掉确定的信息,也就是用一种更接近信息本质的描述来代替原有冗余的描述。

2图像数据压缩系统2.1图像数据压缩系统的组成典型的图像数据压缩系统的组成如下:(1)变换器由于图像中大量冗余信息的存在,去除图像相关性是提高编码效率的一个很重要的步骤。

变换器是无损变换过程,变换后的图像可以无失真恢复原始图像。

(2)量化器生成一组有限个离散符号来表示压缩的图像。

量化过程是一个幅值离散的过程,它是不可逆的,也是有损耗的。

(3)编码器给量化器输出的每个符号指定一个码字,即二进制位流。

编码器可以使用定长编码或变长编码,变长编码又称为熵编码。

图像符号的编码过程和变换过程一样是无损耗的,即编码和解码过程是可逆过程。

2.2图像压缩系统评价不同的图像压缩系统,由于其应用环境与处理目标不尽相同,因此系统结构和具体算法的选择是千变万化的。

为了对图像系统的性能有一个统一和全面的评价,我们通常从恢复图像质量,压缩率,算法复杂度以及通信时延几个方面来考察一个图像处理系统的压缩效果和可实现性及实用性。

压缩比就是原始图像大小与采用某种算法压缩后的图像大小的比值。

恢复图像的高质量与高压缩比总是一对矛盾,因此这一对矛盾解决得好坏就成了评判压缩算法优劣的重要标准。

3 JPEG标准由国际标准化组织(ISO/IEC)与国际电报电话咨询委员会(CCITT)联合发起的联合图像专家组,在图像编码研究成果的基础上于20世纪90年代初制定了静止图像的编码标准,简称JPEG(Joint Photographic Expert Group)标准[1]。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
B=idct2(A,M,N)
A表示要变换的二维离散余弦变换矩阵,B表示变换 后得到的图像,B和A是同样大小的矩阵,其内容是 余弦变换后的系数。
M和N是可选参数,表示对图像矩阵A的填充或截取。 函数dctmtx用于计算二维DCT矩阵,语法格式: D=dctmtx(n)
格式:
B=idct2(A)
块,计算它们的DCT系数,并且只保留64个DCT系 数中的10个,然后对每个图像块利用这10个系数进 行逆DCT变换来重构图像。 解:程序如下:
clear
I=imread('cameraman.tif');
I=im2double(I);
T=dctmtx(8);
B=blkproc(I,[8 8],'P1*x*P2',T,T'); %这里T,T'是参数 P1、P2的取值
N 1
f
(x,
y) cos
(2x
1)u
cos
(2
y
1)v
x0 y0
2N
2N
x 0,1,L , N 1 y 0,1,L , N 1
二维离散余弦反变换公式如下:
f (x, y) N1 N1c(u)c(v)F (u, v) cos (2x 1)u cos (2 y 1)v
u0 v0
2N
2N
(1)对每个8×8或16×16块进行二维DCT反变换。
(2)将反变换的矩阵的块合成一个单一的图像。
例:把输入图像cameraman.tif划分为8×8的图像 块,计算它们的DCT系数,并且只保留64个DCT系 数中的10个,然后对每个图像块利用这10个系数进 其中D是返回的n×n的DCT变换矩阵,如果矩阵A的 大小是n×n,D×A是矩阵每一列的DCT变换值, A×D’是A的每一行的DCT变换值。
2N
x 0,1,L , N 1 y 0,1,L , N 1
二维离散余弦反变换公式如下:
基于DCT的压缩方法如下:
(1)首先将输入图像分解为8×8或16×16的块,然 后对每个块进行二维DCT变换,这里,一个N×N图 像块f(x,y)的二维离散余弦变换公式如下:Leabharlann F (u, v)N 1
c(u)c(v)
实验十 图像压缩的MATLAB实现
一、实验目的
了解有关数字图像压缩的基本概念,熟悉MATLAB 软件中关于数字图像压缩的基本方法,掌握利用 MATLAB软件进行数字图像压缩的方法。
二、相关知识
在当今的信息时代,图像在表达各种信息时有着不 可替代的作用,但图像信息的缺点之一就是数据量 非常庞大,因此,无论是存储还是传输,都需要对 图像数据进行压缩,数据压缩的方法有很多,我们 这里介绍一种基于DCT(离散余弦变换)的图像压 缩方法,并介绍用MATLAB软件来实现这个算法。
dct2(A)的结果与D×A×D’相同,但后者计算速度 较快。
(2)将变换后得到的量化的DCT系数进行编码和 传送,形成压缩后的图像格式。
基于DCT的解压缩方法如下: (1)对每个8×8或16×16块进行二维DCT反变换。 (2)将反变换的矩阵的块合成一个单一的图像。 例:把输入图像cameraman.tif划分为8×8的图像
B=idct2(A,[M,N])
B=idct2(A,M,N)
A表示要变换的二维离散余弦变换矩阵,B表示变换 后得到的图像,B和A是同样大小的矩阵,其内容是 余弦变换后的系数。
M和N是可选参数,表示对图像矩阵A的填充或截取。
函数dctmtx用于计算二维DCT矩阵,语法格式:
D=dctmtx(n)
基于DCT的压缩方法如下:
(1)首先将输入图像分解为8×8或16×16的块,然 后对每个块进行二维DCT变换,这里,一个N×N图 像块f(x,y)的二维离散余弦变换公式如下:
二、相关知识
F
(u,
v)
N 1
c(u)c(v)
N
1
f
(x,
y)
cos
(2x
1)u
cos
(2
y
1)v
x0 y0
2N
f (x, y) N1 N1c(u)c(v)F (u, v) cos (2x 1)u cos (2 y 1)v
u0 v0
2N
2N
其中: x 0,1,L , N 1 y 0,1,L , N 1
1
c(u)
N 2
N
u0 u 1, 2,L N
1
c(v)
N 2
N
v0 v 1, 2,L N 1
在MATLAB中,c(u)c(v)F(u, v) cos (2x 1)u cos (2 y 1)v
2N
2N
称为DCT的变换核
MATLAB图像处理工具箱提供了一些函数进行DCT变 换。
函数dct2实现图像的二维离散余弦变换,格式为: B=dct2(A) B=dct2(A,[M,N]) B=dct2(A,M,N)
B=dct2(A,M,N)
A表示要变换的图像,B表示变换后得到的变换系数 矩阵,B和A是同样大小的矩阵,其内容是余弦变换 后的系数。
M和N是可选参数,表示对图像矩阵A的填充或截取。 函数idct2实现图像的二维离散余弦反变换,语法
格式:
B=idct2(A)
B=idct2(A,[M,N])
其中D是返回的n×n的DCT变换矩阵,如果矩阵A的 大小是n×n,D×A是矩阵每一列的DCT变换值, A×D’是A的每一行的DCT变换值。
dct2(A)的结果与D×A×D’相同,但后者计算速度 较快。
(2)将变换后得到的量化的DCT系数进行编码和 传送,形成压缩后的图像格式。
基于DCT的解压缩方法如下:
x 0,1,L , N 1 y 0,1,L , N 1
其中:
1
c(u)
N 2
N
u0 u 1, 2,L N
1
c(v)
N 2
N
v0 v 1, 2,L N 1
在MATLAB中,c(u)c(v)F(u,v) cos (2x 1)u cos (2y 1)v
2N
2N
称为DCT的变换核
A表示要变换的图像,B表示变换后得到的变换系数 矩阵,B和A是同样大小的矩阵,其内容是余弦变换 后的系数。
M和N是可选参数,表示对图像矩阵A的填充或截取。 函数idct2实现图像的二维离散余弦反变换,语法
变换。
函数dct2实现图像的二维离散余弦变换,格式为:
B=dct2(A)
B=dct2(A,[M,N])
相关文档
最新文档