图像中角点提取与匹配算法.docx
《图像中角点提取与匹配算法.docx》由会员分享,可在线阅读,更多相关《图像中角点提取与匹配算法.docx(13页珍藏版)》请在冰豆网上搜索。
图像中角点提取与匹配算法
1说明
本文实验的目标是对于两幅相似的图像,通过角点检测算法,进而找出这两幅图像的共同点,从而可以把这两幅图像合并成一幅图像。
下面描述该实验的基本步骤:
1.本文所采用的角点检测算法是Harris角点检测算法,该算法的基本原理是取以目标像素点为中心的一个小窗口,计算窗口沿任何方向移动后的灰度变化,并用解析形式表达。
设以像素点(x,y)为中心的小窗口在X方向上移动u,y方向上移动v,Harris给出了灰度变化度量的解析表达式:
(1)
其中,为窗口内的灰度变化度量;为窗口函数,一般定义为;I为图像灰度函数,略去无穷小项有:
(2)
将化为二次型有:
(3)
M为实对称矩阵:
(4)
通过对角化处理得到:
(5)
其中,R为旋转因子,对角化处理后并不改变以u,v为坐标参数的空间曲面的形状,其特征值反应了两个主轴方向的图像表面曲率。
当两个特征值均较小时,表明目标点附近区域为“平坦区域”;特征值一大一小时,表明特征点位于“边缘”上;只有当两个特征值均比较大时,沿任何方向的移动均将导致灰度的剧烈变化。
Harris的角点响应函数(CRF)表达式由此而得到:
(6)
其中:
det(M)表示矩阵M的行列式,trace(M)表示矩阵的迹。
当目标像素点的CRF值大于给定的阈值时,该像素点即为角点。
下面是图像一用Harris角点检测算法得到的角点坐标位置
x
212
301
309
353
58
201
178
58
202
186
329
161
202
58
57
201
306
y
2
65
68
77
94
94
142
143
144
150
150
170
177
178
228
228
228
在图像一上画出该角点的坐标位置如下图所示:
其中蓝色小方块代表的是检测出来的角点坐标位置。
2.匹配。
将两幅图像进行Harris角点检测后,分别得到角点对应与该图像的坐标位置,以该坐标位置为中心,分别取其附近的8个像素值,然后进行与另一幅图像进行匹配,找出距离最小的点作为匹配点。
例如下面是图像一角点坐标位置
x
212
301
309
353
58
201
178
58
202
186
329
161
202
58
57
201
306
y
2
65
68
77
94
94
142
143
144
150
150
170
177
178
228
228
228
与该位置对应的8个像素值分别为
角点1
角点2
角点3
。
。
。
角点17
(x-1,y-1)
30
7
35
。
。
。
142
(x-1,y)
48
59
17
。
。
。
9
(x-1,y+1)
37
108
128
。
。
。
63
(x,y+1)
31
114
15
。
。
。
101
(x+1,y+1)
143
183
32
。
。
。
95
(x+1,y)
101
177
25
。
。
。
20
(x+1,y-1)
2
92
24
。
。
。
49
(x,y-1)
3
22
30
。
。
。
198
接着,将图像一中的角点1与图像二中的所有角点进行相减,得到一个最小误差值,并记录下该位置,这样依次将图像一中的角点2,角点3一直到角点17都进行相减,即可得到两幅图像之间的最佳匹配点。
下面是两幅图像角点匹配的最佳坐标位置
匹配点
0
10
13
14
15
16
17
0
0
0
4
0
5
12
0
0
0
误差值
0
336
105
64
53
34
104
0
0
0
389
0
204
400
0
0
0
其中匹配点的值为0代表没有找到匹配点
3.显示匹配点。
对已经找出的匹配点,在图像上进行显示,这样有利于人眼判断该算法是否匹配正确。
下面是第一次显示找到的匹配点(两幅图像中共有9个匹配点)
下面是第二次显示找到的匹配点(比上一次少一个,判断依据是将误差值最大的点去除)
从上面可以看出,14号点已经被删除,原因是该点的误差值最大
下面是最后一次显示找到的匹配点
只留下最后三个匹配点,如果少于三个匹配点,则很难进行两幅图像的合并,所以当只有留下三个匹配点的时候,程序退出。
2实验结果
实验一
原始图像
第一次匹配的结果
最后一次匹配的结果
实验二
原始图像
第一次匹配的结果
最后一次匹配的结果
实验三
原始图像
第一次匹配的结果
最后一次匹配的结果
实验四
原始图像
第一次匹配的结果
最后一次匹配的结果
可以看出,利用该算法进行两幅图像匹配结果还算正确。
算法代码(用matlab语言写的)
functiontest()
%Thetestfunctiongivesanexampleofkeypointextractionusingthe
%methods:
%-Harris
%
%Example
%=======
%test();
%Harris
%importthefirstpicture
%img11=imread('');
%img11=imread('');
%img11=imread('');
%img1=double(img11(:
:
1));
img11=imread('');
img1=rgb2gray(img11);
img1=double(img1(:
:
));
pt1=kp_harris(img1);
%draw(img11,pt1,'Harris');
%importthesecondpicture
%img21=imread('');
%img21=imread('');
%img21=imread('');
%img2=double(img21(:
:
1));
img21=imread('');
img2=rgb2gray(img21);
img2=double(img2(:
:
));
pt2=kp_harris(img2);
%draw(img21,pt2,'Harris');
%matchkeypointswithintwopictures.
result=match(img1,pt1,img2,pt2);
result(1,intersect(find(result(1,:
)>0),find(result(2,:
)==0)))=0;
%result
%pause;
while(length(find(result(1,:
)>0))>3)
result
draw2(img11,img21,pt1,pt2,result);
%find(result(1,:
)>0)
pause;
[indexindex]=max(result(2,:
));
result(1,index
(1))=0;
result(2,index
(1))=0;
%result(1,I
(1))=result(2,I
(1))=0
end
draw2(img11,img21,pt1,pt2,result);
end
functiondraw2(img1,img2,pt1,pt2,result)
h=figure;
%set(gcf,'outerposition',get(0,'screensize'));
subplot(1,2,1);
%holdon;
imshow(img1);
subplot(1,2,2);
%holdon;
imshow(img2);
s=size(pt1,2);
subplot(1,2,1);
fori=1:
size(pt1,1)
rectangle('Position',[pt1(i,2)-s,pt1(i,1)-s,2*s,2*s],'Curvature',[00],'EdgeColor','b','LineWidth',2);
%text(pt1(i,2)+3,pt1(i,1)+3,num2str(i),'BackgroundColor',[111]);
%text(pt2(i,2),pt2(i,1),num2str(i));
%plot(pt2(i,2),pt2(i,1));
end
subplot(1,2,2);
fori=1:
size(pt2,1)
rectangle('Position',[pt2(i,2)-s,pt2(i,1)-s,2*s,2*s],'Curvature',[00],'EdgeColor','b','LineWidth',2);
end
%result
%size(pt1)
%size(pt2)
fori=1:
size(result,2)
if(result(1,i)~=0)
subplot(1,2,1);
text(pt1(result(1,i),2)+3,pt1(result(1,i),1)+3,num2str(i),'BackgroundColor',[111]);
%result(1,i)
%pt1(result(1,i),2)
%pt1(result(1,i),1)
subplot(1,2,2);
text(pt2(i,2)+3,pt2(i,1)+3,num2str(i),'BackgroundColor',[111]);
end
end
end
functionresult=match(img1,pt1,img2,pt2)
%得到标定点周围的像素值
regionValue1=getRegionValue(img1,pt1);
len1=size(regionValue1,2);
regionValue2=getRegionValue(img2,pt2);
len2=size(regionValue2,2);
%找出最佳匹配点
result=zeros(2,len2);
fori=1:
len1
B=regionValue1(:
i);
%abs(regionValue2-B(:
ones(1,size(regionValue2,2))))
%sum(abs(regionValue2-B(:
ones(1,size(regionValue2,2)))))
[value,index]=sort(sum(abs(regionValue2-B(:
ones(1,size(regionValue2,2))))));
%value
(1)
%index
(1)
%