clc; clear all; close all;
I = imread('rice.png'); % 讀取圖片
I = im2double(I) ;%圖片存儲類型轉換
T = dctmtx(8);%離散余弦變換矩陣
B = blkproc(I,[8 8],'P1*x*P2',T,T');%對源圖像進行DCT變換
mask = [1 1 1 0 0 0 0 0
1 1 1 0 0 0 0 0
1 1 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];
B2 = blkproc(B,[8 8],'P1.*x',mask);%數據壓縮,丟棄右下角高頻數據
I2 = blkproc(B2,[8 8],'P1*x*P2',T',T);%進行反DCT變換
figure;
subplot(1, 2, 1); imshow(I, []);
subplot(1, 2, 2); imshow(I2, []);
imwrite(I, 'c:\\c1.png');
imwrite(I2, 'c:\\c2.png');
f1 = imfinfo('c:\\c1.png');
f2 = imfinfo('c:\\c2.png');
r = f2.FileSize/f1.FileSize
r =
0.7855
>>
個人覺得壓縮比並非文件大小之比,因為文件中不可避免要存儲各種信息(文件頭、信息鬥等),直接用文件大小來進行計算的話圖像以外的數據也計算進去了,計算結果很可能跟存儲格式有關。
DCT變換後圖像數據的壓縮比應該是zig-zag掃描保留的點數/(8*8),比如您的例子,就是9/64。