📄 main.asv
字号:
function main
%% 读取图像 Img为图像值
Img = imread('LENA256.bmp'); %读入图像,256*256的灰度图像
subplot(2,3,1); %画出源图像
imshow(Img);
title('原图像');
%% 做原始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变换后的图像');
%% 做快速DCT变换
F_IMG = fast_dct2D(Img); %fast_dct2D为快速DCT变换函数,Img为原图像
subplot(2,3,5); %画出快速DCT变换后的图像
imshow(F_IMG,[]);
title('快速DCT变换后的图像');
%% 使用JPEG的量化矩阵对8*8变换系数做均匀量化
Q_IMG = quantization(IMG); %量化函数。IMG为原始DCT变换后的图像
%这里不对快速DCT变换做均匀量化
Q_IMG = blkproc(IMG,[8 8],'x./P1',JPEG_data);
subplot(2,3,3); %画出DCT变换,均匀量化后的图像
imshow((Q_IMG),[]);
title('DCT变换,均匀量化后的图像');
%% 均匀量化后,做DCT逆变换
ifun = @idct2D; %把按定义编写的DCT逆变换函数句柄赋给ifun
i_qimg = blkproc(IMG,[8 8],ifun); %利用 idct2D 函数做DCT逆变换
subplot(2,3,4); %画出DCT变换,均匀量化后,再做逆变换的图像
imshow(i_qimg,[]);
title('DCT逆变换后的图像');
%% 做zigzag扫描,经游程编码,输出文本文件
k=1;
sout=ones(k,2);
for i=1:32
for j=1:32
q=zigzag(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 + -