Harris角点检测

目录

1.基本思想

2.不同类型的角点

3.数学表达

4.优化推导

5.代码实现

6.第一组场景结果截图与分析

7.第二组场景结果截图与分析

8.第三组场景结果截图与分析

10.在图像间寻找对应点

11.实验总结


1.基本思想

为了判断图像的角点,可以利用卷积窗口滑动的思想,让以该点为中心的窗口在附近滑动。如下图是所有描述角点文章的初始图例,它表征的正是这一特性:当滑动窗口在所有方向移动时,窗口内的像素灰度出现了较大的变化,就可能是角点。

2.不同类型的角点

3.数学表达

4.优化推导

5.代码实现

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

"""
Example of detecting Harris corner points (Figure 2-1 in the book).
"""
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"C:\windows\fonts\SimSun.ttc", size=14)


# 读入图像
im = array(Image.open('D:\JMU\computer_vision\experience2\scene1.jpg').convert('L'))

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

# Harris响应函数
harrisim1 = 255 - harrisim

gray()

#画出Harris响应图
subplot(221)
title(u'Harris响应图',fontproperties=font)
imshow(harrisim1)
print harrisim1.shape
print harrisim
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(2, 2, 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()

6.第一组场景结果截图与分析

注:以下图使用的均为 Harris 角点检测器检测角点:每个图的第一幅为 Harris 响应函数;二、三、四分别为使用阈值0.01、0.05 和 0.1 检测出的角点

(1)第一组场景第一幅图

 
该图片的最佳 Harris 点为
 
 
(2)第一组场景第二幅图:
该图片的最佳 Harris 点为
 
(3)第一组场景第三幅图:
该图片的最佳 Harris 点为
 
(4)第一组场景第四幅图:
 
该图片的最佳 Harris 点为
 
 
(5)第一组场景第五幅图:
该图片的最佳 Harris 点为
 
(6)第一组场景结果分析
根据以上实验结果可知,其他条件不变的情况下,当使用的阈值越大,检测出来的角点越少。由上图也可知,垂直或水平边缘多的图片它所拥有的角点也比较多,比较密集。

7.第二组场景结果截图与分析

注:以下图使用的均为 Harris 角点检测器检测角点:每个图的第一幅为 Harris 响应函数;二、三、四分别为使用阈值0.01、0.05 和 0.1 检测出的角点

(1)第二组场景第一幅图:
该图片的最佳 Harris 点为
 
(2)第二组场景第二幅图:
 
该图片的最佳 Harris 点为
 
(3)第二组场景第三幅图:
该图片的最佳 Harris 点为
 
(4)第二组场景第四幅图:
该图片的最佳 Harris 点为
 
(5)第二组场景第五幅图:
该图片的最佳 Harris 点为
(6)第二组场景结果分析
由上图可知,当图片处于远处拍摄时,角点相对较多;当处于近处拍摄时,角点相对较少。近处拍摄到的东西较少,远处的较多,因此远处更易于检测出角点,且距离的远近对检测角点有影响。
 

8.第三组场景结果截图与分析

注:以下图使用的均为 Harris 角点检测器检测角点:每个图的第一幅为 Harris 响应函数;二、三、四分别为使用阈值0.01、0.05 和 0.1 检测出的角点

(1)第三组场景第一幅图:
该图片的最佳 Harris 点为
 
(2)第三组场景第二幅图:
 
该图片的最佳 Harris 点为
 
(3)第三组场景第三幅图:
该图片的最佳 Harris 点为
 
(4)第三组场景第四幅图:
该图片的最佳 Harris 点为
 
(5)第三组场景第五幅图:
该图片的最佳 Harris 点为
(6)第三组场景结果分析
由上图可知,当图片处于不同的亮度情况下拍出来的照片,所检测出来的角点也相对不同。当处于自然光照亮的情况下,亮度越大,角点也越多。
 

10.在图像间寻找对应点

(1)Harris角点检测器可以给出图像中检测到兴趣点,但它并没有提供在图像间对兴趣点进行比较的方法,我们需要在每个角点添加描述子,以及对这些描述子进行比较。

(2)代码

 # -*- 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("D:\JMU\computer_vision\experience2\scene2.jpg").convert("L"))
im2 = array(Image.open("D:\JMU\computer_vision\experience2\scene3.jpg").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()

(3)结果截图

 

 

结果分析:

由上图可知,该算法的结果存在一些不正确匹配。上图反映出角点检测不具有尺度不变性和旋转不变性,而算法中像素块的大小也会影响对应匹配的结果。

11.实验总结

通过本次实验,使我对Harris角点的检测有了更深一步的了解,对于图片的处理也有了更深一步的了解。当然,在实验时也发现了自己的不足之处,对代码的了解并不是很深,因此花了很多的时间来研究代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值