大作业图像拼接Word文档下载推荐.docx
《大作业图像拼接Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《大作业图像拼接Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
(4)图像融合
简介
对手持相机拍摄得到的照片,即相机运动不受限制,两幅图像的关系可近似归结为初等坐标变换,即平移、旋转和缩放的组合。
设
,为两幅图像
的对应点,则二者关系由下式确定
(1)
其中
是两点的齐次坐标,M是两图像间的变换矩阵,含有八个参数。
一旦M确定,则两幅图像的变换关系即可确定。
如何确定矩阵M?
首先确定一定数量的特征点,利用特征点的匹配给出图像变换的估计初值,最后通过递归算法得到最后的变换。
特征提取与匹配
采用SIFT算法进行特征点的提取与匹配。
主要包含4个步骤:
1、建立尺度空间,寻找候选点
2、精确确定关键点,剔除不稳定点
3、确定关键点的方向
4、提取特征描述符
本文中matlab实现代码如下:
im11=img{ccc-1};
im22=img{ccc};
[im1,des1,loc1]=sift2(im11);
[im2,des2,loc2]=sift2(im22);
distRatio=;
des2t=des2'
;
match(size(des1,1))=0;
fori=1:
size(des1,1)
dotprods=des1(i,:
)*des2t;
[vals,indx]=sort(acos(dotprods));
if(vals
(1)<
distRatio*vals
(2))
match(i)=indx
(1);
end
end
im3=appendimages(im1,im2);
figure('
Position'
[100100size(im3,2)size(im3,1)]);
colormap('
gray'
);
imagesc(im3);
holdon;
cols1=size(im1,2);
holdoff;
num=sum(match>
0);
fprintf('
Found%dmatches.\n'
num);
其中sift2封装了sift特征点提取,返回值des是特征描述子;
appendimages函数实现了两幅图像边挨边拼接。
详细代码见和
消除误匹配
假设同一个相机拍出的图像尺度差别比较小。
因此对于两对匹配点(P1,Q1)
(P2,Q2),向量P1P2,Q1Q2的夹角比较小,同时|P1P2|和|Q1Q2|的值也比较接近。
我们记录一个匹配点与其他匹配点形成的向量,并记录待匹配图像中的对应匹配点与其他相应匹配点形成的向量,通过比较,记录该匹配点通过匹配阈值的个数,如果超过匹配点总数的4/5,则该匹配点是正确匹配。
否则为误匹配。
图1,消除误匹配
matlab实现代码如下:
KeyPoints(num,4)=0;
j=1;
fori=1:
if(match(i)>
0)
KeyPoints(j,1)=loc1(i,2);
KeyPoints(j,2)=loc1(i,1);
KeyPoints(j,3)=loc2(match(i),2);
KeyPoints(j,4)=loc2(match(i),1);
j=j+1;
yuzhi_y=min(size(im11,1),size(im22,1));
yuzhi_x=min(size(im11,2),size(im22,2));
yuzhi=sqrt(yuzhi_y^2+yuzhi_x^2);
PointDis(num)=0;
size(KeyPoints,1)
forj=1:
a=[abs(KeyPoints(i,1)-KeyPoints(j,1)),abs(KeyPoints(i,2)-KeyPoints(j,2))];
b=[abs(KeyPoints(i,3)-KeyPoints(j,3)),abs(KeyPoints(i,4)-KeyPoints(j,4))];
xiangsi=dot(a,b)/(norm(a)*norm(b));
if(xiangsi<
cos(pi/4)||norm(a)-norm(b)>
yuzhi/10)
PointDis(i)=PointDis(i)+1;
j=0;
fori=1:
num
if(PointDis(i)>
num/6)
KeyPoints(i,1)=inf;
j=j+1;
KeyPoints2(num-j,4)=0;
z=1;
if(KeyPoints(i,1)~=inf)
KeyPoints2(z,:
)=KeyPoints(i,:
z=z+1;
KeyPoints=KeyPoints2;
num=size(KeyPoints,1);
num
line([KeyPoints(i,1)KeyPoints(i,3)+cols1],...
[KeyPoints(i,2)KeyPoints(i,4)],'
Color'
'
c'
确定变换参数
我们用平面透视变换来表示图像间的几何关系:
为了恢复M中的8个参数,需要4对匹配点来求解。
我们使用RANSAC(RandomSampleConsensus)方法来寻找两幅图像间最佳的4对匹配点,得到相应的H阵,并剔除误配点。
前面自动提取和匹配得到的初始匹配特征点对集合中难免存在误配点,此外特征点在提取时也存在一定的精度误差,因此需要一种容错能力很强的算法来过滤初始匹配特征点对集合,而RANSAC正是这样的一种算法,其具体内容可描述如下:
给定N个数据点组成的数据集合P,假设这N个数据点中的绝大部分是由一个参数未知的特定模型产生,而该模型至少需要n个数据点来求解,且N>
n,则可以通过下面的迭代过程求解该模型的参数。
将以下步骤运行k次:
’
(1)从P中随机选取n个数据点的子集S。
(2)由选取的这n个数据点计算出一个模型M。
(3)对数据集合中其余的N一n个数据点,计算它们与模型肘之间的距离,记录P中在M的某个误差允许范围内的数据点的个数c。
迭代
(1)~(3)k次后,对应最大c值的模型即为所求,数据集合P中的这c个数据即为内点,其余的N—C个数据即为外点。
DDmin=5000;
forll=1:
6
zNum=1;
while
(1)
if(zNum>
num*6)
break;
zNum=zNum+1;
DD(15)=0;
H(3,3,15)=0;
fork=1:
15
suiji=round(rand(1,4)*(num-1)+1);
if(sum(find(suiji==inf))==0)
j=1;
fori=1:
4
x2=KeyPoints(suiji(i),1);
y2=KeyPoints(suiji(i),2);
x=KeyPoints(suiji(i),3);
y=KeyPoints(suiji(i),4);
%line([x2x+cols1],[y2y],'
A(j,:
)=[x,y,1,0,0,0,-x*x2,-x2*y];
D(j)=x2;
j=j+1;
)=[0,0,0,x,y,1,-x*y2,-y2*y];
D(j)=y2;
%B(i-1,:
)=[x,y,x2,y2];
y=inv(A)*D'
H(:
:
k)=[y
(1),y
(2),y(3);
y(4),y(5),y(6);
y(7),y(8),1];
if(sum(H==inf)>
0)
continue;
else
forin1=1:
TT=H(:
k)*[KeyPoints(in1,3);
KeyPoints(in1,4);
1];
DD(k)=DD(k)+sqrt((TT
(1)-KeyPoints(in1,1))^2+(TT
(2)-KeyPoints(in1,2))^2);
[val3,indx3]=sort(DD);
i=1;
if(H(1,1,indx3(i))==inf||DD(indx3(i))==0)
i=i+1;
if(DD(indx3(i))<
=DDmin)
DDmin=DD(indx3(i));
Hfinal=H(:
indx3(i));
HfinalMax(:
ccc-1)=Hfinal;
fortc=1:
ccc-1
if(ccc-tc-1==0)
Hfinal=HfinalMax(:
ccc-tc-1)*Hfinal;
图像融合
1.图像旋转之后可能新的像素点并不在实际的像素位置,因此需要插值处理。
建议使用双线性插值。
2.对于重合的部分的像素值可以有如下计算办法:
图2图像融合方法
我们采用method1
edgept1=round(Hfinal*[size(im22,2);
size(im22,1);
1]);
edgept2=round(Hfinal*[1;
edgept3=round(Hfinal*[1;
1;
edgept4=round(Hfinal*[size(im22,2);
height=max([size(im11,1),edgept1
(2),edgept2
(2),edgept3
(2),edgept4
(2)]);
width=max([size(im11,2),edgept1
(1),edgept2
(1),edgept3
(1),edgept4
(1)]);
t2(height,width,3)=0;
t2=uint8(t2);
if(ccc~=2)
im11=curImg2;
size(im11,1)
size(im11,2)
t2(i,j,:
)=im11(i,j,:
end
p1=[round(size(im11,2)/2),round(size(im11,1)/2)];
p2=round(Hfinal*[size(im22,2);
size(im22,1)
size(im22,2)
x=Hfinal*[j;
i;
1];
tx=max(1,round(x
(2)));
ty=max(1,round(x
(1)));
if(t2(tx,ty,1)~=0&
&
t2(tx,ty,2)~=0&
t2(tx,ty,3)~=0)
d1=sqrt((ty-p1
(1))^2+(tx-p1
(2))^2);
d2=sqrt((ty-p2
(1))^2+(tx-p2
(2))^2);
para1=d2/(d1+d2);
para2=d1/(d1+d2);
t2(tx,ty,:
)=round((im22(i,j,:
).*para2+t2(tx,ty,:
).*para1));
)=im22(i,j,:
fori=2:
height-1
forj=2:
width-1
if(t2(i,j,1)==0&
t2(i,j,2)==0&
t2(i,j,3)==0)
)=round(t2(i-1,j-1,:
)/+t2(i-1,j+1,:
)/+t2(i+1,j-1,:
)/+t2(i+1,j+1,:
)/);
%figure;
imshow(t2);
curImg2=t2;
set,'
Pos'
[28,28,size(curImg2,2),size(curImg2,1)]);
axes;
imshow(curImg2);
实验结果
图3启动画面
图4特征匹配点1
图5特征匹配点2
图6特征匹配点3
图7办公室图像拼接效果图
图8礼堂拼接效果图
图9礼堂拼接效果图2
优缺点
优点:
运行比较快,且图像拼接效果还可以。
缺点:
两幅图像拼接效果会很好,多幅图像会出现一定程度的模糊(最后一幅图乘了n-2个旋转平移矩阵)。
期待老师能帮助优化一下。
参考文献
[1]贾棋,《图像处理基础课件》,2011年4月。
[2]赵书兰,《MATLAB数字图像处理与分析实例教程》,化学工业出版社,2009年6月
[3]严磊,《基于特征匹配的全自动图像拼接算法研究》,中国科学技术大学,2009年