Harris角点检测匹配与SIFT特征匹配的对比

安装VLfeat

首先,在使用SIFT算法的时候,我们需要用到python的第三方库VLfeat。其中包含了SIFT算法以及其他的函数方法。
所以在www.vlfeat.org中下载VLfeat
Harris角点检测匹配与SIFT特征匹配的对比_第1张图片
下载的时候记得选择有后缀-bin.tar.gz的文件,这是为Python准备的。
Harris角点检测匹配与SIFT特征匹配的对比_第2张图片
一般是选择最新版的,但是我这里选择的是 vlfeat-0.9.20-bin.tar.gz ,大家可以自己试试21版本的可不可以。
下载完成后,解压该压缩文件。
Harris角点检测匹配与SIFT特征匹配的对比_第3张图片
放到D盘中,点进图中所示的文件路径Harris角点检测匹配与SIFT特征匹配的对比_第4张图片
将sift.exe的文件路径复制下来,找到PCV的文件夹(PCV,在我的另一个博客中有过介绍——计算机视觉Python 第一章 图像处理基础)
进入PCV文件夹
Harris角点检测匹配与SIFT特征匹配的对比_第5张图片
点进去找到localdescriptors文件夹

Harris角点检测匹配与SIFT特征匹配的对比_第6张图片点进去找到sift.py文件,
Harris角点检测匹配与SIFT特征匹配的对比_第7张图片
利用编程软件,将你刚刚复制的sift.exe路径复制到该位置

Harris角点检测匹配与SIFT特征匹配的对比_第8张图片
!!!请注意,在路径的结尾一定要有空格,否则会报错

def process_image(imagename,resultname,params="--edge-thresh 10 --peak-thresh 5"):
    """ Process an image and save the results in a file. """

    if imagename[-3:] != 'pgm':
        # create a pgm file
        im = Image.open(imagename).convert('L')
        im.save('tmp.pgm')
        imagename = 'tmp.pgm'

    cmmd = str("D:\pypackage\vlfeat-0.9.21-bin\vlfeat-0.9.21\bin\win64\sift.exe "+imagename+" --output="+resultname+
                " "+params)//在这行代码中加入sift.exe路径
    os.system(cmmd)
    print ('processed', imagename, 'to', resultname)

保存湾退出。
然后在PCV的文件夹目录中
Harris角点检测匹配与SIFT特征匹配的对比_第9张图片
按住shift+鼠标右键,进入powershell,输入代码python setup.py install 重新安装pcv即可。

哈里斯角点检测匹配

根据以下代码

# -*- coding: utf-8 -*-
from pylab import *
from PIL import Image
from PCV.localdescriptors import harris

"""
Example of detecting Harris corner points (Figure 2-1 in the book).
"""

# 读入图像
im = array(Image.open(r'C:\Users\dell\Desktop\作业\计算机视觉\尚大楼2.png').convert('L'))

# 检测harris角点
harrisim = harris.compute_harris_response(im)

# Harris响应函数
harrisim1 = 255 - harrisim

figure()
gray()

#画出Harris响应图
subplot(141)
imshow(harrisim1)
print (harrisim1.shape)
axis('off')
axis('equal')

threshold = [0.01, 0.05, 0.1]
for i, thres in enumerate(threshold):
    filtered_coords = harris.get_harris_points(harrisim, 6, thres)
    subplot(1, 4, i+2)
    imshow(im)
    print (im.shape)
    plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
    axis('off')

#原书采用的PCV中PCV harris模块
#harris.plot_harris_points(im, filtered_coords)

# plot only 200 strongest
# harris.plot_harris_points(im, filtered_coords[:200])

show()

得出该图片的特征点

原图(集美大学尚大楼)

效果图
然后我们尝试匹配同为一栋大楼的不同位置的图像的特征点,

 # -*- coding: utf-8 -*-
from pylab import *
from PIL import Image

from PCV.localdescriptors import harris
from PCV.tools.imtools import imresize

"""
This is the Harris point matching example in Figure 2-2.
"""

# Figure 2-2上面的图
#im1 = array(Image.open("../data/crans_1_small.jpg").convert("L"))
#im2= array(Image.open("../data/crans_2_small.jpg").convert("L"))

# Figure 2-2下面的图
im1 = array(Image.open(r'C:\Users\dell\Desktop\作业\计算机视觉\尚大楼2.png').convert("L"))
im2 = array(Image.open(r'C:\Users\dell\Desktop\作业\计算机视觉\尚大楼3.png').convert("L"))

# resize加快匹配速度
im1 = imresize(im1, (im1.shape[1]//2, im1.shape[0]//2))
im2 = imresize(im2, (im2.shape[1]//2, im2.shape[0]//2))

wid = 5
harrisim = harris.compute_harris_response(im1, 5)
filtered_coords1 = harris.get_harris_points(harrisim, wid+1)
d1 = harris.get_descriptors(im1, filtered_coords1, wid)

harrisim = harris.compute_harris_response(im2, 5)
filtered_coords2 = harris.get_harris_points(harrisim, 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特征匹配的对比_第10张图片
两张图像的匹配图像
Harris角点检测匹配与SIFT特征匹配的对比_第11张图片

两张图片都是在尚大楼右侧,一张是远景,一张是从下往上拍的近照。
可以明显的发现有些特征匹配
Harris角点检测匹配与SIFT特征匹配的对比_第12张图片
由效果可见,哈里斯角点匹配对于集美大学中比较有特色的建筑里遇到了问题,准确度并不高!甚至说几乎大部分都是错误的!

SIFT特征点匹配

根据代码

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from PCV.localdescriptors import sift
from PCV.localdescriptors import harris

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

imname = '尚大楼40.jpg'
im = array(Image.open(imname).convert('L'))
sift.process_image(imname, 'empire.sift')
l1, d1 = sift.read_features_from_file('empire.sift')

figure()
gray()
subplot(131)
sift.plot_features(im, l1, circle=False)
title(u'SIFT特征',fontproperties=font)
subplot(132)
sift.plot_features(im, l1, circle=True)
title(u'用圆圈表示SIFT特征尺度',fontproperties=font)

# 检测harris角点
harrisim = harris.compute_harris_response(im)

subplot(133)
filtered_coords = harris.get_harris_points(harrisim, 6, 0.1)
imshow(im)
plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*')
axis('off')
title(u'Harris角点',fontproperties=font)

show()

原图
Harris角点检测匹配与SIFT特征匹配的对比_第13张图片

效果图
Harris角点检测匹配与SIFT特征匹配的对比_第14张图片
接下来是SIFT匹配

from PIL import Image
from pylab import *
import sys
from PCV.localdescriptors import sift


if len(sys.argv) >= 3:
  im1f, im2f = sys.argv[1], sys.argv[2]
else:
#  im1f = '../data/sf_view1.jpg'
#  im2f = '../data/sf_view2.jpg'
  im1f = '尚大楼40.jpg'
  im2f = '尚大楼41.jpg'
#  im1f = '../data/climbing_1_small.jpg'
#  im2f = '../data/climbing_2_small.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(d1, d2)
matches = sift.match_twosided(d1, d2)
print ('{} matches'.format(len(matches.nonzero()[0])))

figure()
gray()

sift.plot_matches(im1, im2, l1, l2, matches, show_below=True)
show()

原图
Harris角点检测匹配与SIFT特征匹配的对比_第15张图片
找特征点:

匹配特征点
Harris角点检测匹配与SIFT特征匹配的对比_第16张图片
在这里可以发现,sift匹配也有错误,可能是由于对称,加上由于sift具有旋转不变特征,所以匹配的都是对称的点,或者有些是相似度极高的点。
这里我们可以发现,其实集美大学尚大楼这种比较有特色的建筑会给sift带来一些困难。但是不耽误它强大的匹配功能。虽说这几张图片效果不好。
但是我们可以看看下面两张图片。

原图
Harris角点检测匹配与SIFT特征匹配的对比_第17张图片
效果图
Harris角点检测匹配与SIFT特征匹配的对比_第18张图片
总共209个匹配点。几乎没有匹配错的情况出现。

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