数字图像处理10-图像拼接,映射
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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取得的参数就是第二张图的参数。