如果对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后的矩阵
结果: