一、 使用matlab函数dct2()完成图像的DCT变换
1、读入一幅图像(灰度图像或索引图像,如果是彩色图,则进行适当转换)
2、对该图像进行DCT变换,显示变换结果
3、对变换进行反变换,显示反变换结果。
4、对原图进行分块变换,显示分块结果。
5、对分块变换进行反变换,显示反变换结果。
X=imread('D:\1751\picture\man.bmp');
X=double(X);
[a,b]=size(X);
Y=blkproc(X,[8 8],'dct2');
X1=blkproc(Y,[8 8],'idct2');
figure
subplot(1,3,1);
imshow(uint8(X));
title('原图');
subplot(1,3,2);
imshow(uint8(Y));
title('分块结果');
subplot(1,3,3);
imshow(uint8(X1));
title('分块逆变换后');
Y1=dct2(X);
X10=idct2(Y1);
figure
subplot(1,3,1);
imshow(uint8(X));
title('原图');
subplot(1,3,2);
imshow(uint8(Y1));
title('DCT变换图');
subplot(1,3,3);
imshow(uint8(X10));
title('DCT复原图');
二、DCT压缩变换
1、读入一幅图像(灰度图像或索引图像,如果是彩色图,则进行适当转换)
2、对该图像进行DCT分块,显示分块结果。
3、量化,利用上一步分块结果,对每个分块进行量化,只保留左上角前10个元素值。
4、对量化结果进行反变换,显示反变换结果(即压缩后的图像)。
5、压缩前后差异。
I=imread('d:\1751\picture\man.bmp');
imshow(I);
title('压缩前');
figure(1),
A=im2double(I);
L=size(A,1);
D = dctmtx(size(A,1));
dct=D*A*D'; %整个图像的DCT变换
figure(2), imshow(dct);
title('DCT频谱');
K = dctmtx(8);
B=blkproc(A,[8 8],'P1*x*P2',K,K'); %分块,DCT变换
figure(3),imshow(B)
title('分块结果')
Mask=[1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];
B2=blkproc(B,[8 8],'P1.*x',Mask); %取左上角的10个系统压缩
I2=blkproc(B2,[8 8],'P1*x*P2',K',K); %反变换
figure(3),imshow(I2);
title('压缩后');
三、彩色图像DCT压缩
1、读取一幅彩色图像
2、将彩色图像从RGB模型转换到YCbCr模型
3、对各通道做DCT,Cb,Cr各去掉70%的系数,Y去掉20%的系数.
(也可对比,Cb,Cr各去掉99%的系数,Y去掉99%的系数)
4、合并通道分量,获得YCBCR图像。
5、将YCBCR图像转化为RGB图像,显示该图像(压缩后的图像)。
I=imread('D:\1751\picture\house.png');
figure;
subplot(1,3,1);%一个窗口,分三个位置,显示在第一个位置
imshow(I);%显示
title('压缩前');
A=im2double(I);
L=size(A,1);
D = dctmtx(size(A,1));
dct=D*A*D'; %整个图像的DCT变换
%subplot(1,3,2);
%imshow(dct);
%title('DCT频谱');
K = dctmtx(8);
B=blkproc(A,[8 8],'P1*x*P2',K,K'); %分块,DCT变换
subplot(1,3,2);
imshow(B);
title('DCT分块');
Mask=[1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];
B2=blkproc(B,[8 8],'P1.*x',Mask); %取左上角的10个系统压缩
I2=blkproc(B2,[8 8],'P1*x*P2',K',K); %反变换
subplot(1,3,3);
imshow(I2);
title('压缩后');
A=imread('D:\1751\第三讲--DCT变换与应用\pic\lenna.bmp');
%显示原图像并取出RGB分量
subplot(121);
imshow(A,[]);
R=A(:,:,1);
G=A(:,:,2);
B=A(:,:,3);
%将RGB转换为YCBCR
YCBCR=rgb2ycbcr(A);
Y=YCBCR(:,:,1);
CB=YCBCR(:,:,2);
CR=YCBCR(:,:,3);
%对Y CB CR作离散余弦变换
Y_D=dct2(Y);
CB_D=dct2(CB);
CR_D=dct2(CR);
%对Y分量进行量化
ny=0.2;
[M,N]=size(Y);
Y_array=reshape(abs(Y_D),[1,M*N]);
Y_array=sort(Y_array); %构造幅值从小到大的向量
value_Y=Y_array(round(M*N*ny)); %对阈值进行索引
Y_D1=Y_D;
for i=1:M
for j=1:N
if abs(Y_D1(i,j))<value_Y %小于阈值的都归零
Y_D1(i,j)=0;
end
end
end
Y1=idct2(Y_D1);
%对CB分量进行量化
ncb=0.7;
[M,N]=size(CB_D);
CB_array=reshape(abs(CB_D),[1,M*N]);
CB_array=sort(CB_array);
value_CB=CB_array(round(M*N*ncb));
CB_D1=CB_D;
for i=1:M
for j=1:N
if abs(CB_D1(i,j))<value_CB
CB_D1(i,j)=0;
end
end
end
CB1=idct2(CB_D1);
%对CR分量进行量化
ncr=0.7;
[M,N]=size(CR_D);
CR_array=reshape(abs(CR_D),[1,M*N]);
CR_array=sort(CR_array);
value_CR=CR_array(round(M*N*ncr));
CR_D1=CR_D;
for i=1:M
for j=1:N
if abs(CR_D1(i,j))<value_CR
CR_D1(i,j)=0;
end
end
end
CR1=idct2(CR_D1);
%YCBCR1=cat(3,Y1,CB1,CR1);
YCBCR1(:,:,1)=(Y1);
YCBCR1(:,:,2)=(CB1);
YCBCR1(:,:,3)=(CR1);
YCBCR1=uint8(YCBCR1);
RGB=ycbcr2rgb(YCBCR1);
R1=RGB(:,:,1);
G1=RGB(:,:,2);
B1=RGB(:,:,3);
error_R=sqrt(sum(sum((R-R1).^2))/(M*N));
error_G=sqrt(sum(sum((G-G1).^2))/(M*N));
error_B=sqrt(sum(sum((B-B1).^2))/(M*N));
x_error=['R' num2str(error_R) ' G' num2str(error_G) ' B' num2str(error_B)];
subplot(122);
imshow(RGB,[]);title('process Y:0.2 CB:0.7 CR:0.7');xlabel(x_error);