📄 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 + -