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

328 阅读3分钟

1 简介

介绍了JPEG图像压缩算法,并在MATLAB数学分析工具环境下从实验角度出发,较为直观地探讨了DCT在JPEG图像压缩中的应用.仿真实验表明,用MATLAB来实现离散余弦变换的图像压缩,具有方法简单,速度快,误差小的优点,大大提高了图像压缩的效率和精度.

img

2 部分代码

clc
clear all
close all

img=imread('sweden_input.jpg');
subplot(121);imshow(img);title('原图');         %显示原图


img_ycbcr = rgb2ycbcr(img);             % rgb->yuv
[row,col,~]=size(img_ycbcr);       % 取出行列数,~表示3个通道算1列


%对图像进行扩展
row_expand=ceil(row/16)*16;       %行数上取整再乘16,及扩展成16的倍数
if mod(row,16)~=0           %行数不是16的倍数,用最后一行进行扩展
  for i=row:row_expand
      img_ycbcr(i,:,:)=img_ycbcr(row,:,:);
  end
end
col_expand=ceil(col/16)*16; %列数上取整
if mod(col,16)~=0         %列数不是16的倍数,用最后一列进行扩展
  for j=col:col_expand
      img_ycbcr(:,j,:)=img_ycbcr(:,col,:);
  end
end


%对Y,Cb,Cr分量进行4:2:0采样
Y=img_ycbcr(:,:,1);                   %Y分量
Cb=zeros(row_expand/2,col_expand/2);      
Cr=zeros(row_expand/2,col_expand/2);       %Cr分量
for i=1:row_expand/2
  for j=1:2:col_expand/2-1         %奇数列
      Cb(i,j)=double(img_ycbcr(i*2-1,j*2-1,2));     
      Cr(i,j)=double(img_ycbcr(i*2-1,j*2+1,3));     
  end
end
for i=1:row_expand/2
  for j=2:2:col_expand/2           %偶数列
      Cb(i,j)=double(img_ycbcr(i*2-1,j*2-2,2));     
      Cr(i,j)=double(img_ycbcr(i*2-1,j*2,3));     
  end
end



%分别对三种颜色分量进行编码
Y_Table=[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];%亮度量化表
CbCr_Table=[17, 18, 24, 47, 99, 99, 99, 99;  18, 21, 26, 66, 99, 99, 99, 99;  24, 26, 56, 99, 99, 99, 99, 99;  47, 66, 99 ,99, 99, 99, 99, 99;  99, 99, 99, 99, 99, 99, 99, 99;  99, 99, 99, 99, 99, 99, 99, 99;  99, 99, 99, 99, 99, 99, 99, 99;  99, 99, 99, 99, 99, 99, 99, 99];%色差量化表

Qua_Factor=0.5;%量化因子,最小为0.01,最大为255,建议在0.53之间,越小质量越
YCbCr_in(:,:,1)=Y_in_q_dct;
for i=1:row_expand/2
  for j=1:col_expand/2
      YCbCr_in(2*i-1,2*j-1,2)=Cb_in_q_dct(i,j);
      YCbCr_in(2*i-1,2*j,2)=Cb_in_q_dct(i,j);
      YCbCr_in(2*i,2*j-1,2)=Cb_in_q_dct(i,j);
      YCbCr_in(2*i,2*j,2)=Cb_in_q_dct(i,j);
     
      YCbCr_in(2*i-1,2*j-1,3)=Cr_in_q_dct(i,j);
      YCbCr_in(2*i-1,2*j,3)=Cr_in_q_dct(i,j);
      YCbCr_in(2*i,2*j-1,3)=Cr_in_q_dct(i,j);
      YCbCr_in(2*i,2*j,3)=Cr_in_q_dct(i,j);
  end
end

I_in=ycbcr2rgb(YCbCr_in);
I_in(row+1:row_expand,:,:)=[];%去掉扩展的行
I_in(:,col+1:col_expand,:)=[];%去掉扩展的列

subplot(122);imshow(I_in);title('重构后的图片');

3 仿真结果

4 参考文献

[1]李秀敏, 万里青, and 周拥军. "基于MATLAB的DCT变换在JPEG图像压缩中的应用." 电光与控制 12.2(2005):4.

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

5 MATLAB代码与数据下载地址

见博客主页