数字图像处理|Matlab-灰度和彩色图像的离散余弦变换-通过离散余弦逆变换,还原出图像

Matlab-灰度和彩色图像的离散余弦变换

代码链接:https://download.csdn.net/download/qq_43571150/12033265

问题1:对输入的灰度和彩色图像进行分块,每一块图像为8*8像素的大小。对分块图像进行离散余弦变换,输出频谱图(DCT系数);
问题2:尝试改变部分的DCT系数;
问题3:通过离散余弦逆变换,还原出图像,观察与原图像之间的区别。

图像结果👇
在这里插入图片描述

Matlab代码👇

I1=imread('05.jpg');
I2=rgb2gray(I1);
 mask0=[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
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0
        0 0 0 0 0 0 0 0];

 mask9=[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];

mask35=[1 1 1 1 1 1 1 1
        1 1 1 1 1 1 1 0
        1 1 1 1 1 1 0 0
        1 1 1 1 1 0 0 0
        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];

mask53=[1 1 1 1 1 1 1 1
        1 1 1 1 1 1 1 1
        1 1 1 1 1 1 1 1
        1 1 1 1 1 1 1 1
        1 1 1 1 1 1 1 0
        1 1 1 1 1 1 0 0
        1 1 1 1 1 0 0 0
        1 1 1 1 0 0 0 0];

    
I0=DCTRGB(I1,mask0);
I9=DCTRGB(I1,mask9);
I35=DCTRGB(I1,mask35);
I53=DCTRGB(I1,mask53);
g0=DCTgary(I2,mask0);
g9=DCTgary(I2,mask9); 
g35=DCTgary(I2,mask35); 
g53=DCTgary(I2,mask53);

subplot(2,5,1);imshow(I1);title('彩色图像')
subplot(2,5,2);imshow(I0);title('彩色图像DCT系数进行遮罩 0')
subplot(2,5,3);imshow(I9);title('彩色图像DCT系数进行遮罩 9')
subplot(2,5,4);imshow(I35);title('彩色图像DCT系数进行遮罩 35')
subplot(2,5,5);imshow(I53);title('彩色图像DCT系数进行遮罩 53')

subplot(2,5,6);imshow(I2);title('灰度图像')
subplot(2,5,7);imshow(g0);title('灰度图像DCT系数进行遮罩 0')
subplot(2,5,8);imshow(g9);title('灰度图像DCT系数进行遮罩 9')
subplot(2,5,9);imshow(g35);title('灰度图像DCT系数进行遮罩 35')
subplot(2,5,10);imshow(g53);title('灰度图像DCT系数进行遮罩 53')

imwrite(I0,'05 彩色图像DCT系数进行遮罩 0.jpg');
imwrite(I9,'05 彩色图像DCT系数进行遮罩 9.jpg');
imwrite(I35,'05 彩色图像DCT系数进行遮罩 35.jpg');
imwrite(I53,'05 彩色图像DCT系数进行遮罩 53.jpg');

imwrite(g0,'05 灰度图像DCT系数进行遮罩 0.jpg');
imwrite(g9,'05 灰度图像DCT系数进行遮罩 9.jpg');
imwrite(g35,'05 灰度图像DCT系数进行遮罩 35.jpg');
imwrite(g53,'05 灰度图像DCT系数进行遮罩 53.jpg');

function RGB_rec = DCTRGB( RGB,mask )
%进行彩色图像的DCT变换
%返回重构的图像

%亮度量化表
m=0.5*[ 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];
%RGB图分层处理 得到3个分量图
R = RGB(:,:,1);
G = RGB(:,:,2);
B = RGB(:,:,3);
%转换为双精度
IR = double(R);
IG = double(G);
IB = double(B);
%建立8*8的DCT变换矩阵
T=dctmtx(8);
%进行DCT变换
RR = blkproc(IR,[8,8],'P1*x*P2',T,T');
GG = blkproc(IG,[8,8],'P1*x*P2',T,T');
BB = blkproc(IB,[8,8],'P1*x*P2',T,T');

%量化
LR = blkproc(RR,[8 8], 'round(x./P1)',m);
LG = blkproc(GG,[8 8], 'round(x./P1)',m);
LB = blkproc(BB,[8 8], 'round(x./P1)',m);

%对DCT系数进行遮罩处理
mR=blkproc(LR,[8 8],'x.*P1.*P2',mask,m);
mG=blkproc(LG,[8 8],'x.*P1.*P2',mask,m);
mB=blkproc(LB,[8 8],'x.*P1.*P2',mask,m);

%反DCT变化 IDCT
YR =blkproc(mR,[8 8],'P1*x*P2',T',T);
YG =blkproc(mG,[8 8],'P1*x*P2',T',T);
YB =blkproc(mB,[8 8],'P1*x*P2',T',T);

%转换为uint8
YR = uint8(YR);
YG = uint8(YG);
YB = uint8(YB);

%重构图像
RGB_rec =cat(3,YR,YG,YB);

end


function gary_rec = DCTgary(gary,mask )  
%进行灰度图像的DCT变换
%返回重构的图像

%亮度量化表
m=0.5*[ 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];

%转换为双精度
I = double(gary);
%建立8*8的DCT变换矩阵
T=dctmtx(8);
%进行DCT变换
RR = blkproc(I,[8,8],'P1*x*P2',T,T');

%量化
LR = blkproc(RR,[8 8], 'round(x./P1)',m);

%对DCT系数进行遮罩处理
mR=blkproc(LR,[8 8],'x.*P1.*P2',mask,m);

%反DCT变化 IDCT
YR =blkproc(mR,[8 8],'P1*x*P2',T',T);

%转换为uint8
YR = uint8(YR);

%重构图像
gary_rec = YR;

end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章