数字图像处理10-图像拼接,映射

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

这次作业的要求是通过参考给定的两个示例程序,编写手动选择匹配点并把两张照片拼在一起的程序。首先来看两个示例程序的功能,第一个示例程序运行后,可以生成选择点的界面,如下所示:

其中会生成四个点,当然如果想要更多点是可以再增加点数的,但是至少需要四个点。在两张图上选择好相对应的点后,cpselect函数会生成一个tform变换矩阵。这个矩阵可以把第二张照片通过变换,使其标定的四个点与第一幅图上标定的四个点相对应。

第二个示例程序的效果如下:

首先我们有上面三张图,前两张是同一辆汽车的照片,但是在空间上存在位置上的区别。第三章是车尾的部分图像,这一部分在两张图中是都存在的。程序通过这一相同的区域和原图

计算相关,求出相关值最高的位置坐标。而两张图相关值最高的位置坐标之差,就是两张图在空间上的位置差。程序又通过一个叠加显示图像的函数,把二者变换后的结果在一个figure 中叠加显示出来,达到第四张图的拼接图像的效果。

联系两个函数的功能来看,就可以得到基本的拼合图片的操作流程。首先用第一个例子中的cpclect函数获得一个变换矩阵,然后把这个矩阵用到第二个函数的拼合图像的函数中,把两张图像拼在一起。具体的代码如下:

close all;

orthophoto = imread('x.jpg');

figure, imshow(orthophoto)

unregistered = imread('y.jpg');

figure, imshow(unregistered)

load westconcordpoints;

[input_points,base_points] =

cpselect(unregistered,orthophoto,movingPoints,fixedPoints,'WAIT',true );

mytform = cp2tform(input_points,base_points,'projective');

visreg(orthophoto,unregistered,mytform,'bottom',0.8);

axis auto;

如上所示,这里根据图像、界面、最后的结果以及代码本身,对实现的过程加以分析。首先读入上面两张图像x和y,就是上面四张图中的前两张。可以看见两个图像在角度上,位置上都存在差异。随后load westconcordpoints函数加载了一个界面,就是第三个图片的界面,以便cpselect函数通过选择的对应点生成变换矩阵。在第三幅图中可以看见四组点,分别标记在了两幅图中对应的位置上,这两组点就是input_points和base_points。之后cp2tform函数就通过读取这两组点,生成了一个变换矩阵mytform。之后这个语句

visreg(orthophoto,unregistered,mytform,'bottom',0.8)调用了一个自定义的函数,实现了这个程序的主要功能。这里我们来看下面的函数体:

function h=visreg(fref,f,tform,layer,alpha)

if nargin<5

alpha=0.5;

end

if nargin<4

layer='top';

end

[g,g_xdata,g_ydata]=imtransform(f,tform);

[M,N]=size(fref);

fref_xdata=[1,N/3];

fref_ydata=[1,M];

if strcmp(layer,'top')

top_image=g;

top_xdata=g_xdata;

top_ydata=g_ydata;

top_alpha=imtransform(alpha*ones(size(f)),tform);

bottom_image=fref;

bottom_xdata=fref_xdata;

bottom_ydata=fref_ydata;

else

top_image=fref;

top_xdata=fref_xdata;

top_ydata=fref_ydata;

top_alpha=alpha;

bottom_image=g;

bottom_xdata=g_xdata;

bottom_ydata=g_ydata;

end

h_bottom=imshow(bottom_image,'XData',bottom_xdata,'YData',bottom_ydat a);

hold on

h_top=imshow(top_image,'XData',top_xdata,'YData',top_ydata);

set(h_top,'AlphaData',top_alpha);

axis auto

if nargout>0

h=[h_bottom,h_top];

end

end

这个函数中讨论了多种省略参数的情况,但是由于没有用到,在此就只解释参数完整的情况,也是我们这个程序中最终用到的情况。读入的参数有5个,分别是两张图像,变换矩阵,分层关系以及透明度值。首先通过mytform把第二个图进行变换,此时两张图上对应点就已经变换成可以重叠的位置了。[M,N]=size(fref)这个函数在rgb图像识别的过程中会出现问题,由于本身rgb图像是3维矩阵,此时N值取到了本身图像宽度的3倍,因此在下面取data的过程中要用N/3作为参数。后面由于输入的参数为bottom,因此top_image取得的参数就是第一张图的参数,botom_image取得的参数就是第二张图的参数。

相关文档
最新文档