matlab实现jpeg (ycbc4:2:0采样压缩 + 量化表ycbc量化压缩)和(ycbc4:4:4采样 + 量化表ycbc量化压缩)

如果对ycbcr采样不太了解的同学,warp gate:https://blog.csdn.net/xueyushenzhou/article/details/40817949

简单的说,4:2:0就是第一行为y:cb=4:2,没有cr分量,那么第二行就是y:cr=4:2,没有cb分量。以后每一行一直这样循环。

%ycbc4:2:0采样压缩 + 量化表ycbc量化压缩
 
clear all;
f=imread('lena.tif');
img_ycbcr=rgb2ycbcr(f)
[row,col,~]=size(img_ycbcr);
 
%对Y,Cb,Cr分量进行4:2:0采样
Y(:,:,1)=img_ycbcr(:,:,1);  %Y分量
for i=1:2:row-1
    for j=1:2:col-1 
        Cb((i+1)/2,(j+1)/2)=double(img_ycbcr(i,j,2)); 
    end
end
 
for i=2:2:row
    for j=1:2:col-1 
        Cr(i/2,(j+1)/2)=double(img_ycbcr(i,j,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 ];%色差量化表
 
 
%对三个通道分别DCT和量化
Y_dct_q=Dct_Quantize(Y,Y_Table);
Cb_dct_q=Dct_Quantize(Cb,CbCr_Table);
Cr_dct_q=Dct_Quantize(Cr,CbCr_Table);
 
%对三个通道分别反量化和反DCT
Y_in_q_dct=Inverse_Quantize_Dct(Y_dct_q,Y_Table);
Cb_in_q_dct=Inverse_Quantize_Dct(Cb_dct_q,CbCr_Table);
Cr_in_q_dct=Inverse_Quantize_Dct(Cr_dct_q,CbCr_Table);
 
%恢复出YCBCR图像
YCbCr_in(:,:,1)=Y_in_q_dct;
for i=1:row/2
    for j=1:col/2
        YCbCr_in(2*i-1,2*j-1,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-1,2*j,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,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,3)=Cr_in_q_dct(i,j); 
    end
end
image=ycbcr2rgb(YCbCr_in);
MAX=255;
MES=sum(sum((f-image).^2))/(row*col);     %均方差
PSNR=20*log10(MAX/sqrt(MES));             %峰值信噪比
subplot(121),imshow(f);title('原图');
subplot(122),imshow(image);title({'重构后图片';'rgb三通道PSNR为';num2str(PSNR)});
 
 
%ycbc4:4:4采样 + 量化表ycbc量化压缩

clear all;
f=imread('lena.tif');
img_ycbcr=rgb2ycbcr(f)
[row,col,~]=size(img_ycbcr); 


Y=img_ycbcr(:,:,1);               %Y分量
Cb=img_ycbcr(:,:,2);
Cr=img_ycbcr(:,:,3);
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];%色差量化表

%对三个通道分别DCT和量化
Y_dct_q=Dct_Quantize(Y,Y_Table);
Cb_dct_q=Dct_Quantize(Cb,CbCr_Table);
Cr_dct_q=Dct_Quantize(Cr,CbCr_Table); 

%对三个通道分别反量化和反DCT
Y_in_q_dct=Inverse_Quantize_Dct(Y_dct_q,Y_Table);
Cb_in_q_dct=Inverse_Quantize_Dct(Cb_dct_q,CbCr_Table);
Cr_in_q_dct=Inverse_Quantize_Dct(Cr_dct_q,CbCr_Table);

%恢复出YCBCR图像
YCbCr_in(:,:,1)=Y_in_q_dct;
YCbCr_in(:,:,2)=Cb_in_q_dct;
YCbCr_in(:,:,3)=Cr_in_q_dct;

I=ycbcr2rgb(YCbCr_in);
MAX=255;
MES=sum(sum((I-f).^2))/(row*col);     %均方差
PSNR=20*log10(MAX/sqrt(MES));             %峰值信噪比
subplot(121),imshow(f);title('原图');
subplot(122),imshow(I);title({'重构后图片';'rgb三通道PSNR为';num2str(PSNR)});
 

DCT和IDCT函数

function [Matrix]=Dct_Quantize(I,Qua_Table)

I=double(I)-128;   %层次移动128个灰度级
I=blkproc(I,[8 8],'dct2(x)');      %x就是每一个分成的8*8大小的块
Qua_Matrix=Qua_Table;              %量化矩阵
I=blkproc(I,[8 8],'fix(x./P1)',Qua_Matrix);  %量化,四舍五入
Matrix=I;          %得到量化后的矩阵


function [ Matrix ] = Inverse_Quantize_Dct(I,Qua_Table)
Qua_Matrix=Qua_Table;     %反量化矩阵
I=blkproc(I,[8 8],'x.*P1',Qua_Matrix);%反量化,四舍五入
I=blkproc(I,[8 8],'idct2(x)');  
I=uint8(I+128);
I(I>255)=255;
I(I<0)=0;
Matrix=I;       %反量化和反Dct后的矩阵

结果:

                 

猜你喜欢

转载自blog.csdn.net/qq_35752161/article/details/83315933