【计算机视觉】Harris特征和SIFT特征图像匹配

1、Harris角点检测 

如果像素周围显示存在多于一个方向的边,我们就认为该点为兴趣点,即角点。

compute_harris_response函数是在在一幅灰度图像中,对每个像素计算harris角点检测器响应函数,返回像数值为Harris响应值的一幅图像。

get_harris_points是从一幅harris响应图像中返回角点。mid-dist为分割角点和图像边界的最少像素数目。我们获取所有的候选像素点,以角点响应值递减的顺序排序,然后将距离已标记为角点位置过近的区域从候选像素点中删除。

主代码

from PIL import Image
from numpy import *
import harris
from pylab import *
im=array(Image.open('shangda.jpg').convert('L'))
harrisim=harris.compute_harris_response(im,3)
#阈值为0.2
filtered_coords1=harris.get_harris_points(harrisim,0.2,6)
harris.plot_harris_points(im,filtered_coords1)

下图是对学校尚大楼进行的角点检测

【计算机视觉】Harris特征和SIFT特征图像匹配_第1张图片

2、Harris特征匹配

get_descriptors函数将图像块像素值压平成一个向量,然后添加到描述子列表中。

match函数使用归一化的互相关矩阵,将每个描述子匹配到另一个图像中的最优的候选点。

match_twosided函数从第二幅图像向第一幅图像进行匹配,然后过滤掉在两种方法中不都是最好的匹配。

appendimages函数和plot_matches是新啊匹配点的可视化。.

主代码

from PIL import Image
from numpy import *
import harris
from pylab import *
wid=5
im1=array(Image.open('pipei1.jpg').convert('L'))
im2=array(Image.open('pipei2.jpg').convert('L'))
harrisim=harris.compute_harris_response(im1,5)
filtered_coords1=harris.get_harris_points(harrisim,0.2,wid+1)
d1=harris.get_descriptors(im1,filtered_coords1,wid)
harrisim=harris.compute_harris_response(im2,5)
filtered_coords2=harris.get_harris_points(harrisim,0.2,wid+1)
d2=harris.get_descriptors(im2,filtered_coords2,wid)
print ('starting matching')
matches=harris.match_twosided(d1,d2)
figure()
gray()
harris.plot_matches(im1,im2,filtered_coords1,filtered_coords2,matches)
show()

运行结果图: 

【计算机视觉】Harris特征和SIFT特征图像匹配_第2张图片

3、SIFT特征点

我们使用VLFeat提供的二进制文件来计算图像的SIFT特征,这边我用的是0.9.20版本的,因为用0.9.21版本的会报错,(too many indices for array)。

在这个例子中,每一行中前几列为位置信息,紧接着是描述子。

plot_features函数将特征可视化

draw_circle函数用蓝色圆圈标出SIFT特征点的位置,圆圈的半径为特征的尺度

主代码

import sift
from PIL import Image
from pylab import *
imname = 'shangda.jpg'
im1 = array(Image.open(imname).convert('L'))
sift.process_image(imname, 'shangda.sift')
l1, d1 = sift.read_features_from_file('shangda.sift')
figure()
gray()
sift.plot_features(im1, l1, circle=True)
show()

运行结果图(使用圆圈表示特征尺度的SIFT特征)

【计算机视觉】Harris特征和SIFT特征图像匹配_第3张图片

4、SIFT特征匹配

对于将一幅图像中的特征匹配到另一幅图像的特征,一种稳健的准则是使用这两个特征距离和两个最匹配特征距离的比率。相比于图像的其他特征,该准则保证能够找到足够相似的唯一特征。使用该方法可以使错误的匹配数降低。

match函数使用描述子向量间的夹角作为距离度量。对于第一幅图像中的每个描述子,选取其在第二幅图像中的匹配。

match_twosided函数为双向对称版本的match()

主代码

from PIL import Image
from pylab import *
from numpy import *
import sift
im1f = 'pipei1.jpg'
im2f = 'pipei2.jpg'
im1 = array(Image.open(im1f))
im2 = array(Image.open(im2f))

sift.process_image(im1f, 'out_sift_1.txt')
l1,d1 = sift.read_features_from_file('out_sift_1.txt')
figure()
gray()
subplot(121)
sift.plot_features(im1, l1, circle=False)

sift.process_image(im2f, 'out_sift_2.txt')
l2,d2 = sift.read_features_from_file('out_sift_2.txt')
subplot(122)
sift.plot_features(im2, l2, circle=False)

matches = sift.match_twosided(d1, d2)
print('{} matches'.format(len(matches.nonzero()[0])))
figure()
gray()
sift.plot_matches(im1,im1,l1,l2,matches, show_below=True)
show()

运行结果图(图片需要处理成相同像素高宽)

【计算机视觉】Harris特征和SIFT特征图像匹配_第4张图片

5、harris和sift特征匹配对比

Harris算法的主要特点是阈值决定检测点数量;角点检测算子对亮度和对比度的变化不敏感;具有旋转不变性,不具有尺度不变性。harris算法中的阈值依赖于实际图像的属性,不具有直观的物理意义,具体值难确定。

sift算法具有非常强的稳健性,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性; 独特性;多量性; 高速性;可扩展性,可以很方便的与其他形式的特征向量进行联合。但特征匹配时间消耗大,无法对边缘光滑的目标准确提取特征点。

参考资料

Python计算机视觉

此文章中的所有文件已经打包上传sift harris

           ----------------------------------------------------------------------------------------------------------------------

你可能感兴趣的:(计算机视觉,python)