數字圖像處理|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

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