Input: an intra-frame or a residue picture after motion compensation.ide
Task: Code the input picture into a bitstream and decode the picture from the generated bitstream.函數
Specifications: Implement a transform-based codec, consisting transform, quantization, and entropy coding. The block size can be 8x8, 16x16, or other reasonable sizes. As in most existing image/video codecs, you can use 2D DCT. A simple uniform quantizer could be used for verification purpose. For the entropy coding, you can use either Huffman coding or arithmetic coding ui
運行main函數,注意main函數用到了下面的Normalize函數
指定待處理的圖片,依次對圖片進行一下變換:
1、灰度化
2、8 * 8 DCT變換(這一步r)若是加上一個掩模能夠去除圖片中人眼不敏感的高頻份量,從而進一步壓縮圖片
3、量化處理(採用JPEG亮度量化表,將DCT舉證除以量化碼錶),因爲量化後有取整操做,所以是有損壓縮圖片
4、Huffman編碼,編碼獲得的比特流序列比原序列更加短小,進一步提升傳輸效率
5、發送方比特流序列傳輸(將上一步獲得的比特流進行傳輸)
%中間對比了直接傳輸圖片的比特流長度和通過壓縮變換獲得的比特流長度
6、接收方接收比特流序列
7、解碼,是Huffman編碼的逆過程,獲得量化後的序列
8、反量化處理,是第三步的逆過程,將量化後的矩陣乘以量化碼錶
9、反DCT變換獲得圖片編碼
main函數:spa
1 clc;clear; 2 3 %採用JPEG亮度量化表 4 Q =[16 11 10 16 24 40 51 61 5 12 12 14 19 26 58 60 55 6 14 13 16 24 40 57 69 56 7 14 17 22 29 51 87 80 62 8 18 22 37 56 68 109 103 77 9 24 35 55 64 81 104 113 92 10 49 64 78 87 103 121 120 101 11 72 92 95 98 112 100 103 99]; 12 13 X = 8;%分塊大小 14 15 I=imread('cameraman.jpg');%讀取圖像 16 gray_img = rgb2gray(I);%灰度化 17 18 19 I_DCT = blkproc(gray_img,[X X],'dct2');%對圖像進行DCT變換, 20 21 Iq = round(blkproc(I_DCT,[X X],'x./P1',Q));%量化處理 22 23 Iq = Iq + 120;%量化處理以後,序列的symbol取-120到+120之間,爲了方便編碼,將其平移到0-255的區間 24 25 %哈夫曼編碼 26 [M,N] = size(Iq); 27 I1 = Iq(:); 28 P = zeros(1,256); 29 for i = 0:255 30 P(i+1) = length(find(I1 == i))/(M*N); 31 end 32 k = 0:255; 33 dict = huffmandict(k,P); %生成字典 34 enco = huffmanenco(I1,dict); %編碼 35 %bitstream傳輸 36 37 %計算編碼長度,計算壓縮率 38 binaryComp = de2bi(enco); 39 encodedLen = numel(binaryComp); 40 imgLen = numel(de2bi(I1)); 41 disp(strcat(['編碼後傳輸的比特流長度爲' num2str(encodedLen)])) 42 disp(strcat(['原圖片二進制編碼比特長度爲' num2str(imgLen)])) 43 disp(strcat(['壓縮率爲' num2str(100*(imgLen-encodedLen)/imgLen) '%'])) 44 45 %bitstream接收 46 %哈夫曼解碼 47 deco = huffmandeco(enco,dict); 48 Idq = col2im(deco,[M,N],[M,N],'distinct')-120; %把向量從新轉換成圖像塊,記得要把圖像平移回去原來的區間; 49 50 51 I_rq = round(blkproc(Idq,[X X],'x.*P1',Q));%反量化 52 53 I_rDCT = round(blkproc(I_rq,[X X],'idct2'));%對圖像進行DCT反變換 54 55 I_rDCT = Normalize(I_rDCT);%歸一化到0-255區間 56 57 58 59 figure 60 subplot(1,2,1) 61 imshow(gray_img); 62 title('原圖') 63 64 65 subplot(1,2,2) 66 %在matlab處理完數據好,咱們但願顯示或者imwrite寫入圖片時候,須要注意。若是直接對double之間的數據矩陣I運行imshow(I), 67 %咱們會發現有時候顯示的是一個白色的圖像。 這是由於imshow()顯示圖像時對double型是認爲在0~1範圍內,即大於1時都是顯示爲白色, 68 %而imshow顯示uint8型時是0~255範圍。因此對double類型的圖像顯示的時候,要麼歸一化到0~1之間, 69 %要麼將double類型的0~255數據轉爲uint8類型 70 imshow(I_rDCT/255); 71 title('經壓縮傳輸後解壓的圖像') 72 73 74
Normalize函數:code
1 function OutImg = Normalize(InImg) 2 ymax=255;ymin=0; 3 xmax = max(max(InImg)); %求得InImg中的最大值 4 xmin = min(min(InImg)); %求得InImg中的最小值 5 OutImg = round((ymax-ymin)*(InImg-xmin)/(xmax-xmin) + ymin); %歸一化並取整 6 end