?? main.m
字號:
function main
%本程序分為6個步驟,完成一個256*256的灰度圖像的讀入,dct變換,快速dct變換
% JPEG矩陣量化,DCT逆變換,zigzag掃描后經游程編碼輸出文本文件。
%% 1:讀取圖像 Img為圖像值
Img = imread('LENA256.bmp'); %讀入圖像,256*256的灰度圖像
subplot(2,3,1); %畫出源圖像
imshow(Img);
title('原圖像');
%% 2:做原始DCT變換
Img = double(Img) - 128; %由unit8格式轉換double類型,因為用unit8格式做DCT轉換會產生溢出
fun = @dct2D; %把原始DCT變換的函數句柄賦給fun。dct2D為原始DCT變換函數
IMG = blkproc(Img,[8 8],fun); %做原始8*8 DCT變換 變換后賦值給 IMG
subplot(2,3,2); %畫出原始DCT變換后的圖像
imshow(IMG,[]);
title('原始DCT變換后的圖像');
%% 3:做快速DCT變換
F_IMG = fast_dct2D(Img); %fast_dct2D為快速DCT變換函數,Img為原圖像
subplot(2,3,5); %畫出快速DCT變換后的圖像
imshow(F_IMG,[]);
title('快速DCT變換后的圖像');
%% 4:使用JPEG的量化矩陣對8*8變換系數做均勻量化
qfun = @quantization; %量化函數。IMG為原始DCT變換后的圖像
%這里不對快速DCT變換做均勻量化
Q_IMG = blkproc(IMG,[8 8],qfun); %對IMG進行JPEG量化 Q_IMG 為返回量化后矩陣
subplot(2,3,3); %畫出DCT變換,均勻量化后的圖像
imshow(Q_IMG,[]);
title('DCT變換,均勻量化后的圖像');
%% 5:均勻量化后,做DCT逆變換
ifun = @idct2D; %把按定義編寫的DCT逆變換函數句柄賦給ifun
i_qimg = blkproc(Q_IMG,[8 8],ifun);
%利用 idct2D 函數做DCT逆變換
subplot(2,3,4); %畫出DCT變換,均勻量化后,再做逆變換的圖像
imshow(i_qimg,[]);
title('DCT逆變換后的圖像');
%% 6:做zigzag掃描,經游程編碼,輸出文本文件
k=1;
sout=ones(k,2);
for i=1:32
for j=1:32
q=zigzag(Q_IMG((j-1)*8+1:j*8,(i-1)*8+1:i*8)); %逐個8*8圖像做zig_zag掃描
[sout,k]=runlength(q,sout,k); %游程編碼
if( ~(i==32 & j==32))
k=k+1;
sout(k,2)=1;
end
end
end
fid=fopen('LENA256_data.txt','w+');
fprintf(fid,'(%d,%d)',sout'); %將結果輸出到文本rel.txt
fclose(fid);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -