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