【实例简介】
Matlab 图像处理 人脸识别 等等 包括 jpeg仿真。。。
end
end
end
back=)*examplekd'i
end
得到的 differenc最大值为1.232902668846236e-12,可以忽略不计,所以两者功能
基本相同,只不过库函数可以计算非方阵的矩阵。
3.如果将DCT系数矩阵中右侧四列的系数全部置零,逆变换后的图像会发生什么变化?选
取一块图验证你的结论。如果左侧的四列置零呢?
相关程序如下
clear all close all clc
load( UpegCoert mat ' )i
load( hall. mat)i
middle-dct2 (double (hall gray)-ones(size(hall gray))x128
[×y]=size(m1ddle)
middle=[zeros(x, 4),middle(:(5:y))]i
middle=[middle(:,(1:(y-4))),zeros(x, 4
transform-idct2(middle)+ones(size (middle))*128
trans forml=idct2(middlel)+ones(size(middle))*128;
transform2=idct(middle)+ones(size(middle))*128i
fiqure
imshow(uint8(transform))i
王 Igure;
imshow (uint8(transform))i
Figure
imshow(uint8(transfor n2))i
左侧置零后图像,明显变灰
右侧置零后图像,没有太大改变
Ti置
岀现上述情况的原因是,αs变换后左侧有很多直流分量,置零后,会使图像像128靠近,
所以会变灰,而右侧较多高频分量,置零后,虽然会减少图像的高频分量,但人眼对高频分
量并不敏感,所以会感觉图像变化不大。
4.若对D冖系数分别做转置、旋转90度和旋转180度操作(ot90),逆变换后恢复的
图像有何变化?选取一块图验让你的结论。
相关程序如下
clear al, close all, clc
load( hall. mat)i
middle=dct2(double (hall gray)-128)i
middle=rotg0(middle)i
middle=rotg0(middle, 2)i
tt=icct2(middle)+128;
transform=idct2(middle)+128;
transform=idct(middle)+128
transform2=idct2(middle)+128;
figure;
imshow(uint8(transform))i
figure
imshow(uint8(transform1))i
± Igure;
imshow(uint8(transform2))i
得到如下结果
转置
旋转90
旋转180
5.如果认为差分编码是一个系统,请绘出这个系统的频率响应,说明它是一个高通滤波器。
nC系数先进行差分编码再进行熵编码,说明DC系数的高频频率分量更多
相关程序为
clear all, close all clc;
fxeq2([-11,1);
我们得到这个滤波器的频率响应如下
20
40
E
0.2030.4050.507080g
normalized fres
y(xπ rad/sample)
1
-15
D.10.2彐口.4口
Normalized Frequency(xπ rad/sample〕
可见此滤波器为高通滤波器。
6.DC预测误差的取值和 Category值有何关系?如何利用预测误差计算出其
Category
如果DC系数为0,则 Category为0,若DC系数不为0,那么
Category=floor(log2(abs(DC(count)))+1
7.你知道哪些实现zig-zag打描的方法?请利用 MATLAB的强大功能设计一种最佳方法
这个没有想到如何利用经优化过的矩阵算法进行运算,根据定义,我们可以得到如下程序
function [back]= zigzag(example)
back=zeros(64,1);
sed
6;8,13,19,24,34,38,49,7,14,18,25,33,39,48,50
15;17,26,32,40,47,51,58,16,27,31,41,46,52;57,59,,,
28;30,42,45,53;56,60,63,29,43,44,54,55,61;62,64];
a=zeros(64, 1)
t=1:8
((count-1)x8+1: count*8)-example(:, count)i
end
t=1:64
back(seg(count))=a(count)
end
end
以及逆 ZIgZag程序
function [back]= inv zigzag(example)
back=zeros(8,8)i
seq=[1,3,4,-0;11,21,22,36,2;5,9,12,20,23;35,37,
···
6,8,13,19,24;34;38,49,7,1418,25,33,39,48,50
15;17,26,32,40;47,51;58,16,27,31,41,46,5257,59
28,30,42,45,53,56,60,63,29,43,44,54,55,61;62,64];
middle=zeros(64,1)i
for count=1: 64
middle(count)=example(seg(count))i
end
for count=1: 8
back(: count)=middle((count-1)*B+l: count*8);
end
8.对测试图像分块、DCT和量化,将量化后的系数写成矩阵的形式,其中每一列为一个块
的DC系数zig-2ag扫描后形成的列矢量,第一行为各个块的DC系数。
相关程序如下
clear all, close all, clc
load(' Jpegcoetf. mat')i
load hall. mat hall gray
Th l]=size(hall gray)i
h
ei1(h/8)
1-8*cei1(1/8);
若图像横纵不为8的倍数,则要补全
example= zeros(h,1)氵
Th l=size hall gray)i
example(l: h, 1: 1)=hall grayi
example=double(example)-128
answer=zeros(64, ceil(h/8)ceil(1/8));
for count=l: ceil(h/8)
for count2=1: ceil(1/8)
answer(:(count-1)*ceil(1/8)+count2)
zigzag(round ((dct2(example((count-1)*8+1: count*8,(count2-1)*8+1: count
8))./QTAB)))
end
end
9.请实现本章介绍的EG编码(不包括写JFIF文件),输出为DC系数的码流、AC系
数的码流、图像高度和图像宽度,将这四个变量写入 Gpegcodes.mat文件。
相关程序如下
T28
[h l]=size(answer)i
DC-answer(l:
差分运算如下
for count=2: 1
DC(count)=answer(l, count-1)-answer(l, count)i
end
CCCcde-[]
fo≌ count=1:1
号找出cate,确定huff编码
DC (count)==0
cate=1
el se
cate=floor(log2(abs(DC (count)))+2)i
end
huff-DCtAB (cater 2: DCTAB(cater 1)+1)
coo-trans(DC(count))
DCCoce=[decode huff cooli
nd
DCCcce=logical(DECode)i
ACCede=[]
AC=answer(2:64:
n=0
last=find(ac(: count2)=0, l, 'last)i
for count=1:last
if AC(count count2)==0
t run>=l5
ACCode= [ACCode 111111]i
un=0;
run=run+1
end
else
找出huf编码
if AC(count count2)==-1 AC(count, count2)==
cate=1
e⊥se
ate==lcor(log2(abs(AC(
,Cunt2)))+1)
end
ans(AC(count
ACCode=[ACCode
ACTAB(run*10+cate, 4: ACTAB(run*10+cate, 3)+3)
end
ACCcCe=[ACCode 10 1]
en
ACCCCe=logical(AcCode)
Th 1]-size(hall gray)i
save jpegcodes mat DCCode ACCode h 1
进制转换
function [back trans( num
middle=dec2bin(abs(um))i
n-flcor(log2(abs(num)))+li
back=zeros(l, n)
for count=1: n
back(count)=str2num(middle(count))i
end
if num<0
back=back
end
back=double(back
号若num=0,那么要强制back=[0],否则会出现空阵
if
end
end
10.计算压缩比(输入文件长度/输出码流长度),注意转换为相同进制。
ACCode长度为23073, DECode长度为2054,原图大小为120*168米8
所以压缩约比为6.4186
11.请实现本章介绍的JPEG解码,输入是你生成的 jpegcodes.mat文件ε分别用客观(PSR
和主观方式评价编解码效果如何
相关程序如下
clear all, close all, clc
load(' ipegcodes. mat)
load( JpegCoeff. mat')i
各确定相关hu前缀需要向后读入的位数
CCTAE=[[1;1;2;3;4;6;7;8;9;10;11]DCAB];
ge=length(decode)i
count=li
while count<=ge
flag=0i
run=run+1
now=[now DCCode(count)]i
名确定相关长度的huFf编码
d (DCTAB(: 2)
for court2=1: length(po)
若与huff编码相同则读出应向后读入的位数
f double(now)=-dCTA3(po(count2),3: 3+DCTAB (po(count2),2)-1)
10-DCTA3(oo(count2),1)i
break;
if flag--1
确定DC编码
middle=DCCode(coun=+1: count+lo);
士
DC=[DC 0]i
else
DC=[DC inv trans(middle)]i
end
count=count+loi
now-
run=0;
end
count=count+1
end
AC=zeros(63, ceil(h/B)*ceil(1/8))i
ge=length(ACCode)i
count=l
[];
wherearewe=li
while count<=ge
号寻找AC编码与DC大致相同
run-run+l;
now=Lnow ACCode(count)i
po=fird(ACTAB(: 3)==run)i
for count2=1: length(p
f double(now)==AcTAB(po(count2),4: 4+run-1
【实例截图】
【核心代码】