计算机视觉课程设计实验报告

1.题 目: 图 像 变 形

2.组 员:曹英( 叶超( 李淑珍(

3.实验目的:掌握图像几何运算中变形算法

4.实验原理:对两幅图分别进行卷绕、插值,每幅图得到一序列图片,然后对这些序列图片进行加权求和,得到一序列帧,再将其显示出来,就得到了由一幅图到另一幅图的变形。

5.实验步骤:对一幅图分别选4行4列的16个控制点,在每条边上进行五等分,每条边形成六个点,加上原来的16个就是36个控制点,这样就把它分成了不规则的25小块,对每小块进行卷绕、插值,本实验我们用的是最近邻插值,目标控制点就是将图片分成标准并且相同大小的25小块的36个点。这样会得到一幅不规则图片,让它作为新的原图进行如前所述一样的处理,控制点都是这样自动产生的:一开始所选每个控制点到相应标准控制点等距离(本实验我们是分成9等分)产生一序列的36个控制点。这样每产生一幅图都对它进行相类似的处理,控制点的产生方法就是上面所说的那样。得到的一序列图片越来越接近原图,最后一幅与原图一样。这样我们就可以得到这样的一序列图片:原图,手工选控制点进行处理后得到的不规则图,循环产生控制点得到的越来越接近原图的9幅图(最后一幅与原图一样)。为了描述的方便,这里我把它编号为1_1到1_11。

对目标图进行与原图一样的处理。编号也类似,即2_1到2_11。

最后进行加权求和,第一帧是原图,第二帧是1_10与2_2加权求和,其中1_10的权值是0.9,2_2的权值是0.1,第三帧是1_9与2_3加权求和,其中1_9的权值是0.8,2_3的权值是0.2,……,第十帧是1_2与2_10加权求和,其中1_10的权值是0.1,2_2的权值是0.9,第十一帧是目标图。这样就得到了所要的结果。

这里需要说明的是两幅手工选择的控制点最好是那些有代表性的特征点,这样的话结果会更好。

下面的程序的源代码:

clear all; clc;
x1=imread('im1.jpg');
x2=imread('im2.jpg');
[m,n,p]=size(x1);
subplot(2,2,1),imshow(x1);
subplot(2,2,2),imshow(x2);
x1=double(x1);
x2=double(x2);
newx=[];
newy=[];
%在图片上选36个点将图片分成标准并且相同大小的25小块
for k=1:36
newx(k)=fix((n/5))*(mod(k-1,6))+1;
newy(k)=fix((m/5))*fix((k-1)/6)+1;
end
%对原图进行分块
for k=1:36
switch k
case {1,2,3,4,5,6,7,12,13,18,19,24,25,30,31,32,33,34,35,36} %边界上的点还是标准的等分点
oldx1(k)=newx(k);
oldy1(k)=newy(k);
otherwise %在图片中选择4行4列的16个控制点
[oldx1(k),oldy1(k)]=ginput(1);
hold on;
subplot(2,2,1),plot(oldx1(k),oldy1(k),'o');
end
end
%对目标图进行分块,方法同上
for k=1:36
switch k
case {1,2,3,4,5,6,7,12,13,18,19,24,25,30,31,32,33,34,35,36}
oldxx1(k)=newx(k);
oldyy1(k)=newy(k);
otherwise
[oldxx1(k),oldyy1(k)]=ginput(1);
hold on;
subplot(2,2,2),plot(oldxx1(k),oldyy1(k),'*');
end
end
%对第一张进行卷绕,插值
for i=1:29
newspic=[];
if mod(i,6)~=0
for j=1:4 %每个小块分别处理
if j==1
newspic=[1 newx(i) newy(i) newx(i)*n