問題一:隨機選取一幅影像x.jpg,先將影像分解為8x8個資料塊,然后分別對分解后的每個資料小方塊進行DCT及IDCT變換,分別保留左上角3、10、15、32個系數進行處理,并對結果進行對比分析,
clear
close all
clc%清理Matlab視窗
A=imread('D:\x.jpg');%讀取影像x.jpg(引號內是影像在計算機內的存盤路徑)
I=rgb2gray(A);%RGB影像轉灰度影像
I=im2double(I);
T=dctmtx(8);%得到一個8*8的離散余弦變化矩陣
B=blkproc(I,[8 8],'P1*x*P2',T,T');
%x是每一個分成的8*8大小的塊
%P1*x*P2相當于像素塊的處理函式
%p1=T,p2=T’,fun=p1*x*p2'=T*x*T'是進行離散余弦變換
%%
m=[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
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];%保留左上角3個系數
B2=blkproc(B,[8 8],'P1.*x',m);%舍棄每個塊中的高頻系數,達到影像壓縮的目的
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);%進行反余弦變換,得到壓縮后的圖象
miss=abs(I-I2);
figure(1);
imshow(I),title('原始影像','Fontsize',18);
figure(2);
subplot(2,2,1);
imshow(I2),title('壓縮(解壓縮)影像(3個系數)','Fontsize',18);
%%
m3=[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];%保留左上角10個系數
B3=blkproc(B,[8 8],'P1.*x',m3);%舍棄每個塊中的高頻系數,達到影像壓縮的目的
I3=blkproc(B3,[8 8],'P1*x*P2',T',T);%進行反余弦變換,得到壓縮后的圖象
miss3=abs(I-I3);
subplot(2,2,2);
imshow(I3),title('壓縮(解壓縮)影像(10個系數)','Fontsize',18);
%%
m4=[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
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];%保留左上角15個系數
B4=blkproc(B,[8 8],'P1.*x',m4);%舍棄每個塊中的高頻系數,達到影像壓縮的目的
I4=blkproc(B4,[8 8],'P1*x*P2',T',T);%進行反余弦變換,得到壓縮后的圖象
miss4=abs(I-I4);
subplot(2,2,3);
imshow(I4),title('壓縮(解壓縮)影像(15個系數)','Fontsize',18);
%%
m5=[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 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];%保留左上角32個系數
B5=blkproc(B,[8 8],'P1.*x',m5);%舍棄每個塊中的高頻系數,達到影像壓縮的目的
I5=blkproc(B5,[8 8],'P1*x*P2',T',T);%進行反余弦變換,得到壓縮后的圖象
miss5=abs(I-I5);
subplot(2,2,4);
imshow(I5),title('壓縮(解壓縮)影像(32個系數)','Fontsize',18);
編程結果如下,根據編程結果對比,可以明顯看出,分別保留左上角32、15、10、3個系數進行處理時,影像恢復效果依次變差,
其中,保留左上角3個系數時恢復影像中,出現了明顯的影像模糊現象和“塊效應”現象,

問題二:隨機選取一幅影像x.jpg,先將影像分解為16x16個資料塊,然后分別對分解后的每個資料小方塊進行DCT及IDCT變換,分別保留左上角3、10個系數進行處理,并對結果與將影像分解為16*16個資料塊時的結果進行對比分析,
clear
close all
clc%清理Matlab視窗
A=imread('D:\x.jpg');%讀取影像x.jpg(引號內是影像在計算機內的存盤路徑)
I=rgb2gray(A);%RGB影像轉灰度影像
I=im2double(I);
T=dctmtx(16);%得到一個16*16的離散余弦變化矩陣
B=blkproc(I,[16 16],'P1*x*P2',T,T');
%x是每一個分成的16*16大小的塊
%P1*x*P2相當于像素塊的處理函式
%p1=T,p2=T’,fun=p1*x*p2'=T*x*T',是進行離散余弦變換
%%
m=[1 1 0 0 0 0 0 0 0 0 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 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 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 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 0 0 0 0 0 0 0 0 0 0 0];
B2=blkproc(B,[16 16],'P1.*x',m);%舍棄每個塊中的高頻系數,達到影像壓縮的目的
I2=blkproc(B2,[16 16],'P1*x*P2',T',T);%進行反余弦變換,得到壓縮后的圖象
figure(1);
imshow(I),title('原始影像','Fontsize',18);
figure(2);
subplot(2,2,1);
imshow(I2),title('16*16解壓縮影像(3個系數)','Fontsize',18);
%%
m3=[1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 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 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 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 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];%保留左上角10個系數
B3=blkproc(B,[16 16],'P1.*x',m3);%舍棄每個塊中的高頻系數,達到影像壓縮的目的
I3=blkproc(B3,[16 16],'P1*x*P2',T',T);%進行反余弦變換,得到壓縮后的圖象
subplot(2,2,2);
imshow(I3),title('16*16解壓縮影像(10個系數)','Fontsize',18);
%%
TT=dctmtx(8);%得到一個8*8的離散余弦變化矩陣
BB=blkproc(I,[8 8],'P1*x*P2',TT,TT');
m4=[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
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0];%保留左上角3個系數
BB2=blkproc(BB,[8 8],'P1.*x',m4);%舍棄每個塊中的高頻系數,達到影像壓縮的目的
II2=blkproc(BB2,[8 8],'P1*x*P2',TT',TT);%進行反余弦變換,得到壓縮后的圖象
figure(2);
subplot(2,2,3);
imshow(II2),title('8*8解壓縮影像(3個系數)','Fontsize',18);
%%
m5=[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];%保留左上角10個系數
BB3=blkproc(BB,[8 8],'P1.*x',m5);%舍棄每個塊中的高頻系數,達到影像壓縮的目的
II3=blkproc(BB3,[8 8],'P1*x*P2',TT',TT);%進行反余弦變換,得到壓縮后的圖象
subplot(2,2,4);
imshow(II3),title('8*8解壓縮影像(10個系數)','Fontsize',18);
編程結果如下,根據編程結果對比,可以明顯看出,將影像分解為8x8個資料塊后恢復影像的效果優于將影像分解為16x16個資料塊恢復影像的效果,

問題三:對彩色影像進行分塊壓縮處理,
close all
clc%清理Matlab視窗
RGB=imread('D:\x.jpg');%讀取影像x.jpg(引號內是影像在計算機內的存盤路徑)
gary=rgb2gray(RGB);%RGB影像轉灰度影像
%亮度量化表
m=[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];
%RGB圖分層處理得到3個分量圖
R = RGB(:,:,1);
G = RGB(:,:,2);
B = RGB(:,:,3);
%轉換為雙精度
IR =im2double(R);
IG =im2double(G);
IB =im2double(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');
RR2=blkproc(RR,[8 8],'P1.*x',m);%舍棄每個塊中的高頻系數,達到影像壓縮的目的
RRR=blkproc(RR2,[8 8],'P1*x*P2',T',T);%進行反余弦變換,得到壓縮后的圖象
GG2=blkproc(GG,[8 8],'P1.*x',m);%舍棄每個塊中的高頻系數,達到影像壓縮的目的
GGG=blkproc(GG2,[8 8],'P1*x*P2',T',T);%進行反余弦變換,得到壓縮后的圖象
BB2=blkproc(BB,[8 8],'P1.*x',m);%舍棄每個塊中的高頻系數,達到影像壓縮的目的
BBB=blkproc(BB2,[8 8],'P1*x*P2',T',T);%進行反余弦變換,得到壓縮后的圖象
D2=cat(3,RRR,GGG,BBB);
subplot(2,2,1);imshow(RRR);title('壓縮后R分量影像')
subplot(2,2,2);imshow(GGG);title('壓縮后G分量影像')
subplot(2,2,3);imshow(BBB);title('壓縮后B分量影像')
subplot(2,2,4);imshow(D2);title('壓縮后的恢復圖')
編程結果圖如下,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/248525.html
標籤:其他
