实验三(信息隐藏技术)

文章详细介绍了如何使用MATLAB进行DCT变换,包括图像的DCT变换、反变换、分块处理以及量化压缩的过程。同时,讨论了在彩色图像上的应用,通过转换到YCbCr模型并分别对各通道进行DCT压缩,展示了压缩前后的效果和差异。
摘要由CSDN通过智能技术生成

一、 使用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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值